MyBatis的动态sql语句

注意:这里的数据库中的表仍然使用的是前面的user表
前面我们提到的都是固定的sql语句 并且业务功能比较单一 比如通过id查询用户 通过姓名来查询用户等等 但是我们这里没有去考虑到业务比较复杂的情况 例如当用户名不为空的时候 我们根据用户名进行查询
但是 当地址不为空的时候 我们还要加上地址进行进一步的判断 所以这里是根据条件来进行动态的查询
前面的步骤还是相同
1、在iuserdao接口中添加相应的方法
List findByUser(User user);
2、在iuserdao.xml中进行相应的配置

if标签中写的是对象的属性名 我们可以对其进行一个条件的判断 这里的意思是如果username不为空的情况下 那么我们肯定是根据username来进行查询 并且这里如果address不为空的情况下 我们还需要拼接上address的条件 当然
如果两者都为空的情况下 我们肯定是查询所有的用户
3、编写相应的测试类
测试1:

当username和address都不为空的情况下,测试结果
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'}
测试2:注释掉其中一行

测试结果:

同理 如果我们注释掉两个条件 那么肯定是查询所有的用户
当然这里我们还得注意一点 因为在配置中我们没有指定模糊查询的条件 所以我们需要在测试中进行体现

这里我们为了简化拼接的配置 我们可以采取第二种标签where
1、持久层的接口仍然是刚才的方法
2、iuserdao中的配置可以修改为以下的形式

3、编写测试类

测试结果:
User{id=41, username='老王', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018, address='北京'}
User{id=43, username='小王', sex='女', birthday=Sun Mar 04 11:34:34 CST 2018, address='深圳'}
User{id=45, username='二王', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018, address='南京'}
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'}
和上面的形式是等价的

需求:查询id取多个值中的某一个的时候的用户信息
进行范围查询的时候 就要将集合中的值 作为参数动态的添加进来
在查询条件对象中添加一个集合用于封装参数
private List ids;
并且生成setter和getter方法

在持久层也就是userdao接口中添加相应的方法
List findInIds(QueryVo vo);

映射文件中配置相应的信息

foreach标签用于遍历集合 属性的介绍
collection:代表要遍历的集合元素
open语句的开始的部分
close代表结束的部分
item代表遍历集合的每个元素 生成的变量名
separator代表分隔符
测试类:

测试结果:
User{id=41, username='老王', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018, address='北京'}
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'}

原文地址:https://www.cnblogs.com/phantom576/p/11954127.html