Mybatis3.4.0不支援mybatis-spring1.2.5及以下版本
阿新 • • 發佈:2019-02-16
今天將工程的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),居然出現了不相容情況,官方好像並不打算去相容,我們開發人員需要自己去注意了。