mybatis动态SQL

本文讨论了动态SQL在满足用户自定义查询条件时的优势,与普通SQL的差异,以及在JavaEE环境中如何通过JSP中的IF测试语句动态生成SQL。通过实例演示了动态SQL如何通过条件判断来构造SQL,同时指出了潜在的问题及其解决方案。
摘要由CSDN通过智能技术生成

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

为什么要有动态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介绍完了😁😁😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海梦在飘扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值