最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸!
本篇博客主要讲解如何使用if标签生成动态的Sql,主要包含以下3个场景:
1.根据查询条件实现动态查询
2.根据参数值实现动态更新某些列
3.根据参数值实现动态插入某些列
1. 使用if标签实现动态查询
假设有这样1个需求:根据用户的输入条件来查询用户列表,如果输入了用户名,就根据用户名模糊查询,如果输入了邮箱,就根据邮箱精确查询,如果同时输入了用户名和邮箱,就用这两个条件去匹配用户。
首先,我们在接口SysUserMapper中添加如下方法:
/** * 根据动态条件查询用户信息 * * @param sysUser * @return */ List<SysUser> selectByUser(SysUser sysUser);
然后在对应的SysUserMapper.xml中添加如下代码:
<select id="selectByUser" resultType="com.zwwhnly.mybatisaction.model.SysUser"> SELECT id, user_name, user_password, user_email, create_time FROM sys_user WHERE 1 = 1 <if test="userName != null and userName != ''"> AND user_name LIKE CONCAT('%',#{userName},'%') </if> <if test="userEmail != null and userEmail != ''"> AND user_email = #{userEmail} </if> </select>
代码简单讲解:
1)if标签的test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果。
2)判断条件property != null 或 property == null,适用于任何类型的字段,用于判断属性值是否为空。
3)判断条件property != ” 或 property == ”,仅适用于String类型的字段,用于判断是否为空字符串。
4)当有多个判断条件时,使用and或or进行连接,嵌套的判断可以使用小括号分组,and相当于Java中的与(&&),or相关于Java中的或(||)。
所以上面代码的意思就是先判断字段是否为null,然后再判断字段是否为空字符串。
最后,在SysUserMapperTest测试类中添加如下测试方法:
@Test public void testSelectByUser() { SqlSession sqlSession = getSqlSession(); try { SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class); // 只按用户名查询 SysUser query = new SysUser(); query.setUserName("ad"); List<SysUser> sysUserList = sysUserMapper.selectByUser(query); Assert.assertTrue(sysUserList.size() > 0); // 只按邮箱查询 query = new SysUser(); query.setUserEmail("[email protected]"); sysUserList = sysUserMapper.selectByUser(query); Assert.assertTrue(sysUserList.size() > 0); // 同时按用户民和邮箱查询 query = new SysUser(); query.setUserName("ad"); query.setUserEmail("[email protected]"); sysUserList = sysUserMapper.selectByUser(query); // 由于没有同时符合这两个条件的用户,因此查询结果数为0 Assert.assertTrue(sysUserList.size() == 0); } finally { sqlSession.close(); } }
运行测试代码,测试通过,输出日志如下:
DEBUG [main] - ==> Preparing: SELECT id, user_name, user_password, user_email, create_time FROM sys_user WHERE 1 = 1 AND user_name LIKE CONCAT('%',?,'%') DEBUG [main] - ==> Parameters: ad(String) TRACE [main] - <== Columns: id, user_name, user_password, user_email, create_time TRACE [main] - <== Row: 1, admin, 123456, [email protected], 2019-06-27 18:21:07.0 DEBUG [main] - <== Total: 1 DEBUG [main] - ==> Preparing: SELECT id, user_name, user_password, user_email, create_time FROM sys_user WHERE 1 = 1 AND user_email = ? DEBUG [main] - ==> Parameters: [email protected](String) TRACE [main] - <== Columns: id, user_name, user_password, user_email, create_time TRACE [main] - <== Row: 1001, test, 123456, [email protected], 2019-06-27 18:21:07.0 DEBUG [main] - <== Total: 1 DEBUG [main] - ==> Preparing: SELECT id, user_name,<a>本文来源gao($daima.com搞@代@#码8网^</a> user_password, user_email, create_time FROM sys_user WHERE 1 = 1 AND user_name LIKE CONCAT('%',?,'%') AND user_email = ? DEBUG [main] - ==> Parameters: ad(String), [email protected](String) DEBUG [main] - <== Total: 0