摘自:https://www.jianshu.com/p/80270b93082a
如果定義一個如下的update
函數,那么這個函數的返回值到底是啥意思呢?是受影響的行數嗎?
驗證之前我們先看看數據庫中的數據記錄。總共兩條數據記錄!
數據庫鏈接配置為:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123456
下面看看我們的單元測試類。
我們根據 ID 獲取記錄,然把用戶名由 root 改為 root001。如果說返回值是影響的行數的話,那么應該返回 1.跟我們的預期結果 1 是相符的。單元測試會通過。
單元測試通過,我們看看數據庫中的記錄有沒有變化。
看起來貌似沒有任何問題。單元測試通過,數據庫的確是只有一條記錄更改了。這說明 mybatis 的 update 操作返回值的確是受影響的行數。
真的是這樣嗎
我們知道當數據庫中的記錄被修改之后,我們在次執行相同的 update 語句將不會影響到數據記錄行數。
按照這個邏輯來講的話,在此執行此單元測試,返回值應該為 0,跟我們的預期值 1 不同,單元測試應該不通過。再次運行單元測試:
我去,單元測試居然神奇般的通過了。。。請注意看,我們在命令行執行 update 語句那張圖,返回的 matched 數量為 1。所以默認情況下,mybatis 的 update 操作的返回值是 matched 的記錄數,並不是受影響的記錄數。
那么有沒有辦法讓 mybatis 的 update 操作的返回值是受影響的行數呢。因為我們業務邏輯中有時會根據這個返回值做業務判斷。答案當然是有的。
修改數據庫鏈接配置為:增加了 useAffectedRows 字段信息。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true jdbc.username=root jdbc.password=123456
再次運行單元測試:
從報錯信息可以清晰的看出,返回值是 0,跟我們的預期值 1 不同。