• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MyBatis动态Sql之if标签的用法详解

mybatis 搞代码 4年前 (2022-01-09) 93次浏览 已收录 0个评论

最近在读刘增辉老师所著的《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

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MyBatis动态Sql之if标签的用法详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址