美文网首页
十、使用动态SQL实现更新操作

十、使用动态SQL实现更新操作

作者: lifeline张 | 来源:发表于2018-08-26 17:09 被阅读0次

    一、本课目标

    • 掌握使用if+set完成更新操作
    • 掌握使用if+trim完成更新操作

    二、if + set

    在之前的更新操作中,sql语句如下:

    <update id="modify" parameterType="user">
            update smbms_user set userCode=#{userCode},
            userName=#{userName},userPassword=#{userPassword},
            gender=#{gender},phone=#{phone},address=#{address},
            userRole=#{userRole},modifyBy=#{modifyBy},
            modifyDate=#{modifyDate} where id=#{id}
        </update>
    

    传进来的参数类型是实体类,sql语句对每一个字段都进行了更新,但是在实际情况中,用户并不是对每个字段都修改了的。所以可以进行一下判断,如果某个字段传进来的值为空,那就不需要set了。
    在之前xml配置文件基础上,测试代码如下时:

    @Test
        public void testModify() {
            logger.debug("testAdd-------------------");
            SqlSession sqlSession = null;
            int count = 0;
            sqlSession = MyBatisUtil.createSqlSession();
            User user = new User();
            try {
                user.setId(16);
            //  user.setUserCode("001_M");
                user.setUserName("测试用户001_M");
                user.setAddress("测试地址_M");
            //  user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2018-8-25"));
            //  user.setGender(1);
            //  user.setUserPassword("123456");
            //  user.setPhone("13526543651");
            //  user.setUserRole(1);
                user.setModifyBy(1);
                user.setModifyDate(new Date());
                count = sqlSession.getMapper(UserMapper.class).modify(user);
                sqlSession.commit();
            } finally {
                MyBatisUtil.closeSqlSession(sqlSession);
            }
            logger.debug(count);
        }
    

    运行结果:

    image.png
    数据库:
    image.png
    可以看到对于没有传进去参数的字段,都直接设置为null了,这当然是错误的。
    也就是说,在这种情况下,更新用户表数据时,若某个参数为null,会导致更新错误。

    解决方式是使用set+if做判断,修改后的xml文件如下:

    <update id="modify" parameterType="user">
            update 
                smbms_user 
            <set>
                <if test="userCode != null">userCode=#{userCode},</if>
                <if test="userName != null">userName=#{userName},</if>
                <if test="userPassword != null">userPassword=#{userPassword},</if>
                <if test="gender != null">gender=#{gender},</if>
                <if test="phone != null">phone=#{phone},</if>
                <if test="address != null">address=#{address},</if>
                <if test="userRole != null">userRole=#{userRole},</if>
                <if test="modifyBy != null">modifyBy=#{modifyBy},</if>
                <if test="modifyDate != null">modifyDate=#{modifyDate},</if>
            </set>
             where id=#{id}
        </update>
    

    测试代码:

    @Test
        public void testModify() {
            logger.debug("testAdd-------------------");
            SqlSession sqlSession = null;
            int count = 0;
            sqlSession = MyBatisUtil.createSqlSession();
            User user = new User();
            try {
                user.setId(14);
            //  user.setUserCode("001_M");
                user.setUserName("测试用户001_M");
                user.setAddress("测试地址_M");
            //  user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2018-8-25"));
            //  user.setGender(1);
            //  user.setUserPassword("123456");
            //  user.setPhone("13526543651");
            //  user.setUserRole(1);
                user.setModifyBy(1);
                user.setModifyDate(new Date());
                count = sqlSession.getMapper(UserMapper.class).modify(user);
                sqlSession.commit();
            } finally {
                MyBatisUtil.closeSqlSession(sqlSession);
            }
            logger.debug(count);
        }
    

    运行之后结果正确,数据库结果也正确。


    image.png

    注:在set标签里面的if标签里面,后面要加上逗号,最后一个也加上,set标签有自动剔除功能。

    三、if+trim

    使用if+trim替代if+set进行更新用户表数据,效果一样。


    image.png

    xml配置文件如下:

    <update id="modify" parameterType="user">
            update 
                smbms_user 
            <trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
                <if test="userCode != null">userCode=#{userCode},</if>
                <if test="userName != null">userName=#{userName},</if>
                <if test="userPassword != null">userPassword=#{userPassword},</if>
                <if test="gender != null">gender=#{gender},</if>
                <if test="phone != null">phone=#{phone},</if>
                <if test="address != null">address=#{address},</if>
                <if test="userRole != null">userRole=#{userRole},</if>
                <if test="modifyBy != null">modifyBy=#{modifyBy},</if>
                <if test="modifyDate != null">modifyDate=#{modifyDate},</if>
            </trim>
        </update>
    

    运行结果正常。


    image.png

    四、小结

    image.png

    相关文章

      网友评论

          本文标题:十、使用动态SQL实现更新操作

          本文链接:https://www.haomeiwen.com/subject/crboiftx.html