福州產(chǎn)品網(wǎng)頁制作的公司電商seo與sem是什么
一、參數(shù)值的兩種方式#{}和${}
在 MyBatis 中,可以使用兩種方式來獲取參數(shù)值:#{} 和 ${}。
1. #{}:這是 MyBatis 推薦使用的方式。在 SQL 語句中使用 #{},MyBatis 會(huì)自動(dòng)將參數(shù)值進(jìn)行預(yù)編譯處理,防止 SQL 注入攻擊,并且可以處理各種類型的參數(shù)(如字符串、數(shù)字、日期等)。例如:
<select id="getUserById" resultType="User">SELECT * FROM user WHERE id = #{id}</select>
在這個(gè)例子中,#{id} 表示一個(gè)參數(shù)占位符,MyBatis 會(huì)將它替換為具體的參數(shù)值。?
2. ${}:這種方式會(huì)直接將參數(shù)值拼接到 SQL 語句中,不做預(yù)編譯處理。這種方式適用于在 SQL 語句中引用列名、表名等無法使用 #{} 替換的情況。但需要注意的是,使用 ${} 可能會(huì)導(dǎo)致 SQL 注入攻擊的風(fēng)險(xiǎn),因此需要謹(jǐn)慎使用。例如:
<select id="getUserByName" resultType="User">SELECT * FROM user WHERE name = '${name}'</select>
在這個(gè)例子中,#{id} 表示一個(gè)參數(shù)占位符,MyBatis 會(huì)將它替換為具體的參數(shù)值。
MyBatis獲取參數(shù)值的兩種方式:${}和#{}
${}的本質(zhì)就是字符串拼接,#{}的本質(zhì)就是占位符賦值
${}使用字符串拼接的方式拼接sql,若為字符串類型或日期類型的字段進(jìn)行賦值時(shí),需要手動(dòng)加單引號(hào);但是#{}使用占位符賦值的方式拼接sql,此時(shí)為字符串類型或日期類型的字段進(jìn)行賦值時(shí),可以自動(dòng)添加單引號(hào)
?
二、獲取參數(shù)值的各種情況
2.1? ?單個(gè)字面量類型的參數(shù)
- 若mapper接口中的方法參數(shù)為單個(gè)的字面量類型,此時(shí)可以使用${}和#{}以任意的名稱(最好見名識(shí)意)獲取參數(shù)的值,注意${}需要手動(dòng)加單引號(hào)
<!--User getUserByUsername(String username);--><select id="getUserByUsername" resultType="User">select * from t_user where username = #{username}</select>
<!--User getUserByUsername(String username);--><select id="getUserByUsername" resultType="User"> select * from t_user where username = '${username}' </select>
2.2??多個(gè)字面量類型的參數(shù)
若mapper接口中的方法參數(shù)為多個(gè)時(shí),此時(shí)MyBatis會(huì)自動(dòng)將這些參數(shù)放在一個(gè)map集合中。
①? 以arg0,arg1…為鍵,以參數(shù)為值;
②? 以param1,param2…為鍵,以參數(shù)為值;
因此只需要通過${}和#{}訪問map集合的鍵就可以獲取相對應(yīng)的值,注意${}需要手動(dòng)加單引號(hào)。
使用arg或者param都行,要注意的是,arg是從arg0開始的,param是從param1開始的
<!--User checkLogin(String username,String password);--><select id="checkLogin" resultType="User"> select * from t_user where username = #{arg0} and password = #{arg1} </select>
<!--User checkLogin(String username,String password);--><select id="checkLogin" resultType="User">select * from t_user where username = '${param1}' and password = '${param2}'</select>
2.3??map集合類型的參數(shù)
- 若mapper接口中的方法需要的參數(shù)為多個(gè)時(shí),此時(shí)可以手動(dòng)創(chuàng)建map集合,將這些數(shù)據(jù)放在map中只需要通過${}和#{}訪問map集合的鍵就可以獲取相對應(yīng)的值,注意${}需要手動(dòng)加單引號(hào)
<!--User checkLoginByMap(Map<String,Object> map);--><select id="checkLoginByMap" resultType="User">select * from t_user where username = #{username} and password = #{password}</select>
@Testpublic void checkLoginByMap() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);Map<String,Object> map = new HashMap<>();map.put("usermane","admin");map.put("password","123456");User user = mapper.checkLoginByMap(map);System.out.println(user);}
2.4??實(shí)體類類型的參數(shù)
- 若mapper接口中的方法參數(shù)為實(shí)體類對象時(shí)此時(shí)可以使用${}和#{},通過訪問實(shí)體類對象中的屬性名獲取屬性值,注意${}需要手動(dòng)加單引號(hào)
<!--int insertUser(User user);--><insert id="insertUser">insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})</insert>
@Testpublic void insertUser() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);User user = new User(null,"Tom","123456",12,"男","123@321.com");mapper.insertUser(user);}
2.5??使用@Param標(biāo)識(shí)參數(shù)
可以通過@Param注解標(biāo)識(shí)mapper接口中的方法參數(shù),此時(shí),會(huì)將這些參數(shù)放在map集合中
- 以@Param注解的value屬性值為鍵,以參數(shù)為值;
- 以param1,param2…為鍵,以參數(shù)為值;
- 只需要通過${}和#{}訪問map集合的鍵就可以獲取相對應(yīng)的值,注意${}需要手動(dòng)加單引號(hào)
<!--User CheckLoginByParam(@Param("username") String username, @Param("password") String password);--><select id="CheckLoginByParam" resultType="User">select * from t_user where username = #{username} and password = #{password}</select>
@Testpublic void checkLoginByParam() {SqlSession sqlSession = SqlSessionUtils.getSqlSession();ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);mapper.CheckLoginByParam("admin","123456");}
三、總結(jié)
- 建議分成兩種情況進(jìn)行處理
- 實(shí)體類類型的參數(shù)
- 使用@Param標(biāo)識(shí)參數(shù)
四、補(bǔ)貼知識(shí)點(diǎn):以map集合接收作為返回值類型
4.1??查詢一條數(shù)據(jù)為map集合
/** * 根據(jù)用戶id查詢用戶信息為map集合 * @param id * @return */
Map<String, Object> getUserToMap(@Param("id") int id);
<!--Map<String, Object> getUserToMap(@Param("id") int id);-->
<select id="getUserToMap" resultType="map">select * from t_user where id = #{id}
</select>
<!--結(jié)果:{password=123456, sex=男, id=1, age=23, username=admin}-->
4.2??查詢多條數(shù)據(jù)為map集合
4.2.1? 方法一
/** * 查詢所有用戶信息為map集合 * @return * 將表中的數(shù)據(jù)以map集合的方式查詢,一條數(shù)據(jù)對應(yīng)一個(gè)map;若有多條數(shù)據(jù),就會(huì)產(chǎn)生多個(gè)map集合,此時(shí)可以將這些map放在一個(gè)list集合中獲取 */
List<Map<String, Object>> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map"> select * from t_user
</select>
<!--結(jié)果:[{password=123456, sex=男, id=1, age=23, username=admin},{password=123456, sex=男, id=2, age=23, username=張三},{password=123456, sex=男, id=3, age=23, username=張三}]
-->
4.2.2? 方法二
/*** 查詢所有用戶信息為map集合* @return* 將表中的數(shù)據(jù)以map集合的方式查詢,一條數(shù)據(jù)對應(yīng)一個(gè)map;若有多條數(shù)據(jù),就會(huì)產(chǎn)生多個(gè)map集合,并且最終要以一個(gè)map的方式返回?cái)?shù)據(jù),此時(shí)需要通過@MapKey注解設(shè)置map集合的鍵,值是每條數(shù)據(jù)所對應(yīng)的map集合*/
@MapKey("id")
Map<String, Object> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">select * from t_user
</select>
<!--結(jié)果:{1={password=123456, sex=男, id=1, age=23, username=admin},2={password=123456, sex=男, id=2, age=23, username=張三},3={password=123456, sex=男, id=3, age=23, username=張三}}
-->
?