作者 : Stanley 罗昊
写在前面:
* 本章节适合有 Mybatis 基础者观看 *
使用 Mybatis 实现动态 SQL(一) 链接: https://www.cnblogs.com/StanleyBlogs/p/10772878.html#4241746.
在上一章内容中, 我介绍了一些在 xml 文件中使用一些标签来让我们一条 sql 语句更加灵活, 那么下面, 我将让条件变得更加多样性, 根据需求去实现这些功能从而达到练习的目的;
在工作当中, 可能会遇到这样的业务:
批量的删除或批量的查询, 比如我们在网购的时候, 在购物车中, 我们往往可以批量的删除, 勾选你想进行删除的商品, 或者根据 id 批量的对这些数据进行处理, 这个时候, 我们确实要根据 id 去查询, 但是根据一个 id, 那, 确实很简单, 但是要是类似于这种批量型的该怎么做呢?
其实很简单, 只需要用的 foreache 这样标签就可以了, 比如我们要进行批量删除, 这个时候, 传过来的一定是一串商品 id, 不再是单个 id, 因为批量嘛, 所以这个时候传过来的值我们可以把它封装成 list 集合, 再到我们的 xml 文件中, 我们对接收过来的这个集合进行遍历处理是不是就达到了批量操作的目的啦?
<foreache>
foreache 可以迭代的类型: 数组, 集合, 属性, 对象数组
我们先来看一下本次的业务是什么:
查询学号为 1,2,53 的学生信息;
首先我们先编写一下 sql:
select * from student from student where stuno in(1,2,53)
那么我现在要通过 mybatis 传参, 传一个集合过来, 比方说, 1 2 53 是外界传进来的, 如果我们需要解析的话, 我们就需要通过 foreach 标签进行解析;
比如会儿我传进来一个 ids, 这个 ids 可能是数组, 或是集合, 这个东西里面就包含这三个 1 2 53;
所以, 我们的查询 sql 语句里面应该就写成:
select * from student from student where stuno in(ids)
但是光写成以上那样肯定不行, 因为语法都不通过, 所以, 需要通过 foreache 标签来进行操作, 因为你光写一个 ids Mybatis 里的 xml 文件肯定不认识的, 所以我们需要通过标签来把这个 ids 给解析出 1 2 53;
使用 foreache 迭代属性
迭代属性的话, 首先, 我们需要在学生类中定义一个学号属性:
学号类名: Grade
学生信息类: Student
- // 学号
- private List<Integer> stuNos;
并且提供 gat,set 方法;
所以在做项目的时候, 在需求中看到需要根据 id 或者某些唯一的字段进行批量操作数据, 那么, 你就可以把这个类中的这个属性设置成集合类型;
以上工作准备就绪后, 我们就开始在 xml 文件中编写配置了;
首先, 我们编写 select 标签, 标识本标签起到查询的作用, 紧接着定义接收值类型: parametetType="Grade" 返回值类型: resultType = "Student" ;
因为我们要根据 Grade 类进行查询, 所以, 些一个 where 标签, 让 sql 语句灵活起来, 内部写一个 if 标签, 用来判断传过来的这个 Grade 对象中的 stuNos 属性是否有值, 如果有, 就执行 if 中的 sql 语句;
在 if 中记得加 and 因为 where 可以自动处理第一个 and, 然后我们把 sql 语句写进去, 写完之后先别着急, 因为我们还需要把增强 for 循环写进去, 因为我们需要解析 grade 中的 stuNos 这个集合, 语法:
- <foreache collection="stuNos" open "and stuno in (" close=")" item="ids"
- sepatator=",">
- #{ids}
- </foreache>
我们发现, 我们的查询条件被分割了, 前面的一半时查询条件 +(; 后面 close 括号中是另一半的括号;
后面这个 item 想必各位都很熟了, 没错, item 双引号中的 ids 就是代表着传过来的 stuNos 集合中的每一个数据, 说白了它就是 1 2 53;
sepatator 中写的是, 迭代出来的数据用什么符号进行分割, 如果不写, 你迭代出来的数据就是 1253;
如果 1253 作为条件, 那么肯定不对, 所以我们加了 sepatator 并且表用用 "," 所以迭代出来的数据是这样的 1,2,53;
接下来, 我们完整的写出来实现按照以上业务完成对 xml 中编写动态 sql:
- <select id="selectStudentInfoByid" parameterType="grade" resultType="Student">
- select * from Studnet
- <where>
- <if test "stuNos ! = null and stuNos.size>0">
- <foreache collection="stuNos" open "and stuno in (" close=")" item="ids"
- sepatator=",">
- #{ids}
- </foreache>
- </where>
- </select>
来源: https://www.cnblogs.com/StanleyBlogs/p/10852955.html