MyBatis动态SQL:if

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);

输出: