MyBatis的动态sql语句

Posted 菜鸟phantom卡卡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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=\'天津\'}

以上是关于MyBatis的动态sql语句的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 详解------动态SQL

mybatis--MyBatis动态SQL语句

mybatis 详解------动态SQL

Mybatis之动态构建SQL语句

mybatis 动态sql语句

MyBatis动态Sql语句