Mybatis中表名當做變量


做業務時,有時候會遇到不同SQL語句之中,只有使用的表名不用而已,其他參數和取得值都是一樣的情況。這種時候必然想到把表名當做一個變量傳到共通的SQL語句中。

當然正常的傳入參數的方式#{param}肯定是不行的。介紹具體的寫法之前,簡單回顧一下Mybatis中#{}${}的區別。

#{}

#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。
如:WHERE SID = #{sid},如果傳入的值是s01,那么解析成SQL時的值為WHERE SID = "s01"。
#可以防止防止sql注入。

${}

$將傳入的數據直接顯示生成在sql中。
如:ORDER BY ${sage},如果傳入的值是age,那么解析成SQL時的值為ORDER BY age。
$方式一般用於傳入數據庫對象,例如傳入表名,字段名。

通過上面就可以知道傳入普通參數時使用#{},當傳入表名時,需要使用$()。
但是在這塊還有一個問題就是,通過Dao層傳入參數時,不能使用Map集合的方式進行賦值。如下面的SQL中,需要傳入兩個參數

SELECT COUNT(*)
  FROM ${tableId} 
WHERE S_NO = #{sNo}

Dao層的寫法參數就不能是Map集合或者兩個String參數,這時需要@Param 注解的方法來聲明參數。
@Param注解的作用是聲明參數時,如果使用 #{} 或 ${} 的方式都可以。
不使用@Param注解來聲明參數時,必須使用使用 #{}方式,如果使用${} 的方式,會報錯。
所以Dao層的寫法應該如下:

public int getCnt(@Param("tableId") String tableId,@Param("sNo") String sNo) throws Exception;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM