mybatis IDEA——where、set和trim用法

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


 

猜你喜欢

转载自blog.csdn.net/Milan__Kundera/article/details/82499553
今日推荐