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

MyBatis教程:使用select、where、set标签生成动态Sql

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

如何使用select、where、set标签生成动态Sql。

1。 selectUsage

假设存在以下情况:当id参数有值时,首先使用id查询。当id没有值时,将判断username是否有值。如果有值,则使用用户名进行查询。 ,如果没有值,查询将不返回任何结果。

首先我们在SysUserMapper接口中添加如下方法:

/**
 * 根据用户id或用户名查询
 *
 * @param sysUser
 * @return
 */
SysUser selectByIdOrUserName(SysUser sysUser);

然后在对应的SysUserMapper.xml中添加如下代码:

<select id="selectByIdOrUserName" resultType="com.zwwhnly.mybatisaction.model.SysUser">
    SELECT  id,
            user_name,
            user_password,
            user_email,
            create_time
    FROM sys_user
    WHERE 1 = 1
    <choose>
        <when test="id != null">
            AND id = #{id}
        </when>
        <when test="userName != null and userName != ''">
            AND user_name = #{userName}
        </when>
        <otherwise>
            AND 1 = 2
        </otherwise>
    </choose>
</select>

注意:

上面的代码中,如果没有其他限制的话,当id和username都为null时,会询问所有用户,但是我们的接口SysUser返回值。当查询结果较多时,会报错。加上其他情况后,由于形势不利,本案不存在有争议的结果。

最后,在SysUserMapperTest测试类中添加以下测试方法:

@Test
public void testSelectByIdOrUserName() {
    SqlSession sqlSession = getSqlSession();

    try {
        SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);

        // 按id查询
        SysUser query = new SysUser();
        query.setId(1L);
        query.setUserName("admin");
        SysUser sysUser = sysUserMapper.selectByIdOrUserName(query);
        Assert.assertNotNull(sysUser);

        // 只按userName查询
        query.setId(null);
        sysUser = sysUserMapper.selectByIdOrUserName(query);
        Assert.assertNotNull(sysUser);

        // id 和 userName 都为空
        query.setUserName(null);
        sysUser = sysUserMapper.selectByIdOrUserName(query);
        Assert.assertNull(sysUser);
    } finally {
        sqlSession.close();
    }
}

运行测试代码,测试通过,日志输出如下:

DEBUG [main] - ==>Prepare: SELECT id , user_name, user_password, user_email , create_time FROM sys_user WHERE 1 = 1 AND id = ?

DEBUG [main] - ==> 参数: 1(Long)

TRACE [main] - 参数: 1(Long)♷main] -

版权声明

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

发表评论:

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

热门