今天遇到一個比較特殊的業務,需要對傳入的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值,模擬數據
1
2
3
4
5
6
7
8
|
//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注解
1
2
|
//service直接調用dao int getByMap( @param ( "paramsMap" ) Map<String,Object> map) |
1.2 映射文件XML
(1)循環KEY值寫法:
1
2
3
|
< foreach collection = "paramsMap.keys" item = "k" separator = "and" > ${k} = #{k} </ foreach > |
(2)循環VAVLUE值寫法
1
2
3
|
< foreach collection = "paramsMap.values" item = "v" separator = "and" > ${v} = #{v} </ foreach > |
其實本質就是使用的Map.Entiy對象中的屬性,自己回顧一下Java中對Map的遍歷方式有幾種
1.3 KEY獲取VALUE
1
2
3
4
5
|
< foreach collection = "paramsMap.keys" item = "k" separator = "and" > < if test = "null != paramsMap[k]" > ${k} = ${paramsMap[k]} </ if > </ foreach > |
==注意:這里使用的$來獲取數據,絕大部分情況下我們個人不推薦使用$符號==
個人推薦方式:一次循環得到key和value值,這里使用#和$都是可以的
1
2
3
|
< foreach collection = "paramsMap" index = "key" item = "value" > #{key} = #{value} </ foreach > |
==回顧:#和$的區別,應該還記得吧!==
1.4 表達式書寫錯誤
通常我們設置值的時候,會以#{}的方式,而不是${},如下:==錯誤寫法==
1
2
3
4
5
|
< foreach collection = "paramsMap.keys" item = "k" separator = "," > < if test = "null != paramsMap[k]" > ${k} = #{paramsMap[k]} </ if > </ foreach > |
這樣書寫,取不了值了,${condition[k]} 能取的出值,但#{condition[k]} 取出來的值卻實null,正確的寫法應該是:
1
2
3
4
5
|
< 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如下:
1
2
3
4
5
6
7
|
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
1
2
3
4
5
6
7
8
9
10
11
12
|
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的形式
1
2
3
4
5
6
7
8
9
|
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)第二種寫法:個人喜歡的方式
1
2
3
4
5
6
7
8
9
|
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內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.im/post/6875123639537106957