做者 : Stanley 罗昊html
【转载请注明出处和署名,谢谢!】sql
写在前面:数组
*本章节适合有Mybatis基础者观看*mybatis
使用Mybatis实现动态SQL(一)连接:https://www.cnblogs.com/StanleyBlogs/p/10772878.html#4241746.spa
在上一章内容中,我介绍了一些在xml文件中使用一些标签来让咱们一条sql语句更加灵活,那么下面,我将让条件变得更加多样性,根据需求去实现这些功能从而达到练习的目的;code
在工做当中,可能会遇到这样的业务:xml
批量的删除或批量的查询,好比咱们在网购的时候,在购物车中,咱们每每能够批量的删除,勾选你想进行删除的商品,或者根据id批量的对这些数据进行处理,这个时候,咱们确实要根据id去查询,可是根据一个id,那,确实很简单,可是要是相似于这种批量型的该怎么作呢?htm
其实很简单,只须要用的foreache这样标签就能够了,好比咱们要进行批量删除,这个时候,传过来的必定是一串商品id,再也不是单个id,由于批量嘛,因此这个时候传过来的值咱们能够把它封装成list集合,再到咱们的xml文件中,咱们对接收过来的这个集合进行遍历处理是否是就达到了批量操做的目的啦?对象
foreache能够迭代的类型:数组、集合、属性、对象数组blog
咱们先来看一下本次的业务是什么:
查询学号为一、二、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;
迭代属性的话,首先,咱们须要在学生类中定义一个学号属性:
学号类名: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>