一、前言
SSM-Mybatis【进阶一】虽然总结了一些常见的sql语句的编写,但是没有提到动态SQL,而恰恰其又是非常常见的,因此本文主要总结Mybatis如何编写动态Sql语句。
二、案例背景
数据库中user表结构如下:
数据库中user表数据如下:
com.zuobiao.domain.User类如下:
1 | public class User implements Serializable { |
三、IF标签
需求:假设现需要根据可能有或可能没有的条件来查询用户信息
1、在IUserDao接口中添加findByCondition()方法:
1 | public interface IUserDao { |
2、在IUserDao.xml配置文件中进行配置:
1 | <select id="findByCondition" parameterType="user" resultMap="user"> |
3、在MybatisTest测试类中编写测试方法
1 | public class MybatisTest { |
4、测试结果如下:
没有设置user对象的userSex属性值时:
设置了user对象的userSex属性值时:
四、WHERE标签
在编写动态sql语句的时候,都是先在查询语句后面先添加 where 1=1 条件,然后在判断有无其他查询条件,如果有就添加;没有就不添加。
但其实Mybatis也给我们提供了一个where标签,可以自动添加 where 1=1 条件,这样我们就不在需要自己添加该条件了。
所以,上述案例中IUserDao.xml配置文件中的配置信息可以修改为:
1 | <select id="findByCondition" parameterType="com.zuobiao.domain.User" resultType="com.zuobiao.domain.User"> |
五、FOREACH标签
在实际开发中也通常会遇到需要根据多个id获取查询对象的情形,SQL语句类似如下:
1 | select * from user where id in (42,43,46); |
对于上述SQL语句,Mybatis也提供好了标签供我们使用,起就是forEach标签。其使用大致如下:
1、创建QueryVo类:
1 | public class QueryVo { |
2、在IUserDao.xml配置文件中进行配置:
1 | <select id="findUserInIds" parameterType="com.zuobiao.domain.QueryVo" resultType="com.zuobiao.domain.User"> |
3、在MybatisTest测试类中编写测试方法
1 |
|
4、测试结果如下:
补充:
forEach标签的执行原理大致如下:
六、SQL标签
当我们的程序中有很多相同的SQL语句时,使用SQL标签可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
1 | <sql id="defaultSql"> |
1 | <!-- 配置查询所有操作 --> |
Java新手,若有错误,欢迎指正!