做業(yè)務時醇坝,有時候會遇到不同SQL語句之中,只有使用的表名不用而已,其他參數(shù)和取得值都是一樣的情況惦蚊。這種時候必然想到把表名當做一個變量傳到共通的SQL語句中。
當然正常的傳入?yún)?shù)的方式#{param}
肯定是不行的讯嫂。介紹具體的寫法之前蹦锋,簡單回顧一下Mybatis中#{}
和${}
的區(qū)別。
#{}
#
將傳入的數(shù)據(jù)都當成一個字符串欧芽,會對自動傳入的數(shù)據(jù)加一個雙引號莉掂。
如:WHERE SID = #{sid},如果傳入的值是s01千扔,那么解析成SQL時的值為WHERE SID = "s01"憎妙。
#
可以防止防止sql注入。
${}
$
將傳入的數(shù)據(jù)直接顯示生成在sql中曲楚。
如:ORDER BY ${sage}厘唾,如果傳入的值是age,那么解析成SQL時的值為ORDER BY age龙誊。
$
方式一般用于傳入數(shù)據(jù)庫對象抚垃,例如傳入表名,字段名趟大。
通過上面就可以知道傳入普通參數(shù)時使用#{}鹤树,當傳入表名時,需要使用$()逊朽。
但是在這塊還有一個問題就是罕伯,通過Dao層傳入?yún)?shù)時,不能使用Map集合的方式進行賦值叽讳。如下面的SQL中捣炬,需要傳入兩個參數(shù)
SELECT COUNT(*)
FROM ${tableId}
WHERE S_NO = #{sNo}
Dao層的寫法參數(shù)就不能是Map集合或者兩個String參數(shù),這時需要@Param
注解的方法來聲明參數(shù)绽榛。
@Param注解的作用是聲明參數(shù)時湿酸,如果使用 #{} 或 ${} 的方式都可以。
不使用@Param注解來聲明參數(shù)時灭美,必須使用使用 #{}方式推溃,如果使用${} 的方式,會報錯届腐。
所以Dao層的寫法應該如下:
public int getCnt(@Param("tableId") String tableId,@Param("sNo") String sNo) throws Exception;