if标签
如何实现用户高级查询功能,根据输入的条件查询用户信息,需要支持以下3种情况:
A. 当只输入用户名时,需要根据用户名来进行模糊查询
B. 当只输入邮箱时,根据邮箱进行完全匹配
C. 当同时输入用户名和邮箱时,同时用这两个条件来查询匹配的用户
(1) 在where条件中使用if
<select id="queryByUser" resultType="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>
测试类
@Test
public void testQueryByUser(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser query = new SysUser();
query.setUserName("ad");
List<SysUser> users = userMapper.queryByUser(query);
Assert.assertTrue(users.size() > 0);
query = new SysUser();
query.setUserEmail("[email protected]");
users = userMapper.queryByUser(query);
Assert.assertTrue(users.size() > 0);
query = new SysUser();
query.setUserName("ad");
query.setUserEmail("[email protected]");
users = userMapper.queryByUser(query);
Assert.assertTrue(users.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], 2018-01-01 00:00:00.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], 2018-01-01 00:00:00.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_name like concat('%',?,'%') and user_email = ?
DEBUG [main] - ==> Parameters: ad(String), [email protected](String)
DEBUG [main] - <== Total: 0
(2) 在update更新列中使用if,注意一定要加id = #{id}
<update id="updateByIdSelective">
update sys_user
set
<if test="userName != null and userName != ''">
user_name = #{userName},
</if>
<if test="userPassword != null and userPassword != ''">
user_password = #{userPassword},
</if>
<if test="userEmail != null and userEmail != ''">
user_email = #{userEmail},
</if>
<if test="createTime != null and createTime != ''">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
id = #{id}
where id = #{id}
</update>
测试
@Test
public void testUpdateByIdSelective(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser user = new SysUser();
user.setId(1L);
//只更新Email
user.setUserEmail("[email protected]");
int result = userMapper.updateByIdSelective(user);
Assert.assertEquals(1, result);
user = userMapper.queryById(1L);
//修改后名字不变,邮箱改变
Assert.assertEquals("admin", user.getUserName());
Assert.assertEquals("[email protected]", user.getUserEmail());
}finally{
sqlSession.close();
}
}
日志
DEBUG [main] - ==> Preparing: update sys_user set user_email = ?, id = ? where id = ?
DEBUG [main] - ==> Parameters: [email protected](String), 1(Long), 1(Long)
DEBUG [main] - <== Updates: 1
DEBUG [main] - ==> Preparing: select * from sys_user where id = ?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, user_name, user_password, user_email, create_time
TRACE [main] - <== Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0
DEBUG [main] - <== Total: 1
(3) 在insert动态插入列中使用if
<insert id="insertSelective" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(user_name,user_password,
<if test="userEmail != null and userEmail != ''">
user_email,
</if>
create_time)
values(#{userName},#{userPassword},
<if test="userEmail != null and userEmail != ''">
#{userEmail},
</if>
#{createTime,jdbcType=TIMESTAMP})
</insert>
测试类
@Test
public void testInsertSelective(){
try(SqlSession session = this.getSqlSession()){
SysUserDao userDao = session.getMapper(SysUserDao.class);
SysUser user = new SysUser();
user.setUserName("张三");
int result = userDao.insertSelective(user);
session.commit();
System.out.println(result);
}
}
日志
DEBUG [main] - ==> Preparing: insert into sys_user(id,user_name,user_password, create_time) values(?,?,?, ?)
DEBUG [main] - ==> Parameters: null, 张三(String), null, null
DEBUG [main] - <== Updates: 1
1
choose标签
if标签无法提供if…else if…else..的逻辑,如果需要这样的逻辑,就需要用到choose标签。
实现根据id或者用户名查询用户
<!-- 根据Id或者用户名来查询数据 -->
<select id="queryByIdOrUserName" resultType="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 = 0
</otherwise>
</choose>
</select>
测试类
@Test
public void testQueryByIdOrUsername(){
try(SqlSession session = this.getSqlSession()){
SysUserDao userDao = session.getMapper(SysUserDao.class);
SysUser user = new SysUser();
user.setUserName("t");
user.setId(1L);
List<SysUser> list = userDao.queryByIdOrUsername(user);
System.out.println(list);
}
}
日志
DEBUG [main] - Cache Hit Ratio [com.etc.dao.SysUserDao]: 0.0
DEBUG [main] - ==> Preparing: select * from sys_user where 1 = 1 and id = ?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, user_name, user_password, user_email, create_time
TRACE [main] - <== Row: 1, admin, 123456, [email protected], 2018-01-01 00:00:00.0
Mon Jan 01 00:00:00 CST 2018
DEBUG [main] - <== Total: 1
[SysUser{id=1, userName='admin', userPassword='123456', userEmail='[email protected]', createTime1=Mon Jan 01 00:00:00 CST 2018, roles=null, role=null}]