今天碰到一個問題:mybatis 更新時。雖然數據更新成功了,但是返回值是負數(-2147482646),影響了到了程序里面業務的進行,經過分析查閱測試,做如下總結:
Mybatis 內置的 ExecutorType 有3種 SIMPLE [默認], BATCH REUSE SimpleExecutor : 該模式下每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。(可以是Statement或PrepareStatement對象)。 BatchExecutor : 執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理的;BatchExecutor相當於維護了多個桶,每個桶里都裝了很多屬於自己的SQL,就像蘋果藍里裝了很多蘋果,番茄藍里裝了很多番茄,最后,再統一倒進倉庫。(可以是Statement或PrepareStatement對象)。 ReuseExcutor : 執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置於Map<String, Statement>內,供下一次使用。(可以是Statement或PrepareStatement對象)。 原因分析:返回負數,是由於org.mybatis.spring.SqlSessionTemplate類 中的ExecutorType 設置的引起的,檢查下自己的SqlSessionTemplate bean 配置是不是配置成了 BATCH,如果是請繼續往下看。
解決方式: 在 Spring 配置文件中,做如下修改
<!-- 通用session模板 --> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> <constructor-arg name="executorType" value="SIMPLE"></constructor-arg> <!-- 配置一個可以執行批量的sqlSession, 其中BATCH可以批量更新操作緩存SQL以提高性能,但是有個缺陷就是無法獲取update、delete返回的行數--> <!-- <constructor-arg name="executorType" value="BATCH"></constructor-arg>--> </bean>
另外提一點:
在默認情況下,mybatis 的 update 操作返回值是記錄的 matched 的條數,並不是影響的記錄條數。mybatis 僅僅只是返回的數據庫連接驅動(通常是 JDBC )的返回值,也就是說返回值並不一定是受影響的數據條數。 我們可以通過對 JDBC URL 顯式的指定 useAffectedRows 選項,我們將可以得到受影響的記錄的條數: jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true 例如: jdbc:mysql://localhost:3306/test?useAffectedRows=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
轉 : https://blog.csdn.net/HSH205572/article/details/93403886