MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增
程序员文章站
2022-05-25 17:01:38
...
续上篇:MyBatis学习笔记-07.MyBatis动态Sql语句if、where、trim、set
本次将继续记MyBatis动态Sql语句的choose和foreach:
一、choose(较少应用):
有时我们不想应用到所有的条件语句,而只想从中择其一项。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。这里我们以mybatis官方文档中给出的例子简单看。需搭配when标签元素、otherwise标签元素
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
二、foreach(重点):
动态 SQL 的另外一个常用的操作需求是对一个集合进行遍历。继续以学生表为例,附2个例子进行演示:
数据库表结构:
数据库表内容:
1.批量删除(传入array、传入map、传入list并且list中包含实体类)
- 将要删除的学生的学号放到一个Integer数组里,然后传入实现批量删除
(1)映射文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.model.Student">
<delete id="deleteByForeach">
delete from student where sno in
<foreach collection="array" item="stuno" open="(" close=")" separator=",">
#{stuno}
</foreach>
</delete>
</mapper>
open在遍历的开始加“(”,close在遍历的结束加“)”,separator每次遍历后加“,”
(2)测试程序及结果:
collection:相当于是el表达式的items,如果传递的是一个参数,并且这个参数是list或者array时,是list,collection只能写list,是array,collection只能写array,如案例传递的是数组array。
- 如果传递的参数是map,collection写的是map的key。以下用map传递参数,并在内使用list。
映射文件内容:
- 如果传递的参数是list,list里面有实体类或map,本例为实体类,collection写的是list,#{}写的是实体类的属性。(如果list中是map,则#{}中写的是map的key)
- 映射文件内容:
-
2.批量增加
(1)映射文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.model.Student">
<insert id="insertByForeach">
insert into student(sname,sex) values
<foreach collection="list" item="stu" separator=",">
(#{stu.sname},#{stu.sex})
</foreach>
</insert>
</mapper>
(2)测试程序及结果