Mybatis執(zhí)行Update返回行數(shù)為負(fù)數(shù)的問題
Mybatis執(zhí)行Update返回行數(shù)為負(fù)數(shù)
獲取mybatis的update行數(shù),總是返回負(fù)數(shù)。
在官網(wǎng)上找到原因
是由于defaultExecutorType的引起的,defaultExecutorType有三個(gè)執(zhí)行器SIMPLE、REUSE和BATCH。
其中BATCH可以批量更新操作緩存SQL以提高性能,但是有個(gè)缺陷就是無法獲取update、delete返回的行數(shù)。defaultExecutorType的默認(rèn)執(zhí)行器是SIMPLE。
| 名稱 | 描述 |
|---|---|
| SIMPLE | 執(zhí)行器執(zhí)行其它語句 |
| REUSE | 可能重復(fù)使用prepared statements 語句 |
| BATCH | 可以重復(fù)執(zhí)行語句和批量更新 |
由于項(xiàng)目配置中啟用了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" />
<!-- 查詢時(shí),關(guān)閉關(guān)聯(lián)對(duì)象即時(shí)加載以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 設(shè)置關(guān)聯(lián)對(duì)象加載的形態(tài),此處為按需加載字段(加載字段由SQL指 定),不會(huì)加載關(guān)聯(lián)表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 對(duì)于未知的SQL查詢,允許返回不同的結(jié)果集以達(dá)到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允許使用列標(biāo)簽代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數(shù)據(jù)表的PK生成策略將被覆蓋 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 給予被嵌套的resultMap以字段-屬性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 對(duì)于批量更新操作緩存SQL以提高性能 -->
<!-- defaultExecutorType設(shè)置為BATCH有個(gè)缺陷就是無法獲取update、delete返回的行數(shù) -->
<!-- <setting name="defaultExecutorType" value="BATCH" />-->
<!-- 數(shù)據(jù)庫超過25000秒仍未響應(yīng)則超時(shí) -->
<setting name="defaultStatementTimeout" value="25000" />
<!-- 日志 -->
<!-- <setting name="logImpl" value="SLF4J"/> -->
</settings>
<!-- 注冊(cè)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>
對(duì)應(yīng)的java程序打印數(shù)字

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

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

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

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

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

