MyBatis升级踩坑记

前段时间,偶然发现系统某核心模块使用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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Mybatis升级Mybatis Plus需要进行以下步骤: 1. 将Mybatis Plus的jar包添加到项目中。 2. 修改Mybatis的配置文件,将原来的Mybatis配置文件中的mapper标签替换为mybatis-plus的mapper标签。 3. 修改代码中的Mapper接口,继承BaseMapper接口,这样就可以使用Mybatis Plus提供的通用Mapper方法。 4. 修改代码中的Mapper.xml文件,使用Mybatis Plus提供的SQL语法。 5. 根据需要,使用Mybatis Plus提供的其他功能,如分页查询、条件查询等。 需要注意的是,Mybatis Plus虽然提供了很多便利的功能,但也有一些限制,如不支持复杂的嵌套查询等。因此,在使用Mybatis Plus时,需要根据具体情况进行选择。 ### 回答2: Mybatis是一款常用的ORM框架,而Mybatis plus则是在Mybatis基础上进一步封装的一款工具类库,其提供了更为便捷的操作方法和更多的功能扩展。升级Mybatis plus可以带来许多好处,如下所述。 首先,Mybatis plus提供了更为简单易懂的注解式SQL编写方式,能够让我们更加方便快捷地编写SQL语句。在原来使用Mybatis时,需要编写大量的SQL语句来完成数据库的操作。但是,随着业务需求的增加,这些SQL语句的数量可能会呈指数级增长,增加了开发人员的工作量和维护成本。而Mybatis plus采用了注解式的SQL语法,将大部分原本需要编写的SQL语句换成了注解,使得编写SQL语句变得更加简单易懂。 其次,Mybatis plus提供了更为高效的分页查询功能。在原来使用Mybatis分页查询时,通常需要手动计算分页参数,在代码中手动编写分页查询SQL语句,非常繁琐。而在使用Mybatis plus时,我们只需调用Mybatis plus提供的分页插件方法,指定分页参数即可轻松完成分页查询操作。 第三,Mybatis plus提供了更为便捷的代码生成工具,能够快速生成Java实体类、Mapper接口以及XML映射文件。在原来使用Mybatis时,需要手动编写这些代码,而使用Mybatis plus的代码生成工具,则可以自动生成这些代码,大大提高了开发效率。 总之,升级Mybatis plus可以带来更多的便利和扩展性,使得我们能够更加高效地完成开发工作。 ### 回答3: Mybatis Plus是基于Mybatis的增强库,它在Mybatis的基础上增加了许多实用的功能,并简化了Mybatis的使用方式,让开发更加方便快捷。因此,Mybatis Plus的升级可以让我们获得更多的新特性,同时也可以解决一些老版本中存在的bug和问题。 要将Mybatis升级Mybatis Plus,我们需要注意一些重要的变化和升级步骤。首先,需要将原来的Mybatis依赖替换为Mybatis Plus的依赖。在pom.xml文件中添加以下依赖即可: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>最新版本</version> </dependency> ``` 然后,在Mybatis的全局配置文件中,需要将原来的MapperScanner配置修改为Mybatis Plus的MapperScanner配置。例如: ``` <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:mapper/*.xml"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="plugins"> <array> <bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"/> </array> </property> </bean> <!-- MybatisPlus扫描器 --> <bean class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.xxx.entity"/> <property name="mapperLocations" value="classpath*:mapper/*.xml"/> </bean> ``` 还需要将原来Mybatis的Mapper接口修改为Mybatis Plus的Mapper接口。Mybatis Plus提供了BaseMapper类,此类中有许多常用的CURD方法,可以直接使用。例如: ``` public interface UserMapper extends BaseMapper<User> { } ``` 最后,我们可以尝试使用Mybatis Plus提供的新特性,如自动填充、分页插件、性能分析插件等。Mybatis Plus还提供了许多注解和工具类,可以增强我们的开发效率和代码质量。 总的来说,Mybatis升级Mybatis Plus是一个比较简单的过程,但是我们需要注意一些重要的变化和用法。Mybatis Plus提供了很多实用的功能和工具,可以让我们更加高效地进行开发,提高项目的质量和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值