1. 程式人生 > >Mybatis3.4.0不支援mybatis-spring1.2.5及以下版本

Mybatis3.4.0不支援mybatis-spring1.2.5及以下版本

今天將工程的Mybatis的版本由3.3.0升級到3.4.0導致程式執行錯誤,使用的mybatis-spring版本是1.2.3,錯誤內容如下,最後發現是SpringManagedTransaction類中沒有getTimeout函式,所以導致這個錯誤出現。

java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;
	at org.apache.ibatis.executor.BatchExecutor.doQuery(BatchExecutor.java:91)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
	at com.tianjunwei.page.PageInterceptor.intercept(PageInterceptor.java:87)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy19.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:408)
	at com.sun.proxy.$Proxy16.selectList(Unknown Source)

接下來我們分析以下mybatis由3.3.0到3.4.0升級所發生的變化,我們看到報錯的地方是BatchExecutor的doQuery方法。

mybatis 3.3.0原始碼如下:


mybatis 3.4.0原始碼如下:

通過上圖我們看到,mybatis3.4.0下StatementHandler的prepare方法添加了一個timeout引數,並且這個引數是通過transaction獲得的,在spring和mybatis結合使用時,transaction應該是SpringManagedTransaction,接下來我們分析一下mybatis-spring的SpringManagedTransaction類的不同。

在mybatis-spring的1.2.3中沒有getTimeout函式

在mybatis-spring的1.3.0版本中有getTimeout函式


現在看來mybatis的3.4.0及以上版本只支援mybatis-spring1.3.0及以上版本(現在最新是1.3.0),居然出現了不相容情況,官方好像並不打算去相容,我們開發人員需要自己去注意了。