一、概述
mapper映射文件是mybatis中最重要的部分,涉及到的細節(jié)也非常多。
1.1、parameterType
表示輸入?yún)?shù)的類型。例如:
<select id="getUserById" parameterType="integer" resultType="org.star.entity.model.UserDO">
select id,username,address from `user` where id = #{id}
</select>
二、$ vs #
2.1、概述
mybatis中,當我們在xxxMapper.xml中引用變量時,默認使用的是 # ,如上所示,但是除了 # 之外,我們也可以使用 $ 來應用變量,如下所示:
<select id="getUserById" parameterType="integer" resultType="org.star.entity.model.UserDO">
?? ?select id,username,address from `user` where id = ${id}
</select>????????在舊版本的MyBatis中,如果使用$來引用一個變量,那么這個變量需要通過@Param取別名,但是在新版本的MyBatis中,無論是 $ 還是 #,如果只有一個參數(shù),可以不用取別名,如下所示:
public interface UserMapper {
? ? /**
? ? ?* 根據(jù)id查詢用戶
? ? ?* @param id
? ? ?* @return
? ? ?*/
? ? UserDO getUserById(Integer id);}
2.2、區(qū)別
2.2.1、使用 $ 打印的日志
2.2.2、使用 # 打印的日志
????????通過觀察兩者打印的日志信息,可以很明顯的看到 $引用的變量,在執(zhí)行時SQL直接拼接好了,沒有參數(shù)。而 # 引用的變量,使用了預編譯的方式。在傳統(tǒng)的jdbc調用中,sql的執(zhí)行,我們可以通過字符串拼接或者占位符的方式來解決參數(shù)傳遞問題。在mybatis中當然也支持,在mybatis中,$傳遞的參數(shù)相當于jdbc中的字符串拼接,而#則相當于jdbc中的占位符。
2.3、如何選擇
? ? ? ? 一般來說,由于參數(shù)拼接的方式存在sql注入的風險,因此日常開發(fā)中我們大多使用#的方式進行傳值,但是在一些特殊的場景下,又不得不使用這種方式。有的sql拼接實際上可以通過數(shù)據(jù)庫函數(shù)的方式來解決,例如模糊查詢,代碼如下:
<select id="getUserByUsername" parameterType="string" resultType="org.star.entity.model.UserDO">
?? ?select id,username,address from `user` where username like concat('%',#{username},'%')
</select>但是有的sql無法使用#來拼接,例如傳遞一個動態(tài)字段進來,假設我想查詢所有的數(shù)據(jù),需要排序查詢,但是排序的字段不確定,需要通過參數(shù)傳入,這種場景下就只能使用$來解決了,例如有如下方法文章來源:http://www.zghlxwxcb.cn/news/detail-740502.html
List<UserDO> listAllUser(String search);文章來源地址http://www.zghlxwxcb.cn/news/detail-740502.html
到了這里,關于系列五、映射文件xxxMapper.xml的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!