2021-05-12 14:32:11
淺談MyBatis迴圈Map(高階用法)
今天遇到一個比較特殊的業務,需要對傳入的Map資料在對映檔案中進行遍歷,在之前的學習中,我們也知道MyBatis有預設對集合的操作list和array,但是沒有預設的map,所有不能直接寫collection="map",如果這麼處理,它會當成是根據map.get("map")獲取傳遞value只,==大部分情況下是一個map中是不會有「map」這個key的,於是就是報錯==。如果你想用map標識來獲取引數map,就需要保證傳入的Map引數有@Param("map")註解。
1.Mybatis入參Map的使用
1.1 傳遞Map資料
第一種:自己封裝傳遞Map中的KEY值,模擬資料
//service: public List<UserDepte> getByMap(Map<String,List<Long>> map){ Map<String,Object> paramsMap= new HashMap<String, Object>(); params.put("paramsMap", map); return this.getByMap(paramsMap); } //dao: int getByMap(Map<String,Object> map)
第二種:個人推薦@Param註解
//service直接呼叫dao int getByMap(@param("paramsMap") Map<String,Object> map)
1.2 對映檔案XML
(1)迴圈KEY值寫法:
<foreach collection="paramsMap.keys" item="k" separator="and"> ${k} = #{k} </foreach>
(2)迴圈VAVLUE值寫法
<foreach collection="paramsMap.values" item="v" separator="and"> ${v} = #{v} </foreach>
其實本質就是使用的Map.Entiy物件中的屬性,自己回顧一下Java中對Map的遍歷方式有幾種
1.3 KEY獲取VALUE
<foreach collection="paramsMap.keys" item="k" separator="and"> <if test="null != paramsMap[k]"> ${k} = ${paramsMap[k]} </if> </foreach>
==注意:這裡使用的$來獲取資料,絕大部分情況下我們個人不推薦使用$符號==
個人推薦方式:一次迴圈得到key和value值,這裡使用#和$都是可以的
<foreach collection="paramsMap" index="key" item="value"> #{key} = #{value} </foreach>
==回顧:#和$的區別,應該還記得吧!==
1.4 表示式書寫錯誤
通常我們設定值的時候,會以#{}的方式,而不是${},如下:==錯誤寫法==
<foreach collection="paramsMap.keys" item="k" separator=","> <if test="null != paramsMap[k]"> ${k} = #{paramsMap[k]} </if> </foreach>
這樣書寫,取不了值了,${condition[k]} 能取的出值,但#{condition[k]} 取出來的值卻實null,正確的寫法應該是:
<foreach collection="paramsMap.keys" item="k" separator=","> <if test="null != paramsMap[k]"> ${k} = #{paramsMap[${k}]} <!-- 請注意這種寫法,我個人還是喜歡一次性獲取key和value的寫法 --> </if> </foreach>
2.Map高階用法
MyBatis巢狀迴圈map的高階用法:假如引數型別是這麼一個型別結構: Map map = new HashMap<String,List<String>>,我想要拼裝出來的sql如下:
select * from 表名 where ( (id = 1 and name in ('悟空','唐僧','八戒') or (id = 2 and name in ('劉備','張飛','關羽') or (id = 3 and name in ('小三','王五','王八') or …… )
id對應的是Map中KEY,而in中的資料是Map中的value
Map<String,List<String>> map = new HashMap<>(); List<String> nameList = new ArrayList<>(); nameList.add("悟空"); nameList.add("唐僧"); nameList.add("八戒"); map.put("1",nameList); nameList = new ArrayList<>(); nameList.add("劉備"); nameList.add("張飛"); nameList.add("關羽"); map.put("2",nameList);
(1)第一種寫法:就是通過KEY獲取value的形式
SELECT * FROM 表名 WHERE <foreach collection="paramsMap.keys" item="key" open="(" separator="OR" close=")"> (id = #{key} AND name in <foreach collection = "paramsMap[key]" item="name" separator="," open="(" close=")"> #{name} </foreach> ) </foreach>
(1)第二種寫法:個人喜歡的方式
SELECT * FROM 表名 WHERE <foreach collection="paramsMap" index="key" item="value" open="(" separator="OR" close=")"> (id = #{key} AND name in <foreach collection = "value" item="name" separator="," open="(" close=")"> #{name} </foreach> ) </foreach>
到此這篇關於淺談MyBatis迴圈Map(高階用法)的文章就介紹到這了,更多相關MyBatis迴圈Map內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章