1. 程式人生 > >MyBatis中引用變量符號$與#的區別解析

MyBatis中引用變量符號$與#的區別解析

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中引用變量符號$與#的區別解析