日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.兩種取值方式的差異

mapper.xml映射文件

select * from t_emp WHERE emp_id=${id} and emp_name=#{name}

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 * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''

123

結果

==>? Preparing: select * from from t_order_? WHERE DATE_FORMAT(create_date,'%Y%m')='201706'

==> Parameters: 201706(Integer)12

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

select * from t_order_${createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''

拼裝的原生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 #{}與${}內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

總結

以上是生活随笔為你收集整理的java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。