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



今天将工程的Mybatis的版本由3.3.0升级到3.4.0导致程序运行错误,使用的mybatis-spring版本是1.2.3,错误内容如下,最后发现是SpringManagedTransaction类中没有getTimeout函数,所以导致这个错误出现。

  1. java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;  
  2.     at org.apache.ibatis.executor.BatchExecutor.doQuery(BatchExecutor.java:91)  
  3.     at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)  
  4.     at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)  
  5.     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)  
  6.     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)  
  7.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  8.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)  
  9.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  10.     at java.lang.reflect.Method.invoke(Method.java:497)  
  11.     at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)  
  12.     at com.tianjunwei.page.PageInterceptor.intercept(PageInterceptor.java:87)  
  13.     at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)  
  14.     at com.sun.proxy.$Proxy19.query(Unknown Source)  
  15.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)  
  16.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  17.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)  
  18.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  19.     at java.lang.reflect.Method.invoke(Method.java:497)  
  20.     at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:408)  
  21.     at com.sun.proxy.$Proxy16.selectList(Unknown Source)  
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),居然出现了不兼容情况,官方好像并不打算去兼容,我们开发人员需要自己去注意了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值