动态SQL
- 随着用户的输入或外部条件的变化而变化的SQL语句,我们称之为动态SQL语句
-
select *from empwhere name like concat('%', #{name}, '%')and gender = #{gender}and entrydate between #{begin} and #{end}order by update_time desc;
-
在上述的SQL语句中,只有在姓名、性别、入职日期三个条件都进行设定之后,才能进行正确的查询,但是如果想单独实现某一个条件的查询,就需要使用动态的SQL语句
if标签
- <if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL
- 改造后的SQL语句为
-
select *from empwhere<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;
-
-
运行如下方法
-
public void TestList() {List<Emp> list = empMapper.List("张", null, null, null);System.out.println(list);}
-
只传递name属性
-
-
运行结果如下
-
将所有张姓员工信息都查询出来了
-
存在问题
- 当查询条件中name为null时,就会报出语法错误如下:
- 在where之后含有and关键字,出现语法错误
- 问题解决
- 在XML映射文件的SQL语句中加入<where>标签
- 具体代码如下:
-
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></where>order by update_time desc;
-
运行结果如下:
小结
- <if>标签:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL语句
- <where>标签:where元素只会在子元素有内容的情况下才插入where子句,而且自动去除子句开头的and或者or