1. 程式人生 > 實用技巧 >MyBatis--動態SQL(在updae更新列中使用if)

MyBatis--動態SQL(在updae更新列中使用if)

  假設需求:只更新有變化的欄位,不能將原來有值但沒有發生變化的欄位更新為空或null。

在UserMapper介面中增加對應的介面方法,程式碼如下:

1  /**
2      * 根據主鍵更新
3      * @param sysUser
4      * @return
5      */
6     int updateById(SysUser sysUser);

XML檔案SQL

 1 <update id="updateById">
 2         update sys_user
 3         set 
 4         <if test="
userName != null and userName !=''"> 5 user_name =#{userName}, 6 </if> 7 <if test="userPassword != null and userPassword != ''"> 8 user_password =#{userPassword}, 9 </if> 10 <if test="userEmail != null and userEmail != ''
"> 11 user_email =#{userEmail}, 12 </if> 13 <if test="userInfo != null and userInfo != ''"> 14 user_info =#{userInfo}, 15 </if> 16 <if test="headImg != null"> 17 head_img =#{headImg}, 18 </if> 19
<if test="createTime != null"> 20 create_time =#{createTime}, 21 </if> 22 id =#{id} 23 where id =#{id} 24 </update>

  這裡需要結合業務層的邏輯判斷,確保最終產生的SQL語句沒有語法錯誤。這裡需要注意的有兩點:第一是每個if元素裡面SQL語句後面的逗號;第二點就是where關鍵字前面的id =#{id}這個條件。

  第一種情況:

  第二種情況:

測試類新增測試方法

 1   @Test
 2     void test3(){
 3         //建立一個新的SysUser物件
 4         SysUser user = new SysUser();
 5         //更新id = 1005L的使用者
 6          user.setId(1005L);
 7          //更新郵箱
 8          user.setUserEmail("[email protected]");
 9          //result執行的是SQL影響的行數
10          int result = userMapper.updateById(user);
11          //根據當前id查詢修改後的資料
12          user = userMapper.selectById(1005L);
13         System.out.println(user);
14         }

右鍵執行test3()方法後,如下圖,可以看到id=1005的使用者郵箱已修改