MyBatis中引用變量符號$與#的區別解析
阿新 • • 發佈:2019-01-29
clas idt 取字符串 創建 width sql查詢語句 正常 bsp myba
例子
假設我們要通過創建時間create_time查詢數據庫表product裏的具體條目
如果要查詢創建時間大於等於“2019-01-29”的條目,那麽SQL查詢語句應是:
select * from product where create_time >=“2019-01-29”,這時候返回了正確的數據
用mybatis框架查詢對應寫法如下:
@Select({ "SELECT * ", "FROM product WHERE #{key} = #{value};" }) Product selectByProductCode(@Param("key")String key, @Param("value")String value);
這邊是用MyBatis註解的方法,用XML的也是類似。
這是如果key傳的是create_time,value為“2019-01-29”,那麽應該也是可以正常返回的,結果確兩條數據都返回了。
原因是上面的這條MyBatis轉換成SQL如下:
select * from product where ‘create_time‘ >=“2019-01-29”;
和我們預想的不一樣,將取值符號由#改成$即可返回正確的結果。
@Select({ "SELECT * ","FROM product WHERE ${key} = #{value};" }) Product selectByProductCode(@Param("key")String key, @Param("value")String value);
解析
$用於取值是一般是取字符串,即直接把傳過來的變量不經過處理直接丟到SQL,比如上面的key時或者下面這種情況(模糊匹配查詢字符串的時候,這邊以前綴匹配為例)
@Select({ "SELECT * ", "FROM product WHERE ${key} like ‘${value}%‘;" }) Product selectByProductCode(@Param("key")String key, @Param("value")String value);
#一般用於取變量,比如value傳過來的類型是Long,Integer或者完整匹配的String等。會在變量前後加上單引號再丟到SQL。
MyBatis中引用變量符號$與#的區別解析