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 &gt; #{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岁的。

6、本篇博文所用的示例代码所在的gitee仓库地址

7、我的下一篇博文

经验分享 程序员 微信小程序 职场和发展