mybatis嵌套循環(huán)map方式(高級(jí)用法)
mybatis嵌套循環(huán)map
mybatis有默認(rèn)的list,array,但是沒有默認(rèn)的map。所以不能直接寫collection="map",如果這么寫,它會(huì)當(dāng)成是根據(jù)map.get(“map”)來取value值,大部分情況下是一個(gè)map中是不會(huì)有“map”這個(gè)key的,于是就是報(bào)錯(cuò)。
如果你想用這個(gè)“map”標(biāo)識(shí)取參數(shù)map,就需要保證傳入的Map參數(shù)有@Param("map")注解。
mybatis入?yún)ap的基本語法
service,dao的寫法:
//service: public List<BpmDefUser> 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)
或者(推薦):
//service直接調(diào)用dao int getByMap(@param("paramsMap") Map<String,Object> map)
xml的寫法:
循環(huán)key:
? ? <foreach collection="paramsMap.keys" item="k" separator="and"> ?? ? ? ? ? ${k} = #{k} ? ? ? ? </foreach> ??
循環(huán)values
<foreach collection="paramsMap.values" item="v" separator="and"> ?? ? ? ${v} = #{v} ? ? </foreach> ?
循環(huán)獲取key和值:
<foreach collection="paramsMap.keys" item="k" separator="and"> ?? ? ? <if test="null != paramsMap[k]"> ? ? ? ? ? ? ${k} = ${paramsMap[k]} ? ? ? ? </if> ? </foreach> ??
或者一次循環(huán)得到key和value值(推薦):
<foreach collection="paramsMap" index="key" ?item="value"> ? ? ? ? ?${key} = ${value} </foreach>
易錯(cuò)點(diǎn):表達(dá)式抒寫錯(cuò)誤
通常我們?cè)O(shè)置值的時(shí)候,會(huì)以#{}的方式,而不是${},如下:
<foreach collection="paramsMap.keys" item="k" separator=","> ?? ? ? <if test="null != paramsMap[k]"> ? ? ? ? ? ? ${k} = #{paramsMap[k]} ? ? ? ? </if> ? </foreach> ??
你會(huì)發(fā)現(xiàn),取不了值了,${condition[k]} 能取的出值,但#{condition[k]} 取出來的值卻實(shí)null,正確的寫法應(yīng)該是:
<foreach collection="paramsMap.keys" item="k" separator=","> ?? ? ? <if test="null != paramsMap[k]"> ? ? ? ? ? ? ${k} = #{paramsMap[${k}]} ? ? ? </if> ? </foreach> ??
mybatis嵌套循環(huán)map的高級(jí)用法
假如參數(shù)類型是這么一個(gè)類型結(jié)構(gòu): Map map = new HashMap<String,HashSet<String>>,我想要拼裝出來的sql如下:
select * from 表名 where ( ? ? (id = 1 and name in ('小二','小三','小四') or ? ? (id = 2 and name in ('小二','小三','趙六') or ? ? (id = 3 and name in ('小三','王五','王八') or ? ? …… )
mybatis應(yīng)該怎么寫?
第一種寫法:
?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>
第二種寫法(推薦):
?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中循環(huán)map集合操作
首先聲明一個(gè)MAP集合,用來存放數(shù)據(jù):如下圖:聲明map集合pd,將數(shù)據(jù)put到pd中,然后在聲明一個(gè)map集合params,將pd幾個(gè)放入params集合中,將params作為參數(shù),參入xml配置文件中:
在xml中:
傳入到xml文件中的集合params里,鍵值為relationMap對(duì)應(yīng)著另一個(gè)map幾個(gè)pd,所以在<foreach>標(biāo)簽中collection為relationMap,index為map的key,item為map的value;#{key},#{value}即可取到pd這個(gè)map集合中的鍵值。
至于${key},由于我寫的是個(gè)插入語句,key值作為字段,value作為值,#{key}取出來的為字符串,而oracle數(shù)據(jù)庫表明字段不能為字符串,用${key}取出即可;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot bean掃描路徑的實(shí)現(xiàn)
這篇文章主要介紹了springboot bean掃描路徑的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01EasyUi+Spring Data 實(shí)現(xiàn)按條件分頁查詢的實(shí)例代碼
這篇文章主要介紹了EasyUi+Spring Data 實(shí)現(xiàn)按條件分頁查詢的實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-07-07布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用
布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)(probabilistic data structure),特點(diǎn)是高效地插入和查詢,這篇文章主要給大家介紹了關(guān)于布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用,需要的朋友可以參考下2023-12-12Mybatis結(jié)果生成鍵值對(duì)的實(shí)例代碼
這篇文章主要介紹了Mybatis結(jié)果生成鍵值對(duì)的實(shí)例代碼,以及MyBatis返回Map鍵值對(duì)數(shù)據(jù)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-02-02springmvc無法訪問/WEB-INF/views下的jsp的解決方法
本篇文章主要介紹了springmvc無法訪問/WEB-INF/views下的jsp的解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10Java 8 中 Map 騷操作之 merge() 的使用方法
本文簡(jiǎn)單介紹了一下Map.merge()的方法,除此之外,Java 8 中的HashMap實(shí)現(xiàn)方法使用了TreeNode和 紅黑樹,原理很相似,今天通過本文給大家介紹Java 8 中 Map 騷操作之 merge() 的用法 ,需要的朋友參考下吧2021-07-07Java中遍歷Map的多種方法示例及優(yōu)缺點(diǎn)總結(jié)
在java中遍歷Map有不少的方法,下面這篇文章主要給大家介紹了關(guān)于Java中遍歷Map的多種方法,以及各種方法的優(yōu)缺點(diǎn)總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07