Mybatis執(zhí)行Update返回行數(shù)為負數(shù)的問題
Mybatis執(zhí)行Update返回行數(shù)為負數(shù)
獲取mybatis的update行數(shù),總是返回負數(shù)。
在官網(wǎng)上找到原因
是由于defaultExecutorType的引起的,defaultExecutorType有三個執(zhí)行器SIMPLE、REUSE和BATCH。
其中BATCH可以批量更新操作緩存SQL以提高性能,但是有個缺陷就是無法獲取update、delete返回的行數(shù)。defaultExecutorType的默認執(zhí)行器是SIMPLE。
| 名稱 | 描述 |
|---|---|
| SIMPLE | 執(zhí)行器執(zhí)行其它語句 |
| REUSE | 可能重復使用prepared statements 語句 |
| BATCH | 可以重復執(zhí)行語句和批量更新 |
由于項目配置中啟用了BATCH執(zhí)行器,UPDATE和DELETE返回的行數(shù)就丟失了,把執(zhí)行器改為SIMPLE即可。
通過查看源碼可以發(fā)現(xiàn),batch執(zhí)行器返回的是最大批量執(zhí)行條數(shù):
public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002;
public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
final Configuration configuration = ms.getConfiguration();
final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
final BoundSql boundSql = handler.getBoundSql();
final String sql = boundSql.getSql();
final Statement stmt;
if (sql.equals(currentSql) && ms.equals(currentStatement)) {
int last = statementList.size() - 1;
stmt = statementList.get(last);
BatchResult batchResult = batchResultList.get(last);
batchResult.addParameterObject(parameterObject);
} else {
Connection connection = getConnection(ms.getStatementLog());
stmt = handler.prepare(connection);
currentSql = sql;
currentStatement = ms;
statementList.add(stmt);
batchResultList.add(new BatchResult(ms, sql, parameterObject));
}
handler.parameterize(stmt);
handler.batch(stmt);
return BATCH_UPDATE_RETURN_VALUE;
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局映射器啟用緩存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查詢時,關閉關聯(lián)對象即時加載以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 設置關聯(lián)對象加載的形態(tài),此處為按需加載字段(加載字段由SQL指 定),不會加載關聯(lián)表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 對于未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允許使用列標簽代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數(shù)據(jù)表的PK生成策略將被覆蓋 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 給予被嵌套的resultMap以字段-屬性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 對于批量更新操作緩存SQL以提高性能 -->
<!-- defaultExecutorType設置為BATCH有個缺陷就是無法獲取update、delete返回的行數(shù) -->
<!-- <setting name="defaultExecutorType" value="BATCH" />-->
<!-- 數(shù)據(jù)庫超過25000秒仍未響應則超時 -->
<setting name="defaultStatementTimeout" value="25000" />
<!-- 日志 -->
<!-- <setting name="logImpl" value="SLF4J"/> -->
</settings>
<!-- 注冊mybatis插件 -->
<plugins>
<!-- mysql分頁插件 -->
<plugin interceptor="com.rvho.mybatis.interceptor.MybatisPageInterceptor">
<property name="databaseType" value="mysql"/>
</plugin>
</plugins>
</configuration>
Mybatis Update返回值
mybatis sql:
<update id="test" parameterType="map">
update test_0731 set name = #{params.name}, age = #{params.age} where id = ${params.id}
</update>
對應的java程序打印數(shù)字

(1)確實更新了某些字段的值
表數(shù)據(jù):

提交的數(shù)據(jù):更新id為1的記錄,

返回的值是1,表示一條被更改
(2)被update但是update前后的數(shù)據(jù)是一樣的
繼續(xù)發(fā)送這個,數(shù)據(jù),前后的數(shù)據(jù)一樣

發(fā)現(xiàn)雖然沒影響到值,但是返回的值還是1。
(3) 沒有匹配任何數(shù)據(jù)
請求的數(shù)據(jù)如下:

此時id為2,返回的數(shù)字是0。
所以update返回值是指match匹配到,而執(zhí)行update語句的數(shù)量。
update返回值也是可以為boolean類型,當返回值為0時對應的boolean類型就是false, 如果不為零就是返回true
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報錯:Not allowed to load local
這篇文章主要介紹了基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報錯:Not allowed to load local resource),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
SpringBoot優(yōu)雅實現(xiàn)計算方法執(zhí)行時間
這篇文章主要為大家詳細介紹了SpringBoot中優(yōu)雅實現(xiàn)計算方法執(zhí)行時間的相關方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-04-04
java返回前端實體類json數(shù)據(jù)時忽略某個屬性方法
這篇文章主要給大家介紹了關于java返回前端實體類json數(shù)據(jù)時忽略某個屬性的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2023-08-08
logback ThrowableProxyConverter類源碼流程解析
這篇文章主要為大家介紹了logback ThrowableProxyConverter類源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
IDEA?高版本?PlantUML?插件默認主題修改的詳細過程
PlantUML 是非常不錯的使用腳本畫圖的工具,效率很高,很多人會選擇在 IDEA 中安裝 PlantUML Integration 插件,這篇文章主要介紹了IDEA?高版本?PlantUML?插件默認主題修改,需要的朋友可以參考下2022-09-09
springboot項目實現(xiàn)定時備份數(shù)據(jù)庫導出sql文件方式
這篇文章主要介紹了springboot項目實現(xiàn)定時備份數(shù)據(jù)庫導出sql文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
SpringBoot使用prometheus監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03

