淺談MyBatis循環(huán)Map(高級用法)
今天遇到一個比較特殊的業(yè)務(wù),需要對傳入的Map數(shù)據(jù)在映射文件中進(jìn)行遍歷,在之前的學(xué)習(xí)中,我們也知道MyBatis有默認(rèn)對集合的操作list和array,但是沒有默認(rèn)的map,所有不能直接寫collection="map",如果這么處理,它會當(dāng)成是根據(jù)map.get("map")獲取傳遞value只,==大部分情況下是一個map中是不會有“map”這個key的,于是就是報錯==。如果你想用map標(biāo)識來獲取參數(shù)map,就需要保證傳入的Map參數(shù)有@Param("map")注解。
1.Mybatis入?yún)ap的使用
1.1 傳遞Map數(shù)據(jù)
第一種:自己封裝傳遞Map中的KEY值,模擬數(shù)據(jù)
//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直接調(diào)用dao int getByMap(@param("paramsMap") Map<String,Object> map)
1.2 映射文件XML
(1)循環(huán)KEY值寫法:
<foreach collection="paramsMap.keys" item="k" separator="and"> ${k} = #{k} </foreach>
(2)循環(huán)VAVLUE值寫法
<foreach collection="paramsMap.values" item="v" separator="and"> ${v} = #{v} </foreach>
其實本質(zhì)就是使用的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>
==注意:這里使用的$來獲取數(shù)據(jù),絕大部分情況下我們個人不推薦使用$符號==
個人推薦方式:一次循環(huán)得到key和value值,這里使用#和$都是可以的
<foreach collection="paramsMap" index="key" item="value"> #{key} = #{value} </foreach>
==回顧:#和$的區(qū)別,應(yīng)該還記得吧!==
1.4 表達(dá)式書寫錯誤
通常我們設(shè)置值的時候,會以#{}的方式,而不是${},如下:==錯誤寫法==
<foreach collection="paramsMap.keys" item="k" separator=","> <if test="null != paramsMap[k]"> ${k} = #{paramsMap[k]} </if> </foreach>
這樣書寫,取不了值了,${condition[k]} 能取的出值,但#{condition[k]} 取出來的值卻實null,正確的寫法應(yīng)該是:
<foreach collection="paramsMap.keys" item="k" separator=","> <if test="null != paramsMap[k]"> ${k} = #{paramsMap[${k}]} <!-- 請注意這種寫法,我個人還是喜歡一次性獲取key和value的寫法 --> </if> </foreach>
2.Map高級用法
MyBatis嵌套循環(huán)map的高級用法:假如參數(shù)類型是這么一個類型結(jié)構(gòu): Map map = new HashMap<String,List<String>>,我想要拼裝出來的sql如下:
select * from 表名 where ( (id = 1 and name in ('悟空','唐僧','八戒') or (id = 2 and name in ('劉備','張飛','關(guān)羽') or (id = 3 and name in ('小三','王五','王八') or …… )
id對應(yīng)的是Map中KEY,而in中的數(shù)據(jù)是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("關(guān)羽"); 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>
到此這篇關(guān)于淺談MyBatis循環(huán)Map(高級用法)的文章就介紹到這了,更多相關(guān)MyBatis循環(huán)Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)
今天小編就為大家分享一篇java實現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Java分支結(jié)構(gòu)程序設(shè)計實例詳解
這篇文章主要介紹了Java分支結(jié)構(gòu)程序設(shè)計例題,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下2023-07-07springboot結(jié)合全局異常處理實現(xiàn)登錄注冊驗證
這篇文章主要介紹了springboot結(jié)合全局異常處理實現(xiàn)登錄注冊驗證,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05SpringMVC @RequestMapping注解作用詳解
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01