ibatis中#和$符號的區別
batis中#和$符號的區別
在我們使用ibatis過程中,寫sqlmap配置檔案時經常會用到兩個特殊的傳值符號#和$符合,下面根據個人的分析總結,兩者的區別。
1. 資料型別匹配
#:會進行預編譯,而且進行型別匹配;
$:不進行資料型別匹配。
如:
變數name的型別是string, 值是"張三"的時候
$name$ = 張三
#name# = '張三'
那麼使用$就會報錯,若要使用$的話,需要修改為’$name$’;
2. 實現方式
$ 的作用實際上是字串拼接,
select * from users where name= $name$
等效於
StringBuffer sb = newStringBuffer(256);
sb.append("select * from userswhere name=").append(name);
sb.toString();
#用於變數替換
select * from users where name = #name#
等效於
prepareStement=stmt.createPrepareStement("select * from users where name = ?")
prepareStement.setString(1,'張三');
3. #和$使用場景
(1)變數的傳遞, 必須使用#,防止sql注入;# 是用prepareStement,提示效率。
#方式一般用於傳入新增/修改的值或查詢/刪除的where條件
(2) $只是簡單的字元拼接而已,對於非變數部分, 那隻能使用$, 實際上, 在很多場合,$也是有很多實際意義的
$方式一般用於傳入資料庫物件.例如傳入表名.
例如:
select * from $tableName$ 對於不同的表執行統一的查詢
update $tableName$ set name = #name# 每個實體一張表,改變不用實體的狀態
特別說明, $只是字串拼接,所以要特別小心sql注入問題。
(3)能同時使用#和$的時候,最好用#。