在学之前我们要考虑一下以下两个问题:
为什么要有动态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介绍完了😁😁😁