MyBatis动态sql_where查询条件
EmployeeMapperDynamicSQL.java
package com.cn.mybatis.dao;
import java.util.List;
import com.cn.zhu.bean.Employee;
public interface EmployeeMapperDynamicSQL {
//<!-- 查询员工,要求,携带了哪个字段查询条件就带上这个字段的值 -->
public List<Employee> getEmpsByConditionIf(Employee employee);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cn.mybatis.dao.EmployeeMapperDynamicSQL">
<!-- 查询员工,要求,携带了哪个字段查询条件就带上这个字段的值 -->
<!--public List<Employee> getEmpsByConditionIf(Employee employee); -->
<select id="getEmpsByConditionIf" resultType="com.cn.zhu.bean.Employee">
select * from tbl_employee where
<!--
test 判断表达式(OGNL) C:if test OGNL参照ppt或者官方文档 c:if test 从参数中取值进行判断
遇见特殊符号应该去写转义字符
-->
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null && lastName!=""">
and last_name like #{lastName}
</if>
<if test="email !=null and email.trim()!=""">
and email=#{email}
</if>
<!-- ognl 会进行字符串和数字的转换 "0"==0 -->
<if test="gender==0 or gender==1">
and gender=#{gender}
</if>
</select>
</mapper>
测试程序
@Test
public void testDynamicSql() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession openSession=sqlSessionFactory.openSession();
try {
EmployeeMapperDynamicSQL mapper= openSession.getMapper(EmployeeMapperDynamicSQL.class);
Employee employee=new Employee(3, "%h%", "zhu@qq.com", null);
List<Employee> emps= mapper.getEmpsByConditionIf(employee);
for(Employee emp: emps)
System.out.println(emp);
} catch (Exception e) {
// TODO: handle exceptio
e.printStackTrace();
}
}
测试结果
这样就能正常查询数据,如果当主键为空的时候,就会报错,那么怎么解决呢?
会多出一个 and
第一种方法: 在where 后面加上 where 1=1
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cn.mybatis.dao.EmployeeMapperDynamicSQL">
<!-- 查询员工,要求,携带了哪个字段查询条件就带上这个字段的值 -->
<!--public List<Employee> getEmpsByConditionIf(Employee employee); -->
<select id="getEmpsByConditionIf" resultType="com.cn.zhu.bean.Employee">
select * from tbl_employee
where 1=1
<!--
test 判断表达式(OGNL) C:if test OGNL参照ppt或者官方文档 c:if test 从参数中取值进行判断
遇见特殊符号应该去写转义字符
-->
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null && lastName!=""">
and last_name like #{lastName}
</if>
<if test="email !=null and email.trim()!=""">
and email=#{email}
</if>
<!-- ognl 会进行字符串和数字的转换 "0"==0 -->
<if test="gender==0 or gender==1">
and gender=#{gender}
</if>
</select>
</mapper>
第二种解决方式: 用where标签 <where > </where>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cn.mybatis.dao.EmployeeMapperDynamicSQL">
<!-- 查询员工,要求,携带了哪个字段查询条件就带上这个字段的值 -->
<!--public List<Employee> getEmpsByConditionIf(Employee employee); -->
<select id="getEmpsByConditionIf" resultType="com.cn.zhu.bean.Employee">
select * from tbl_employee
<where>
<!--
test 判断表达式(OGNL) C:if test OGNL参照ppt或者官方文档 c:if test 从参数中取值进行判断
遇见特殊符号应该去写转义字符
-->
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null && lastName!=""">
and last_name like #{lastName}
</if>
<if test="email !=null and email.trim()!=""">
and email=#{email}
</if>
<!-- ognl 会进行字符串和数字的转换 "0"==0 -->
<if test="gender==0 or gender==1">
and gender=#{gender}
</if>
</where>
</select>
</mapper>
测试程序
@Test
public void testDynamicSql() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession openSession=sqlSessionFactory.openSession();
try {
EmployeeMapperDynamicSQL mapper= openSession.getMapper(EmployeeMapperDynamicSQL.class);
Employee employee=new Employee(null, "%h%", null, null);
List<Employee> emps= mapper.getEmpsByConditionIf(employee);
for(Employee emp: emps)
System.out.println(emp);
// 查询的时候如果某些条件没带可能sql拼装会有问题
// 1.给where 后面加上1=1,以后的条件都and
//2. mybatis 使用where 标签将所有的查询条件包括在内。
// mybatis 就会将where标签后面第一个and 去掉
// where只会去掉第一个多出来的and 或者 or
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
测试结果
// 查询的时候如果某些条件没带可能sql拼装会有问题
// 1.给where 后面加上1=1,以后的条件都and
//2. mybatis 使用where 标签将所有的查询条件包括在内。
// mybatis 就会将where标签后面第一个and 去掉
// where只会去掉第一个多出来的and 或者 or
更多请关注微信公众号: