where标签
如果该标签包含的元素有返回值,就插入一个where;如果where后面的字符串以And或者Or开头,就将它们剔除。
<select id="queryByUser3" resultType="SysUser">
select id,
user_name,
user_password,
user_email,
create_time
from sys_user
<where>
<if test="userName != null and userName != ''">
and user_name like concat('%',#{userName},'%')
</if>
<if test="userEmail != null and userEmail != ''">
and user_email = #{userEmail}
</if>
</where>
</select>
测试类
@Test
public void testQueryByUser3(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser query = new SysUser();
query.setUserName("a");
List<SysUser> users = userMapper.queryByUser2(query);
Assert.assertTrue(users.size() > 0);
query = new SysUser();
query.setUserEmail("[email protected]");
users = userMapper.queryByUser2(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 user_name like concat('%',?,'%')
DEBUG [main] - ==> Parameters: a(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 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
set标签
如果该标签包含的元素有返回值,就插入一个set;如果set后面的字符串以逗号结尾,就将逗号剔除。
<!-- set标签,如果set元素中没有内容,无法避免sql错误,id = #{id}必须要写 -->
<update id="updateByIdSelective2">
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}
</set>
where id = #{id}
</update>
测试类
@Test
public void testUpdateByIdSelective2(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser user = new SysUser();
user.setId(1L);
//只更新Email
user.setUserEmail("[email protected]");
user.setUserPassword("13");
int result = userMapper.updateByIdSelective2(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_password = ?, user_email = ?, id = ? where id = ?
DEBUG [main] - ==> Parameters: 13(String), [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, 13, [email protected], 2018-01-01 00:00:00.0
DEBUG [main] - <== Total: 1
trim标签
where 和set 标签的功能都可以用trim 标签来实现,并且在底层就是通过TrimSqlNode实现的。
where标签对应trim的实现如下:
<trim prefix=”WHERE” prefixOverrides=”AND |OR ”>
</trim>
注意: AND和OR后面的空格不能省略,为了避免匹配到andes、 orders等单词。
实际的prefixOverrides包含“AND”、“OR”、“AND\n”、“OR\n”、“AND\r”、“OR\r”、
“AND\t”、 “OR\t”, 不仅仅是上面提到的两个带空格的前缀。
set标签对应的trim实现如下。
<trim prefix=”SET” suffixOverrides=”,”>
</trim>
trim标签有如下属性:
prefix:当trim元素内包含内容时,会给内容增加prefix指定的前缀。
prefixOverrides:当trim元素内包含内容时,会把内容中匹配的前缀字符串去掉。
suffix:当trim元素内包含内容时,会给内容增加suffix指定的后缀。
suffixOverrides:当trim元素内包含内容时,会把内容中匹配的后缀字符串去掉。
<update id="updateByIdSelectiveUseSet">
update sys_user
<trim prefix="SET" suffixOverrides=",">
<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="createTime1 != null">
create_time=#{createTime1},
</if>
id = #{id}
</trim>
where id=#{id}
</update>
测试类
@Test
public void testUpdateByIdSelectiveUseSet(){
try(SqlSession session = this.getSqlSession()){
SysUserDao userDao = session.getMapper(SysUserDao.class);
SysUser user = new SysUser();
user.setId(1001L);
user.setUserName("test2");
int result = userDao.updateByIdSelectiveUseSet(user);
System.out.println(result);
}
}
日志
DEBUG [main] - ==> Preparing: update sys_user SET user_name = ?, id = ? where id=?
DEBUG [main] - ==> Parameters: test2(String), 1001(Long), 1001(Long)
DEBUG [main] - <== Updates: 1
1