在实际开发中我们经常会遇到各种动态的查询,比如按标签查询,一般sql语句很难动态获取用户究竟选了什么标签从而无法进行sql语句拼接,但是在MyBatis框架中我们这个问题得以用几个标签解决。
用于逻辑判断,语法 如果条件为真,则执行if标签中的内容test中的变量来源于parameter传入的对象,不需要写#{xxx}。
比如我们来做一个按工资区间动态查询的实验。
我们一般会为一类相关联的或者相似的条件单独建一个pojo类,这个类区别于实体类但是拥有我们需要的判断数值,比如工资区间我们就定义了Salary这个类。
package cn.edu.fjut.pojo;
public class Salary {
private Integer maxSalary;
private Integer minSalary;
这个pojo类包含了查询上限和下限两个属性。
上面这个映射就是一个if标签的例子,where 1=1为恒真条件,where之所以不写在if之内是很可能第一个if没执行但第二个if执行了,但此时语句缺少where关键字sql语句报错,写恒真是为了where关键字不影响当没有if执行时sql的正常查询。
注意:可以看到在配置文件中我们写sql语句并不能使用<>,而是用了>(大于)和<(小于),这和html语言类似!
往sql中注入where每个where标签的if标签中的sql语句都可以写上or或者and,where标签取到第一个or或者and的时候会自动去掉。
再做个实验吧,我们现在想通过一系列关键字模糊查询一张表,同样,我们先给条件们创建一个pojo类。
package cn.edu.fjut.pojo;
public class Key {
private String keycompany;
private String keyposition;
private String keytype;
private String keyplace;
接着是配置文件
这个where标签没啥东西,就给sql语句加上where关键词。
Sql标签可以把常用一些动态标签放入其中,并给他们命名id。
Include标签可以在需要的地方引用sql标签中的动态标签,只需要访问对应的sql标签的id。
foreach标签的使用会很广泛,举两种例子
首先我们还是先建一个pojo类,这个类属性为两个集合,一个是模糊查询的关键字集合一个是in查询的元素集合。
package cn.edu.fjut.pojo;
import java.util.ArrayList;
public class Keylist {
private ArrayList likekey;
private ArrayList idkey;
- 动态拼接多个查询条件
根据一组模糊查询的关键字,我们现在动态加载这组模糊查询
work_position like concat('%',concat(#{keys},'%'))
说明一下,collection是循环的集合,item是循环的当前项,参考javaEE的foreach比较一下就懂了,separator是拼接字段。
- 动态拼接多个查询条件的范围
这个是一个in查询,我们需要将in的元素拼接进查询语句。
#{keys}
再说明一下,open是拼接的开头,close是拼接的末尾,因为不是where后第一个查询条件所以open前会加上and。
其实之前的基础学习分页我们已经解决了,为什么这个地方又要提出来,因为之前的分页我们是通过sql语句实现的,所以数据库一旦变成不支持limit的分页写法(比如Oracle数据库)就会出现语句异常。
这里我们使用mybatis提供的分页方法实现。
在分页方法中我们不需要进行什么额外的配置,只需要在dao类中加入一个RowBounds对象。
这个是配置文件
这个是dao的方法申明
abstract public ArrayList getWorkByPage(String like,RowBounds rowBounds);
这里说明一下这个RowBounds类,在实例化这个对象时需要提供两个参数,这两个参数对应了我们的 limit num1,num2 ,也就是(page-1)*pagesize, pagesize。
其实道理是一样的,比如上文中我们用到了工资范围和一系列模糊查询关键词,这时我们想要结合两者再做一次查询,我们一样还是先创建一个pojo类,但是我们不用再一个属性一个属性地写了,我们可以分别实例化这两个对象作为属性。
package cn.edu.fjut.pojo;
public class All {
private Id id;
private Key key;
private Salary salary;
我们分块利用多个if标签就可以进行这些查询的拼接了。(注意:在申明过入参类型后可以直接用属性名代表属性了,属性.属性的属性也是支持的!)