欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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个例子进行演示:

数据库表结构:

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

数据库表内容:

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

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>

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

open在遍历的开始加“(”,close在遍历的结束加“)”,separator每次遍历后加“,”

(2)测试程序及结果:

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

collection:相当于是el表达式的items,如果传递的是一个参数,并且这个参数是list或者array时,是list,collection只能写list,是array,collection只能写array,如案例传递的是数组array。

  • 如果传递的参数是map,collection写的是map的key。以下用map传递参数,并在内使用list。

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

映射文件内容:MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

          • 如果传递的参数是list,list里面有实体类或map,本例为实体类,collection写的是list,#{}写的是实体类的属性。(如果list中是map,则#{}中写的是map的key)
          • MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增
        • 映射文件内容:
        • MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

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)测试程序及结果

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增

MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增