Mybatis之#{}與${}的區(qū)別使用詳解
1.兩種取值方式的差異
mapper.xml映射文件
<select id="selectEmployeeByCondition2" resultMap="empResultMap" databaseId="mysql">
select * from t_emp WHERE emp_id=${id} and emp_name=#{name}
</select>
java查詢代碼 params 為 id=1 ,name=”小紅”
@Test
public void testSelect() {
InputStream resourceAsStream = ConfigTest.class.getResourceAsStream("../classes/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeMapper mapper2 = sqlSession.getMapper(EmployeeMapper.class);
Employee employee2 = mapper2.selectEmployeeByCondition2(1,"xiaohong");
System.out.println(employee2);
}
結(jié)果
==> Preparing: select * from t_emp WHERE emp_id=1 and emp_name=?
==> Parameters: xiaohong(String)
<== Columns: emp_id, emp_name, emp_email, emp_tel, emp_dep, emp_status
<== Row: 1, xiaohong , 123@qq.com, 123, 1, 0
<== Total: 112345
1.1 #{}
從上述代碼可以看出 #{} 在原生jdbc語句中會(huì)用 ?占位符來表示。這樣做可以防止sql注入
1.2${}
從上述代碼可以看出 ${} 是直接把param 拼到原生sql上
2.什么時(shí)候該使用什么方式
從上述示例可以看出 #{} 與${}的作用都是取值,同時(shí)#{}還可以防止sql注入更安全。是否表示在以后代碼中就用#{}呢? 當(dāng)然不是這樣的,比如某電商系統(tǒng)的訂單表數(shù)據(jù)量太龐大,不得以分表來保存數(shù)據(jù)。該電商的工程師最后決定將該表按年月進(jìn)行分表(t_order_201701,t_order_201702…)。這個(gè)時(shí)候我們?cè)摬捎媚莻€(gè)中方式進(jìn)行查詢呢,如我要查詢17年6月份的全部訂單?
你可能想當(dāng)然的認(rèn)為這個(gè)容易,只要把年月動(dòng)態(tài)傳入到sql中就可以了如下:
<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
select * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
</select>123
結(jié)果
==> Preparing: select * from from t_order_? WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Integer)12
很顯然該語句是執(zhí)行不了的,此時(shí)就要采用${}
<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
select * from t_order_${createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
</select>
拼裝的原生jdbcsql
==> Preparing: select * from from t_order_201706 WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Long)12
很顯然這條sql可以執(zhí)行。
3.總結(jié)
動(dòng)態(tài) sql 是 mybatis 的主要特性之一,在 mapper 中定義的參數(shù)傳到 xml 中之后,在查詢之前 mybatis 會(huì)對(duì)其進(jìn)行動(dòng)態(tài)解析。mybatis 為我們提供了兩種支持動(dòng)態(tài) sql 的語法:#{} 以及 ${} 。
1、#相當(dāng)于對(duì)數(shù)據(jù) 加上 雙引號(hào),$相當(dāng)于直接顯示數(shù)據(jù)。
2、#{} : 根據(jù)參數(shù)的類型進(jìn)行處理,比如傳入String類型,則會(huì)為參數(shù)加上雙引號(hào)。#{} 傳參在進(jìn)行SQL預(yù)編譯時(shí),會(huì)把參數(shù)部分用一個(gè)占位符 ? 代替,這樣可以防止 SQL注入。
3、${} : 將參數(shù)取出不做任何處理,直接放入語句中,就是簡單的字符串替換,并且該參數(shù)會(huì)參加SQL的預(yù)編譯,需要手動(dòng)過濾參數(shù)防止 SQL注入。
4、因此 mybatis 中優(yōu)先使用 #{};當(dāng)需要?jiǎng)討B(tài)傳入 表名或列名時(shí),再考慮使用 ${} , 比較特殊,他的應(yīng)用場(chǎng)景是需要?jiǎng)討B(tài)傳入表名或列名時(shí)使用,mybatis 排序時(shí)使用orderby動(dòng)態(tài)參數(shù)時(shí)需要注意,用$而不是#
到此這篇關(guān)于Mybatis之#{}與${}的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Mybatis #{}與${}內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解
- mybatis中${}和#{}的區(qū)別以及底層原理分析
- MyBatis #{}和${} |與數(shù)據(jù)庫連接池使用詳解
- MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理方案
- Mybatis關(guān)于動(dòng)態(tài)排序 #{} ${}問題
- mybatis中#{}和${}的區(qū)別詳解
- MyBatis中#{}和${}有哪些區(qū)別
- mybatis中${}和#{}取值的區(qū)別分析
- MyBatis中#{}占位符與${}拼接符的用法說明
- 詳解Mybatis中的 ${} 和 #{}區(qū)別與用法
- Mybatis中#{}與${}的區(qū)別詳解
- MyBatis中 #{} 和 ${} 的區(qū)別小結(jié)
相關(guān)文章
深入理解Java中的HashMap的實(shí)現(xiàn)機(jī)制
這篇文章主要介紹了深入理解Java中的HashMap的實(shí)現(xiàn)機(jī)制,同時(shí)也有助于理解Java中對(duì)于哈希函數(shù)的相關(guān)處理方式,需要的朋友可以參考下2015-07-07
IntelliJ IDEA maven 構(gòu)建簡單springmvc項(xiàng)目(圖文教程)
在工作當(dāng)中,我們有時(shí)需要?jiǎng)?chuàng)建一個(gè)全新的工程,而基于spring-mvc web的工程較為常見,這篇文章主要介紹了IntelliJ IDEA maven 構(gòu)建簡單springmvc項(xiàng)目(圖文教程),感興趣的小伙伴們可以參考一下2018-05-05
springmvc+shiro+maven 實(shí)現(xiàn)登錄認(rèn)證與權(quán)限授權(quán)管理
Shiro 是一個(gè) Apache 下的一開源項(xiàng)目項(xiàng)目,旨在簡化身份驗(yàn)證和授權(quán),下面通過實(shí)例代碼給大家分享springmvc+shiro+maven 實(shí)現(xiàn)登錄認(rèn)證與權(quán)限授權(quán)管理,感興趣的朋友一起看看吧2017-09-09
Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列
這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列,工作中遇到項(xiàng)目使用Disruptor做消息隊(duì)列,對(duì)你沒看錯(cuò),不是Kafka,也不是rabbitmq。Disruptor有個(gè)最大的優(yōu)點(diǎn)就是快,還有一點(diǎn)它是開源的哦,下面做個(gè)簡單的記錄2022-06-06

