Ruoyi框架集成Mybatis-plus问题

本文记录了使用MybatisPlus(MP)进行数据同步时遇到的问题及解决方案。主要涉及批量插入性能优化,包括在主键字段上添加@TableId注解,处理params字段的@TableField注解,以及解决saveBatch方法耗时过长的问题。通过@TableField(insertStrategy=FieldStrategy.IGNORED)注解解决了因空值导致的SQL不同步问题,但性能仍较慢,可能与表字段数量过多有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做数据同步,由于表的字段太多,不想手撸SQL,所以就集成了一下MP;具体的方法Ruoyi文档里都有。这里就是记录下遇到的一些问题及个人的解决方案。

1.在主键字段上加上@TableId(value = "xxx")的注解;

2. 在BaseEntity类的 params字段上,加上@TableField(exist = false)的注解。否则调用MP 的 IService.saveBatch方法时,会报错“Type handler was null on parameter mapping for property 'params‘ ”。

3.调用saveBatch方法,耗时很久。3w多条数据,耗时8w多毫秒。然后上网搜,说要在jdbc连接串上加上&rewriteBatchedStatements=true,这个属性就是让jdbc驱动去批量提交sql,说加上后速度就嗖嗖的。然而我的耗时毫无变化,又去搜为啥没效果,啥也没搜到,最后看到了一篇文章 MybatisPlus批量保存原理及失效原因排查_八球的博客-CSDN博客_mybatis plus 批量保存 。

得到的结论就是,saveBatch时,MP会把语句完全相同的sql分成一组,然后去批量提交。但是它拼接sql时会把空值的字段忽略掉,这样可能会导致每条数据的sql都不一样,那么就还是会一条一条的提交。然后结合我自己的情况,我的表都好几十个字段,而且空值分布不均匀,那么应该就是这个原因。然后看控制台打印的sql,确实都不太一样。

解决方案就是在可能为空的字段上加上@TableField(insertStrategy = FieldStrategy.IGNORED)的注解,这个注解会让MP在拼接insert的sql时,不考虑这个字段是否为空,都会拼进去。然后我直接在所有字段上都加了这个注解。

最后3w多条数据,大概2w毫秒左右。其实还是很慢,看网上说,加了rewriteBatchedStatements属性后,1w条数据大概就耗时500毫秒。而我这个慢了10倍多,最后也没找到原因以及优化方案。大概可能跟我的表字段较多有关吧。

### RuoYi SpringCloud 集成 MyBatis Plus 示例教程 #### 一、引入依赖 为了使RuoYi Spring Cloud项目能够顺利集成MyBatis Plus,在项目的`pom.xml`文件中添加如下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 此版本号需依据实际需求调整,确保与当前使用的Spring Boot版本兼容[^1]。 #### 二、配置数据源 编辑`application.yml`文件来设置数据库连接参数以及开启分页插件功能。这一步骤对于任何基于Spring Boot的应用程序来说都是必要的,尤其是在集成了像MyBatis这样的持久层框架之后[^2]。 ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto mapper-locations: classpath*:mapper/*.xml ``` 以上配置不仅指定了MySQL作为目标数据库及其访问凭证,还启用了日志记录以便于调试,并设置了全局ID生成策略为自动增长模式。最后通过`mapper-locations`属性告知MyBatis去哪里寻找映射器XML文件。 #### 三、创建实体类和服务接口 假设要管理用户表,则先定义对应的JavaBean——User.java;接着编写Service层逻辑,即UserService.java。值得注意的是,得益于MyBatis Plus提供的基类支持,很多CRUD方法已经预先实现了,开发者只需关注业务特有部分即可。 ```java // User.java @Data public class User { private Long id; private String name; @TableField(fill = FieldFill.INSERT_UPDATE) private Date createTime; } // UserService.java @Service public interface IUserService extends IService<User> { } ``` 上述代码片段展示了如何利用Lombok简化getter/setter书写工作量的同时,借助@TableField注解标注字段填充规则。而IUserService继承自IService接口意味着可以直接调用诸如save()、removeById()等便捷API完成基本的数据操作。 #### 四、使用自定义查询注解优化开发体验 考虑到复杂查询场景下的灵活性考量,可以考虑采用由RuoYi Vue Pro团队贡献的一系列增强型注解[@QueryCriteria, @Query, @Criteria]来进行条件组合构建,从而减少手写SQL带来的风险并提高编码效率[^3]。 例如: ```java @Select("SELECT * FROM user WHERE ${ew.customSqlSegment}") @Where(value="name like #{searchName}", condition="${condition} LIKE") List<User> selectUsers(@Param("searchName")String searchName,@Param("condition")String condition); ``` 该例子说明了怎样混合运用原生SQL片断与动态拼接机制达成灵活多变的效果。不过需要注意的是,这种方式虽然强大但也容易引发潜在的安全隐患(如SQL注入攻击),因此务必谨慎评估应用场景后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值