先看代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="biz.baijing.mapper.EmpMapper">
<!-- 员工信息的条件查询 -->
<select id="list" resultType="biz.baijing.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>
</where>
order by update_time desc
</select>
</mapper>
这是页面查询条件。
会有什么问题呢 ?
假设所有条件都不选择,上面的代码生成的 SQL 语句是
Preparing: select * from emp WHERE name like concat('%',?,'%') order by update_time desc LIMIT ?
出现了 where 语句。
WHERE name like concat('%',?,'%')
没有选择以上的 姓名 | 性别 | 入职时间 这三个条件,where语句不出现才是正确的。
因为,name 是 String ;会默认拼一个 '' (注解: 空格)。
代码修改如下
看代码差异 —— ,name != '' (注释: 空格)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="biz.baijing.mapper.EmpMapper">
<!-- 员工信息的条件查询 -->
<select id="list" resultType="biz.baijing.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>
</mapper>
这才是期望的代码;没有 where 语句。
Preparing: select * from emp order by update_time desc LIMIT ?