mybatis动态SQL

2024-01-08 13:43:50

在学之前我们要考虑一下以下两个问题:

为什么要有动态SQL?

动态SQL和普通SQL有什么区别?

我们以一个查询案例来说明:

如果我们在编写条件查询的时候,用户可以根据姓名、性别、入职时间、离职时间进行查询,如果用户把全部的条件都输入了,那么普通SQL就可以满足这个功能的实现,但是如果用户就之输入了其中某一项、或者输入某几项,这个时候普通SQL已经不适合来完成这个功能了。这个时候就出现了动态SQL。

动态SQL什么意思呢?
举个例子:
在这里插入图片描述

用户可以根据姓名、性别、入职时间、离职时间进行查询,在使用功能动态SQL的时候,我们可以先判断一下是否为null,如果为null,执行的时候就会忽略某行SQL语句,如果不为null,就会把条件添加在上面。

示例:
普通SQL进行的查询:

# 条件查询员工- 姓名、性别、入职时间 并根据最后更新时间进行倒序排序
select * from emp
where
	name like concat('%','张','%')
	and gender = 1
	and entrydate between '2000-01-01' and '2010-01-01'
order by update_time desc;

动态SQL进行的查询:

    <select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp
        where
            <if test="name != null ">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender != null ">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null ">
                and entrydate between #{begin} and #{end}
            </if>
        order by update_time desc;
    </select>

这就是动态SQL和普通SQL的区别,我们可以理解为:通过判断语句,来进行SQL语句的拼接,最后组成一个完整的SQL语句,所以也叫做动态SQL

上面的示例还有点小问题
比如,如果第一行为null,那么第二行会多出来一个 and 这就会导致整个SQL执行错误,处理的办法是把where关键字改为where标签使用,示例:

    <!--条件查询-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp
        <where>
            <if test="name != null and name != '' ">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender != null ">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null ">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>

OK,动态SQL介绍完了😁😁😁

文章来源:https://blog.csdn.net/N16696796429/article/details/135454194
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。