MyBatis还有一个强大特性就是他动态SQL。
在实际项目开发中,经常需要根据不同的条件拼接SQL语句,拼接时还要确保不能忘了必要的空格,有时候还要注意省掉列名列表最后的逗号,等等。在使用JDBC或其他类似持久层框架操作数据库时,处理这种情况是非常麻烦的,甚至可以用痛苦来形容,而在MyBatis中利用动态SQL这一特性可以很简单的解决这个问题。
动态SQL元素和使用JSTL或其他类似基于XML的文本处理器相似,MyBatis采用功能强大基于OGNL的表达式来完成动态SQL。OGNL的表达式可以被用于任意的SQL映射语句。
常用的动态SQL元素包括:
· if
· choose
· where
· set
· foreach
· bind
下面我们就用一个简单的实例,看看在MyBatis中怎么使用动态SQL
示例:DynamicSQL Test
1.数据表
2.mapper.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="org.fkit.mapper.EmployeeMapper"> <select id="selectEmployeeByIdLike" resultType="org.fkit.domain.Employee"> SELECT * FROM tb_employee WHERE STATE='ACTIVE' <!-- 可选条件,如果传入参数有ID属性,则加上ID查询条件 --> <if test="id != null"> AND ID=#{id} </if> </select> </mapper>
以上语句提供了一个可选的根据ID查找Employee的功能,如果没有传入ID,那么所有处于’ACTIVE’状态的Employee都会被返回;反之若传入了ID,那么就会把查找ID内容的Employee结果返回.
3.mapper.java
public interface EmployeeMapper { List<Employee> selectEmployeeByIdLike(HashMap<String,Object> params); }
以上代码提供了一个和EmployeeMapper.xml中的select元素的id同名的方法,需要注意的是,selectEmployeeByIdLike接收一个HashMap作为参数
在MyBatis中,#{id}表达式获取参数有两种方式:一是从HashMap中获取集合中的property对象;二是从javabean中获取property对象.
4.控制器
@GetMapping("/mysql/DynamicSQL/if") public void dynamicSQLIf() { //获得SqlSession实例 SqlSession sqlSession = FKSqlSessionFactory.getSqlSession(); //获得Mapper接口代理对象 EmployeeMapper em = sqlSession.getMapper(EmployeeMapper.class); //创建一个HashMap存储参数 HashMap<String,Object> params = new HashMap<String,Object>(); params.put("id", 1); //调用Employee接口的selectEmployeeByIdLike方法 List<Employee> list = em.selectEmployeeByIdLike(params); //查看结果 list.forEach(employee->System.out.println(employee.getName())); }
输出:
注释
params.put("id", 1);
输出: