案例
- 完善更新员工的功能,修改为动态更新员工数据信息
- 原代码如下:
-
@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);
-
@Testpublic 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语句中)