MyBatis教程:使用if标签创建动态SQL
如何使用if标签创建动态SQL,主要包括以下三种场景:
- 根据查询条件实现动态查询
- 实现特定列的动态更新参数值
- 根据参数值动态添加某些列
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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。