MyBatis-动态SQL-if-案例

案例

  • 完善更新员工的功能,修改为动态更新员工数据信息
  • 原代码如下:
  •     @Update("update emp\n" +
                "set username   = #{username},\n" +
                "    name=#{name},\n" +
                "    gender=#{gender},\n" +
                "    image=#{image},\n" +
                "    job=#{job},\n" +
                "    entrydate=#{entrydate},\n" +
                "    dept_id=#{deptId},\n" +
                "    update_time=#{updateTime}\n" +
                "where id = #{id};")
        public void Update(Emp emp);
  •     @Test
        public void testUpdate() {
            Emp emp = new Emp();
            emp.setId(18);
            emp.setUsername("TOM");
            emp.setName("汤姆");
            emp.setGender((short) 1);
            emp.setImage("1.jpg");
            emp.setUpdateTime(LocalDateTime.now());
    
            empMapper.Update(emp);
        }
  • 上述代码存在的问题时,当只更新部分信息时,未复制的属性值不会保持未原来的数据,而是会变为null值

  • 完善后的代码如下:

  •         update emp
            <set>
                <if test="name!=null">name =#{name},</if>
                <if test="username!=null">username=#{username},</if>
                <if test="gender!=null">gender=#{gender},</if>
                <if test="image!=null">image=#{image},</if>
                <if test="job!=null">job=#{job},</if>
                <if test="entrydate!=null">entrydate=#{entrydate},</if>
                <if test="deptId!=null">dept_id=#{deptId},</if>
                <if test="updateTime">update_time=#{updateTime}</if>
            </set>
            where id = #{id}
  • 这样就可以保证在更新需要更新的数据的同时,保留未更新的数据,并且上述代码使用了<set>标签,会自动设置删除SQL语句中的多余的,。

小结

  • <if>
    • 用于判断条件是否成立,如果条件为true,则拼接SQL
    • 形式<if test="判断条件">...</if>
  • <where>
    • where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句开头的and或者or
  • <set>
    • 动态地在行首插入SET关键字,并且会删除额外地逗号。(用于update语句中)

猜你喜欢

转载自blog.csdn.net/weixin_64939936/article/details/132113595