mybatis 中對foreach的使用心得

Mybatyis foreache 標簽

在Mybatis的xml配置中使用集合,主要是用到了foreach動態(tài)語句花吟。
foreach的參數(shù):
foreach元素的屬性主要有 item壳澳,index犀呼,collection抡驼,open争占,separator砰盐,close闷袒。
item表示集合中每一個元素進行迭代時的別名.
index指 定一個名字,用于表示在迭代過程中楞卡,每次迭代到的位置(不知道具體的用處).
open表示該語句以什么開始霜运,separator表示在每次進行迭代之間以什么符號作為分隔 符.
close表示以什么結束

問題:

在使用mybatis中使用 foreach 出現(xiàn)如下問題

org.apache.ibatis.reflection.ReflectionException:There is no getter for property named '__frch_item_0' in 'TestEntity' 

foreach 代碼如下:

<foreach collection="companys" index="index" item="item" open=" (" close=") " separator=",">
    #{item}
</foreach>

問題分析:
這邊使用了一個第三方分頁插件

 com.github.miemiedev.mybatis.paginator.domain.PageBounds;
 查詢一:this.getSqlSession().selectList(toMybatisStatement("selectByConditions"), params, bounds);
 查詢二:this.getSqlSession().selectList(toMybatisStatement("selectByConditions"), params);

使用第一種帶第三方分頁插件查詢 報錯:

org.apache.ibatis.reflection.ReflectionException:There is no getter for property named '__frch_item_0' in 'TestEntity' 

使用第二種方式查詢 能夠正常使用。

解決方案

如果想要使用第一種查詢方式時 可以使用一下兩種解決方法:

解決方案1:parameterType 參數(shù)類型將 TestEntity 修改成 map 
解決方案2:將 #{item} 修改成 ${item} 如果是字符串則修改成 '${item}' 

mybatis 中 #{}與${}的區(qū)別

默認情況下,使用#{}語法,MyBatis會產生PreparedStatement語句中蒋腮,并且安全的設置PreparedStatement參數(shù)淘捡,這個過程中MyBatis會進行必要的安全檢查和轉義。
示例1:

執(zhí)行SQL:Select * from company where id = #{id}
參數(shù):id =>10
解析后執(zhí)行的SQL:Select * from emp where id= 池摧?
執(zhí)行SQL:Select * from company  where id= ${id }
參數(shù):id 傳入值為:10
解析后執(zhí)行的SQL:Select * from company where id=10
使用foreach循環(huán)的時候  companys 這邊傳入的是string 數(shù)組 
使用foreach循環(huán)時 默認會 將item 轉成 __frch_item_0 ... 
1.我們使用#{} 獲取參數(shù) 則變成 __frch_item_0=>10...  Select * from emp where id in(?,?,?)
2.我們使用${} 獲取參數(shù) 則變成 10 傳入數(shù)據(jù)中 ..  Select * from emp where id in(10,20,30) 則可以直接使用

所以在使用分頁查詢的時候使用第二種解決方案是可行的焦除。那是什么原因導致了使用#{}這種獲取參數(shù)數(shù)據(jù)的方式會錯,而當使用map作為參數(shù)時#{}又是可用的作彤。
分析數(shù)據(jù):在使用#{}獲取參數(shù)時膘魄,mybatis會將獲取到的數(shù)據(jù)存入一個map中乌逐,
例如:

{id="10",param1 = "test",_fors_item_0=591,_fors_item_1=592 } 

其中 低于param1為正常獲取 數(shù)據(jù),_fors_item_0创葡,_fors_item_1為循環(huán)時獲取的數(shù)據(jù)浙踢,
同時在map還會有其他的參數(shù),其中包括 傳入類型 parameterType所帶入的對象(TestEntity)灿渴。

可能性分析解析:

使用PageBounds 的時候會將mybaits 的數(shù)據(jù)嵌入在PageBounds里面洛波,
個人分析在PageBounds 回填參數(shù)的時候做了類型的判斷,
判斷傳入的parameterType是否是map類型骚露,如果是則從map中獲取數(shù)據(jù)蹬挤,如果不是則將map映射成TestEntity實體,然而在實體中不存在_fors_item_0屬性棘幸,所以就提示錯誤:
org.apache.ibatis.reflection.ReflectionException:There is no getter for property named '__frch_item_0' in 'TestEntity'

總結 :
使用${}方式會引發(fā)SQL注入的問題焰扳、同時也會影響SQL語句的預編譯,所以從安全性和性能的角度出發(fā)误续,能使用#{}的情況下就不要使用${}吨悍,

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市女嘲,隨后出現(xiàn)的幾起案子畜份,更是在濱河造成了極大的恐慌,老刑警劉巖欣尼,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆雹,死亡現(xiàn)場離奇詭異,居然都是意外死亡愕鼓,警方通過查閱死者的電腦和手機钙态,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菇晃,“玉大人册倒,你說我怎么就攤上這事』撬停” “怎么了驻子?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長估灿。 經(jīng)常有香客問我崇呵,道長,這世上最難降的妖魔是什么馅袁? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任域慷,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘犹褒。我一直安慰自己抵窒,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布叠骑。 她就那樣靜靜地躺著李皇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪座云。 梳的紋絲不亂的頭發(fā)上疙赠,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音朦拖,去河邊找鬼。 笑死厌衔,一個胖子當著我的面吹牛璧帝,可吹牛的內容都是我干的。 我是一名探鬼主播富寿,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼睬隶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了页徐?” 一聲冷哼從身側響起苏潜,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎变勇,沒想到半個月后恤左,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡搀绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年飞袋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链患。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巧鸭,死狀恐怖,靈堂內的尸體忽然破棺而出麻捻,到底是詐尸還是另有隱情纲仍,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布贸毕,位于F島的核電站郑叠,受9級特大地震影響,放射性物質發(fā)生泄漏崖咨。R本人自食惡果不足惜锻拘,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧署拟,春花似錦婉宰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馒铃,卻和暖如春蟹腾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背区宇。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工娃殖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人议谷。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓炉爆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卧晓。 傳聞我的和親對象是個殘疾皇子芬首,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL逼裆、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,520評論 0 4
  • 官方文檔 簡介 入門 XML配置 XML映射文件 動態(tài)SQL Java API SQL語句構建器 日志 一郁稍、 JD...
    拾壹北閱讀 3,544評論 0 52
  • Mybatis相關 1.Mybatis是什么? 2.為什么選擇Mybatis? 3、#{}和${}的區(qū)別是什么胜宇? ...
    zhihaoZzz閱讀 1,282評論 0 2
  • 哎呀呀耀怜,我喜歡上杜十三的時候還是嫩的能掐出水的年紀呢!小蔥一樣的姑娘掸屡,人見人愛封寞。 二十一歲的顧十二恬不...
    西門喜大官人閱讀 246評論 0 0
  • 凈月如鏡人心渡,千里長白一脈牽仅财。
    王少伯丶閱讀 271評論 0 0