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