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> <!-- 注冊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)文章
淺談PrintStream和PrintWriter的區(qū)別和聯(lián)系
這篇文章主要介紹了淺談PrintStream和PrintWriter的區(qū)別和聯(lián)系,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Session過期后自動(dòng)跳轉(zhuǎn)到登錄頁面的實(shí)例代碼
這篇文章主要介紹了Session過期后自動(dòng)跳轉(zhuǎn)到登錄頁面實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06如何通過XML方式配置并實(shí)現(xiàn)Mybatis
這篇文章主要介紹了如何通過XML方式配置并實(shí)現(xiàn)Mybatis,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Java實(shí)現(xiàn)將彩色PDF轉(zhuǎn)為灰度PDF的示例代碼
本文以Java代碼為例介紹如何實(shí)現(xiàn)將彩色PDF文件轉(zhuǎn)為灰度(黑白)的PDF文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2022-03-03java 分割csv數(shù)據(jù)的實(shí)例詳解
這篇文章主要介紹了java 分割csv數(shù)據(jù)的實(shí)例詳解的相關(guān)資料,這里提供了簡單實(shí)例,需要的朋友可以參考下2017-07-07Java 遍歷取出Map集合key-value數(shù)據(jù)的4種方法
這篇文章主要介紹了Java 遍歷取出Map集合key-value數(shù)據(jù)的4種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09MyBatis-Plus中最簡單的查詢操作教程(Lambda)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus中最簡單的查詢操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03Java并發(fā)編程之常用的多線程實(shí)現(xiàn)方式分析
這篇文章主要介紹了Java并發(fā)編程之常用的多線程實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了java并發(fā)編程中多線程的相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-02-02Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐
本文主要介紹了Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08