我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及使用了动态代理生成的实现类。记录了MyBatis框架下传参的五种方法,占位符#和$,如何自定义别名,resultType属性的使用方法,如何处理数据库中列名和JAVA对象属性名不一致的情况,如何组装传递模糊查询的条件(一共有两种方式),动态SQL中if标签的使用。本篇博文记录一下动态SQL中
我上一篇博文记录的是
使用where标签是为了规避单独使用 if 标签所存在的不足:单独使用if标签的时候,需要在SQL语句中额外加上 where 关键字,但是:如果全部的if标签的条件都不满足,那么还存在着where关键字,那么就会造成SQL语法错误。此外,还可能会多一个少一个 or或者是and 这样的连接词。
以上的这些问题,使用
where标签里面是一个或者是多个 if 标签;当有一个 if标签的判断条件是 true,这个时候 where标签会转换为 WHERE关键字,然后附加到SQL语句的后面;如果 if标签没有一个是 true,那么就会忽略 where和里面的 if。
where的语法规则如下:
主SQL语句
where标签会删掉紧跟着它之后的 一个 or或者是 and,这样我们就不需要考虑多加了一个 or或者是and,就可以 每一个if标签前面都加上 and或者 or ;
dao层接口方法代码,如下所示:
- //使用where标签和if标签
- List
selectWhere(Student student);
mapper.xml文件代码,如下所示:
- <select id="selectWhere" resultType="com.dcy.domain.Student">
- select * from student
- <where>
- <if test="name!=null and name!=''">
- or name=#{name}
- if>
- <if test="age!=null and age!=''">
- or age > #{age}
- if>
- where>
- select>
可以明显看到,我们上面的代码中,SQL语句里面没有使用where关键字,这是因为使用了
在Main方法中进行必要的测试,代码如下:
- package com.dcy;
-
- import com.dcy.dao.StudentDao;
- import com.dcy.domain.Student;
- import com.dcy.utils.MyBatisUtil;
- import org.apache.ibatis.session.SqlSession;
-
- import java.util.List;
-
- public class Starter02 {
- public static void main(String[] args) {
- SqlSession sqlSession = MyBatisUtil.getSqlSession();
- StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
- Student student=new Student();
- student.setName("马小");
- student.setAge(22);
- List
students = studentDao.selectWhere(student); - System.out.println(students);
- }
- }
上面的代码是:筛选出所有学生信息中,名字是马小或者年龄大于22岁的。
运行结果这里我就不粘贴了,跟上一篇博文的运行结果相同。