mybatis动态SQL中的trim、foreach和bind
参考地址
⼀、trim标签
trim标记是⼀个格式化的标记,可以完成t或者是where标记的功能,如下代码:
1、
lect * from ur
<trim prefix="WHERE" prefixoverride="AND |OR">
<if test="name != null and name.length()>0"> AND name=#{name}</if>
<if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>
假如说name和gender的值都不为null的话打印的SQL为:lect * from ur where 空格 name = 'xx' and gender = 'xx' 在红⾊标记的地⽅是不存在第⼀个and的,上⾯两个属性的意思如下:
prefix:前缀
prefixoverride:去掉第⼀个and或者是or
2、
update ur
<trim prefix="t" suffixoverride="," suffix=" where id = #{id} ">
<if test="name != null and name.length()>0"> name=#{name} , </if>
<if test="gender != null and gender.length()>0"> gender=#{gender} , </if>
</trim>
声音作文
假如说name和gender的值都不为null的话打印的SQL为:update ur t name='xx' , gender='xx' 空格 where id='x' 在红⾊标记的地⽅不存在逗号,⽽且⾃动加了⼀个t前缀和where后缀,上⾯三个属性的意义如下,其中prefix意义如上: suffixoverride:去掉最后⼀个逗号(也可以是其他的标记,就像是上⾯前缀中的and⼀样)
suffix:后缀
⼆、foreach标签
动态 SQL 的另外⼀个常⽤的操作需求是对⼀个集合进⾏遍历,通常是在构建 IN 条件语句的时候。⽐如:
<lect id="lectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" parator="," clo=")">
#{item}
</foreach>
</lect>
foreach 元素的功能⾮常强⼤,它允许你指定⼀个集合,声明可以在元素体内使⽤的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
注意 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使⽤可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使⽤ Map 对象(或者 Map.Entry 对象的集合)时,index 是
键,item 是值。
1、foreach标签属性解读
MyBatis的foreach标签应⽤于多参数的交互如:多参数(相同参数)查询、循环插⼊数据等,foreach标签包含collection、item、open、clo、index、parator,MyBatis的foreach标签与jstl标签的使⽤⾮常相似,以下为⼏个属性的意思解释:
英雄联盟出装攻略collection:collection是传进来的参数名称,以是⼀个数组或者List、Set等集合。根据Mapper接⼝的参数名确定,也可以使⽤@Param 注解指定参数名。官僚主义
目标item:参数调⽤名称,通过此属性来获取集合单项的值
open:相当于prefix,即在循环前添加前缀
clo:相当于suffix,即在循环后添加后缀
index:当前元素在集合中的索引、下标
parator:分隔符,每次循环完成后添加此分隔符
2、foreach标签应⽤
1).多参数查询
场景描述:传⼊多个⽤户ID,获取⽤户的结果集
Junit业务⽅法调⽤
mapper接⼝(指定参数名称)
XML实现:
SQL打印:
2).循环插⼊数据Junit业务⽅法调⽤
写雨的片段SQL打印
[com.xuyong.dao.UrMapper.inrtMultiUrs]-==> Preparing: inrt into ur(ur_name,gender,
email,address,dept_id) values (?,?,?,?,?) , (?,?,?,?,?) , (?,?,?,?,?)
[com.xuyong.dao.UrMapper.inrtMultiUrs]-==> Parameters: HanMeimei(String), 1(Integer),
(String), 江苏省南京市(String), 2(Integer), 李雷(String), 0(Integer), (String), 北京市(String), 1(Integer), QQ⼩冰(String), 1(Integer), (String), 深圳市(String), 2(Integer)
[com.xuyong.dao.UrMapper.inrtMultiUrs]-<== Updates: 3
3
三、bind标签
1、bind 元素可以从 OGNL 表达式中创建⼀个变量并将其绑定到上下⽂。⽐如:
<lect id="lectBlogsLike" resultType="Blog">
中国古建筑
<bind name="pattern" value="'%' + _Title() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</lect>
2、 mybatis中使⽤mysql的模糊查询字符串拼接(like) 中也涉及到bind的使⽤
<!-- List<Employee> getEmpsTestInnerParameter(Employee employee); -->
<lect id="getEmpsTestInnerParameter" resultType="batis.bean.Employee">
<!-- bind:可以将OGNL表达式的值绑定到⼀个变量中,⽅便后来引⽤这个变量的值 -->
<bind name="bindeName" value="'%'+eName+'%'"/>eName是employee中⼀个属性值
SELECT * FROM emp
<if test="_parameter!=null">
where ename like #{bindeName}
</if>
</lect>
测试类中:
Employee emp=new Employee();
emp.tEname("张"); 为eName属性赋值为“张”
List<Employee> EmpsTestInnerParameter(emp);
for (Employee employee : list) {
System.out.println(employee);
}
组织文化案例3、实例
<lect id="lectSysUrsAdvancedWithWhere" resultType="l.domain.SysUr"> SELECT
a.id,
a.ur_name urName,
a.ur_password urPassword,
a.ur_email urEmail,
a.ur_info urInfo,所有反义词
a.head_img headImg,
FROM
sys_ur a
<where>
<if test="urName != null and urName != '' ">
and ur_name like concat('%',#{urName},'%')
</if>
<if test="urEmail != null and urEmail != '' ">
an d ur_email = #{urEmail}
</if>
</where>
</lect>