EmployeeMapperDynamicsql.java
package com.gong.mybatis.mapper; import java.util.List; java.util.Map; org.apache.ibatis.annotations.MapKey; com.gong.mybatis.bean.Employee; public interface EmployeeMapperDynamicsql { public List<Employee> getEmpByConditionIf(Employee employee); }
EmployeeMapperDynamicsql.xml
<?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.gong.mybatis.mapper.EmployeeMapperDynamicsql"> <!-- 查询,要查那个就带上那个条件 --> select id="getEmpByConditionIf" resultType="com.gong.mybatis.bean.Employee"> select * from tbl_employee where> if test="id!=null" 取值是从参数里面取 --> id=#{id} </if 遇见特殊符号应使用转义字符 --> ="lastName!=null && lastName!=""" and last_name like #{lastName} ="email!=null and email.trim()!=""" and email=#{email} ognl会进行字符串和数字进行转换 ="gender==0 or gender==1" and gender=#{gender} > select> mapper>
在TestMybatis3.java中进行测试:
com.gong.mybatis.test; java.io.IOException; java.io.InputStream; org.apache.ibatis.io.Resources; org.apache.ibatis.session.sqlSession; org.apache.ibatis.session.sqlSessionFactory; org.apache.ibatis.session.sqlSessionFactoryBuilder; org.junit.Test; com.gong.mybatis.bean.Employee; com.gong.mybatis.mapper.EmployeeMapperDynamicsql; class TestMybatis3 { public sqlSessionFactory getsqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); return new sqlSessionFactoryBuilder().build(is); } @Test void test() IOException { sqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); sqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapperDynamicsql mapper = openSession.getMapper(EmployeeMapperDynamicsql.); Employee employee = Employee(); employee.setId(3); // employee.setLastName("%小%"); employee.setEmail("xiaoming@qq.com"); List<Employee> es = mapper.getEmpByConditionIf(employee); for(Employee e:es) { System.err.println(e); } openSession.commit(); } finally { openSession.close(); } } }
首先是根据Id查询,结果为:
DEBUG 01-21 13:02:20,329 ==> Preparing: select * from tbl_employee WHERE id=? (BaseJdbcLogger.java:145)
Employee [id=3,lastName=小红,gender=0,email=xiaohong@qq.com,dept=null]
DEBUG 01-21 13:02:20,375 ==> Parameters: 3(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-21 13:02:20,452 <== Total: 1 (BaseJdbcLogger.java:145)
再根据姓名查询,结果为:
DEBUG 01-21 13:11:43,961 ==> Preparing: select * from tbl_employee where last_name like ? (BaseJdbcLogger.java:145) DEBUG 01-21 13:11:44,023 ==> Parameters: %小%(String) (BaseJdbcLogger.java:145) DEBUG 01-21 13:11:44,086 == Total: 2 (BaseJdbcLogger.java:145) Employee [id=3,lastName=小红,1)">gender=0,1)">email=xiaohong@qq.com,1)">dept=null] Employee [id=4,1)">=小明,1)">=xiaoming@qq.com,1)">=null]
说明:上述的动态sql会根据存在的字段进行查询。where标签可以去除掉第一个and。也就是说当我们根据姓名来查询时,原本sql拼接结果应该为select * from tbl-employee where and last_name like #{lastName},由于使用了where标签,去掉了这里的第一个and。假设我们现在这么写:
> id=#{id} and last_name like #{lastName} and email=#{email} and gender=#{gender} >
即将and连接符放在if语句的最后,再进行按姓名查询就会报错:
DEBUG 01-21 13:08:17,137 ==> Preparing: select * from tbl_employee WHERE last_name like ? and (BaseJdbcLogger.java:145)
DEBUG 01-21 13:08:17,191 ==> Parameters: %小%(String) (BaseJdbcLogger.java:145)
注意到日志里的sql语句最后存在一个and,这是不合法的,我们可以使用trim标签来解决:
trim prefix="where" prefixOverrides="" suffix suffixOverrides="and"trim>
prefixOverrides:去除掉sql语句从该处开始指定的字符串
suffixOverrides:去除掉sql语句最后的指定的字符串
之后再进行测试:
=null]
发现sql语句正常,能够正确运行。