MyBatis教程:使用select、where、set标签生成动态Sql
如何使用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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。