<foreach />
标签
- 标签的属性
属性 | 释义 |
---|---|
collection | 需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用list 、array 代替,Map 对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list 、array 会失效; |
item | 集合元素迭代时的别名称,该参数为必选项 |
index | 在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为 可选项 |
open | 遍历集合时的开始符号,通常与close=")" 搭配使用 可选项 |
close | 遍历集合时的结束符号,通常与open="("搭配使用,该参数为可选项 |
separator | 元素之间的分隔符,类比在IN()的时候,separator="," ,最终所有遍历的元素将会以设定的(, )逗号符号隔开,该参数为可选项 |
- collection属性值类型为Map
- Mapper接口定义的方法:
void xxx(@Param("paramsMap") Map<String,String> map);
-
mapper.xml
- 方式一:利用map的entrySet()方法
...... <insert id="XXX" parameterType="java.util.Map"> INSERT INTO table(a, b) VALUES <foreach collection="paramsMap.entrySet()" open="(" separator="," close=")" index="key" item="val"> #{key}, #{val} </foreach> </insert> </mapper>
- 方式二:
...... <insert id="XXX" parameterType="java.util.Map"> INSERT INTO table <foreach collection="paramsMap.keys" item="key" open="(" separator="," close=")"> 获取值:#{param[key]} 键:#{key} </foreach> VALUES <foreach collection="paramsMap.value" item="val" open="(" separator="," close=")"> 值:#{val} </foreach> </insert> ......
mapper.xml使用静态常量或方法
-
方式一
先看一下在网上找到的一种比较常见的方式:
按照上面的做法我试了,但是有一个问题,使用${}
的时候,无论我调用的是一个静态的常量字符串或者是调用一个静态方法返回一个字符串,到SQL拼装的时候都会给它当成 字段 处理,进而sql运行错误 – (错误:找不到这个字段)。
于是想到用#{}
替代${}
,但是依旧在解析的时候会抛出异常 – (错误:找不到相关get方法),很明显当我用#{}
的时候mysql将里边的内容当作参数类中的属性处理了。 -
方式二
利用mybatis中的bind
标签:bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。 也就是说可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值。
- 拼装参数
<select id="getDataList" resultType="Data"> <bind name="_dataName" value="'%' + dataName + '%'"/> select * from tbl_data where data_name like #{_dataName} </select>
- 调用静态方法
<insert id="insertData" parameterType="Data"> insert into tab_data ...... <trim prefix="values (" suffix=")" suffixOverrides=","> <bind name="systemSign" value="@com.boo.common.config.BooConfig@getName()"/> #{systemSign}, ......
- 调用静态变量
同上