MyBatis升级踩坑记

来源:互联网 发布:spark 推荐算法 编辑:程序博客网 时间:2024/06/16 01:33

前段时间,偶然发现系统某核心模块使用for循环插入数据,遂想进行优化,一次批量插入是个不错的方案,可能可以提高插入速度,肯定可以节约数据库连接。系统用ORM框架MyBatis做DAO,考虑用MyBatis自带批量提交功能实现,so easy对吧,但接下来坑一个接一个,想也想不到。

坑一,业务功能需要依赖插入记录返回记录id进行下一步操作,单条记录插入返回id很简单,配置useGeneratedKeys=”true” keyProperty=”studId”就好;但多条记录用MyBatis的foreach插入,返回的id却是null,很没道理。问同事,他之前也尝试过,发现不行,没有深究也说不出个所以然。经查资料,发现这是MyBatis的bug,mybatis3.3.1之前版本,有批量提交不写回id的bug。参考资料,
祖大俊的博客
GitHub上MyBatis这个bug
升级MyBatis到3.3.1版本,跨过第一个坑,前途漫漫…..

坑二,项目启动报错,错误信息如下,

Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare

经查,项目用到自定义Interceptor,自定义Interceptor类有注解,原注解

@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class}) })

prepare方法签名在新版本已修改,增加一个Integer参数,新注解

@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) }

满心欢喜再次运行,还是不行,不过这次换了个错,这个坑算是过了。

坑三,启动报SpringManagedTransaction错,具体信息如下,

Exception in thread "main" java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer

什么原因呢?原来项目还用到mybatis-spring,前面升级mybatis,没有对应升级mybatis-spring,mybatis-spring版本不够高导致报错,升到1.3.1就好了。
版本问题解决,这样可以了吧!再次运行,不好意思,继续踩坑。

坑四,报不合法对比错误,具体错误信息如下,

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:   ### Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String  ### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

什么原因呢?经查,mapper文件语句报错,具体语句如下,

<if test="endTime != null and endTime !='' " >  report_date < #{endTime}  </if> 

endTime !=”,这个对比报错,因为mybatis 3.3.0之后版本对时间参数进行比较时,如果将传入时间类型参数与空字符串进行对比则会引发异常。有人说是mybatis的bug,我觉得不是,因为最新版本3.4.1也有这个问题,可能是新版本mybatis引入了更强的机制。

至此,连踩四个坑后,我决定放弃这次升级,原因是,一方面,项目中有好多endTime !=”这种写法,马上要提测版本,一个个修改不现实;另一方面,考虑到可能还有其他未踩到的坑。权衡风险和收益,还是不做升级的好。

通过这次踩坑经历,我自己总结出两点经验,
1. 不要在提版前做大改动,如修改核心模块、升级依赖库等;
2. 不要太相信开源库,如mybatis代码维护质量还是不高,没有考虑向前兼容,自己做项目要注意。

0 0
原创粉丝点击