Code前端首页关于Code前端联系我们

MyBatis教程:使用if标签创建动态SQL

terry 2年前 (2023-09-25) 阅读数 50 #后端开发

如何使用if标签创建动态SQL,主要包括以下三种场景:

  1. 根据查询条件实现动态查询
  2. 实现特定列的动态更新参数值
  3. 根据参数值动态添加某些列

1。使用if标签实现动态查询

假设有这样一个需求:根据用户的输入条件查询用户列表。如果输入用户名,则根据用户名进行模糊查询。如果提供了电子邮件地址,则准确的查询基于电子邮件地址。如果同时给出用户名和电子邮件,则使用这两个条件来匹配用户。

首先我们在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)测试属性是否需要identifier。属性的值是满足OGNL要求的求值表达式,通常只返回true或false。

2)评估条件property != null或property == null适用于所有类型的字段,用于评估属性的值是否为空。

3)评估条件feature != ''或feature == ''仅适用于字符串类型字段,用于评估是否为空字符串。

4)当有多个评价标准时,用and 或or 连接。嵌套句子可以使用括号进行分组。 and 与 Java 中的 and (&&) 相同或与 or (| Java) |) 相关。

所以上面代码的目的是先判断字段是否为空,然后判断字段是否为空字符串。

最后在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("test@mybatis.tk");
        sysUserList = sysUserMapper.selectByUser(query);
        Assert.assertTrue(sysUserList.size() > 0);

        // 同时按用户民和邮箱查询
        query = new SysUser();
        query.setUserName("ad");
        query.setUserEmail("test@mybatis.tk");
        sysUserList = sysUserMapper.selectByUser(query);
        // 由于没有同时符合这两个条件的用户,因此查询结果数为0
        Assert.assertTrue(sysUserList.size() == 0);
    } finally {
        sqlSession.close();
    }
}

运行测试代码,测试通过,结果日志如下:

DEBUG [main] - ==> 准备:SELECT id , user_name, user_password, user_email , create_time FROM sys_user WHERE 1 = 1 AND user_name LIKE CONCAT('%',?,'%')

DEBUG [main] - ==> 参数: ad(String) TRACE [main] - 参数:test @mybatis.tk(String)

TRACE [main] - 参数:test@ mybatis.tk(String), 1(Long), 1(Long)

DEBUG [main] - 准备: SELECT id, user_name, user_password, user_email, create_time FROM sys_user WHERE id = ?

DEBUG [main] - ==> 参数: 1❀)CE main] - 准备: SELECT id, user_name, user_sword, user_email, create_time FROM sys_user WHERE id = ?

DEBUG [main] - ==> 参数:Long1021 : )

TRACE [head] -

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门