Mybatis執行Update返回行數為負數的問題
Mybatis執行Update返回行數為負數
獲取mybatis的update行數,總是返回負數。
在官網上找到原因
是由於defaultExecutorType的引起的,defaultExecutorType有三個執行器SIMPLE、REUSE和BATCH。
其中BATCH可以批量更新操作緩存SQL以提高性能,但是有個缺陷就是無法獲取update、delete返回的行數。defaultExecutorType的默認執行器是SIMPLE。
名稱 | 描述 |
---|---|
SIMPLE | 執行器執行其它語句 |
REUSE | 可能重復使用prepared statements 語句 |
BATCH | 可以重復執行語句和批量更新 |
由於項目配置中啟用瞭BATCH執行器,UPDATE和DELETE返回的行數就丟失瞭,把執行器改為SIMPLE即可。
通過查看源碼可以發現,batch執行器返回的是最大批量執行條數:
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" /> <!-- 查詢時,關閉關聯對象即時加載以提高性能 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 設置關聯對象加載的形態,此處為按需加載字段(加載字段由SQL指 定),不會加載關聯表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 允許使用列標簽代替列名 --> <setting name="useColumnLabel" value="true" /> <!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數據表的PK生成策略將被覆蓋 --> <setting name="useGeneratedKeys" value="true" /> <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 --> <setting name="autoMappingBehavior" value="FULL" /> <!-- 對於批量更新操作緩存SQL以提高性能 --> <!-- defaultExecutorType設置為BATCH有個缺陷就是無法獲取update、delete返回的行數 --> <!-- <setting name="defaultExecutorType" value="BATCH" />--> <!-- 數據庫超過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程序打印數字
(1)確實更新瞭某些字段的值
表數據:
提交的數據:更新id為1的記錄,
返回的值是1,表示一條被更改
(2)被update但是update前後的數據是一樣的
繼續發送這個,數據,前後的數據一樣
發現雖然沒影響到值,但是返回的值還是1。
(3) 沒有匹配任何數據
請求的數據如下:
此時id為2,返回的數字是0。
所以update返回值是指match匹配到,而執行update語句的數量。
update返回值也是可以為boolean類型,當返回值為0時對應的boolean類型就是false, 如果不為零就是返回true
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。