亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Mybatis之#{}與${}的區別使用詳解

瀏覽:47日期: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); }

結果

==> 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語句中會用 ?占位符來表示。這樣做可以防止sql注入

1.2${}

從上述代碼可以看出 ${} 是直接把param 拼到原生sql上

2.什么時候該使用什么方式

從上述示例可以看出 #{} 與${}的作用都是取值,同時#{}還可以防止sql注入更安全。是否表示在以后代碼中就用#{}呢? 當然不是這樣的,比如某電商系統的訂單表數據量太龐大,不得以分表來保存數據。該電商的工程師最后決定將該表按年月進行分表(t_order_201701,t_order_201702…)。這個時候我們該采用那個中方式進行查詢呢,如我要查詢17年6月份的全部訂單? 你可能想當然的認為這個容易,只要把年月動態傳入到sql中就可以了如下:

<select resultMap='orderResultMap' databaseId='mysql'> select * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,’%Y%m’)=${createYM}+’’ </select>123

結果

==> Preparing: select * from from t_order_? WHERE DATE_FORMAT(create_date,’%Y%m’)=’201706’==> Parameters: 201706(Integer)12

很顯然該語句是執行不了的,此時就要采用${}

<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可以執行。

3.總結

動態 sql 是 mybatis 的主要特性之一,在 mapper 中定義的參數傳到 xml 中之后,在查詢之前 mybatis 會對其進行動態解析。mybatis 為我們提供了兩種支持動態 sql 的語法:#{} 以及 ${} 。

1、#相當于對數據 加上 雙引號,$相當于直接顯示數據。2、#{} : 根據參數的類型進行處理,比如傳入String類型,則會為參數加上雙引號。#{} 傳參在進行SQL預編譯時,會把參數部分用一個占位符 ? 代替,這樣可以防止 SQL注入。3、${} : 將參數取出不做任何處理,直接放入語句中,就是簡單的字符串替換,并且該參數會參加SQL的預編譯,需要手動過濾參數防止 SQL注入。4、因此 mybatis 中優先使用 #{};當需要動態傳入 表名或列名時,再考慮使用 ${} , 比較特殊,他的應用場景是需要動態傳入表名或列名時使用,mybatis 排序時使用orderby動態參數時需要注意,用$而不是#

到此這篇關于Mybatis之#{}與${}的區別詳解的文章就介紹到這了,更多相關Mybatis #{}與${}內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 欧美日本俄罗斯一级毛片 | 手机看片国产免费现在观看 | 91国内在线国内在线播放 | 久久精品道一区二区三区 | 一区二区在线观看高清 | 亚洲国产激情在线一区 | a级毛片在线观看 | 第一区| 亚洲成a人片在线观看中文动漫 | 尤物蜜芽福利国产污在线观看 | 26uuu老色哥| 成人免费福利视频在线观看 | 日韩亚洲欧洲在线rrrr片 | 国产主播专区 | 一集毛片 | 国产成人精品午夜在线播放 | 日韩亚洲欧美综合一区二区三区 | 国内黄色一级片 | 爱啪网站 | 九九在线精品视频 | 国产在线色视频 | 欧美在线观看一区 | 亚洲一区二区在线 | 亚洲免费毛片 | 亚洲国产一区视频 | 国产亚洲精品自在久久77 | 中日韩欧美在线观看 | 国产一级片免费视频 | 欧美精品一区二区精品久久 | 亚洲国产精品一区二区久 | 不卡黄色| 国产一区二三区 | 久久精品视频免费播放 | 国产婷婷综合在线视频 | 久久久久免费精品国产小说 | 婷婷亚洲激情 | 国产人做人爱视频精品 | 色视频一区二区三区 | a级在线 | 91麻豆视频在线 | 看一级毛片 |