久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mybatis之#{}與${}的區(qū)別使用詳解

瀏覽:54日期:2023-10-23 18:51:43

1.兩種取值方式的差異

mapper.xml映射文件

<select 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語(yǔ)句中會(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 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

很顯然該語(yǔ)句是執(zhí)行不了的,此時(shí)就要采用${}

<select 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 的語(yǔ)法:#{} 以及 ${} 。

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ù)取出不做任何處理,直接放入語(yǔ)句中,就是簡(jiǎn)單的字符串替換,并且該參數(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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
主站蜘蛛池模板: 亚洲精品国产偷自在线观看 | 九九热这里都是精品 | 久久99久久久久 | 久久久久久久久久久精 | 国产婷婷精品av在线 | 婷婷中文字幕 | 欧美在线观看禁18 | 影音先锋 色先锋 | 可以免费看黄视频的网站 | 精品国产精品 | 久久久夜夜夜 | 日日操夜夜操天天操 | 日批免费观看视频 | 中文字国产精久久无 | 亚洲午夜精品 | 在线精品日韩 | 中文字幕日韩av | 精品久久久久久亚洲精品 | 成人精品一区二区三区中文字幕 | 做a视频免费观看 | 91成人短视频在线观看 | 黄色大片网站在线观看 | 精品国产乱码久久久久久闺蜜 | 日韩成人一区二区 | 操视频网站| 欧美 日韩 在线播放 | 成人伊人 | 国产精品美女久久久久久免费 | 亚洲视频在线免费观看 | 粉嫩国产精品一区二区在线观看 | 久久久久久久久中文字幕 | 免费观看一区二区三区 | 日本videos18高清hd下 | 看亚洲a级一级毛片 | 伊人狠狠干 | 亚洲成人精品久久久 | 精品一区二区三区不卡 | 国产久| 亚洲免费网站在线观看 | 久久99国产精品久久99大师 | 在线观看第一页 |