MyBatis动态sql的实现

MyBatis动态sql的实现

在实际开发中我们经常会遇到各种动态的查询,比如按标签查询,一般sql语句很难动态获取用户究竟选了什么标签从而无法进行sql语句拼接,但是在MyBatis框架中我们这个问题得以用几个标签解决。

1. if标签

用于逻辑判断,语法 如果条件为真,则执行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语言类似!

2. where标签

往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关键词。

3. include标签

Sql标签可以把常用一些动态标签放入其中,并给他们命名id。
Include标签可以在需要的地方引用sql标签中的动态标签,只需要访问对应的sql标签的id。
MyBatis动态sql的实现_第1张图片

4. foreach标签

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。

5. MyBatis提供的分页方法

其实之前的基础学习分页我们已经解决了,为什么这个地方又要提出来,因为之前的分页我们是通过sql语句实现的,所以数据库一旦变成不支持limit的分页写法(比如Oracle数据库)就会出现语句异常。
这里我们使用mybatis提供的分页方法实现。
在分页方法中我们不需要进行什么额外的配置,只需要在dao类中加入一个RowBounds对象。
这个是配置文件

 

这个是dao的方法申明

	abstract public ArrayList getWorkByPage(String like,RowBounds rowBounds);

这里说明一下这个RowBounds类,在实例化这个对象时需要提供两个参数,这两个参数对应了我们的 limit num1,num2 ,也就是(page-1)*pagesize, pagesize。

6. 多个不相关的查询条件拼接

其实道理是一样的,比如上文中我们用到了工资范围和一系列模糊查询关键词,这时我们想要结合两者再做一次查询,我们一样还是先创建一个pojo类,但是我们不用再一个属性一个属性地写了,我们可以分别实例化这两个对象作为属性。

package cn.edu.fjut.pojo;

public class All {

	private Id id;
	private Key key;
	private Salary salary;
 

我们分块利用多个if标签就可以进行这些查询的拼接了。(注意:在申明过入参类型后可以直接用属性名代表属性了,属性.属性的属性也是支持的!)

你可能感兴趣的:(笔记,框架,java,mysql,mybatis)