ibatis中關於iterate和『$』與『#』的應用
乙個包含list元素的hashmap引數賦給sqlmap
public int getcountbyid(string id, string title, list ids) throws exception
上面的ids元素是乙個list,裡面包含了乙個id列表。id和title都是string。
select *
from mytable
id=#id#
title like '%$title$%'
ids in
#ids#
order by time desc
在上面的sqlmap中要注意的地方有兩個。
第乙個地方是,標籤中一定要記得寫property="ids",不要因為在上面的
標籤中判斷了該屬性,就在這個標籤中忽略了property的書寫(如果你忘了
寫iterate中的property屬性的話系統會報這樣的錯誤cause:com.ibatis.sqlmap.client.sqlmapexception: parameterobject or
property was not a collection, array or iterator.),並且要記住,
#ids# 中的『』符號,只有這樣ibatis才把ids作為乙個可迭代的物件(list,陣列...),不然的話ibatis會把ids作為普通的string來處理。
第二個地方就是,上面的關於『$『與『#』的應用。
下面就來說說關於『$『與『#』的應用。在通常情況下ibatis的引數在sqlmap中使用#param#的形式,引數名以』#『包著,但當使用
sql的like語句時就發生了問題,在單引號中無法使用#param#這種形式。解決辦法有:
1.當應用select * from table1 where col like 』value%』時,如果要把『value』以引數代替,可以把整個like後面的字串
全改為引數。即:select * from table1 where col like #param# ,此時引數param的值為字串"value%"
2.使用『$』將引數名包起來。例如:name like 『%#name#%』。我們的解決方法有2。(a)把name like 『%#name#%』的#換成$,即:name like 『%$name$%』。(b)用||連線字串的方式,寫成,name like 『%』|| #name#『%』。
3.當使用order by $column_name$,不要使用#column_name#。因為$不會轉義,是什麼就說什麼,#會轉成字串'column_name'。
4.#{}是以預編譯的形式,是安全的,它將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號,將引數設定到sql語句中,使用preparedstatement防止sql注入。而${}是未經過預編譯的,直接取出的值,直接拼裝在sql語句中,存在sql注入的危險,會有安全問題;
5.使用${}的情況,order by、like語句只能用${} 了,用#{}會多個』 』導致sql語句失效。此外動態拼接sql,模糊查詢時也要用${}。
本文**:
Ibatis中iterate的使用
ibaits中iterate標籤包含關鍵字如下 select from testtable type type 使用測試例子的sql select from testtable where type 1 and id in 1,2,3,4 prepend 拼接sql前使用的字元 比如 and ope...
ibatis中 CDATA 使用解釋
ibatis中什麼時候需要用到 經過反覆的實驗證實,假如在ibatis中自己的sql中包含 需要用號一樣。符號ibatis中一般不出現,除非很特殊就是寫死要查某個值裡含有這個 單引號我試了,沒有影響 類似如下sql配置是沒有題目的 引號我也試了,同樣沒有題目 類似如下 看了ibaits的dtd文件,...
ibatis 中 與 的區別
在ibatis中我們使用sqlmap進行sql查詢時需要引用引數,在引數引用中遇到的符號 和 之間的區分為,可以進行與編譯,進行型別匹配,而 不進行資料型別匹配,例如 select from table where id id 其中如果欄位id為字元型,那麼 id 表示的就是 id 型別,如果id為...