使用Mybatis实现动态SQL

作者 : 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>
05-13 01:31