找回密码
 立即注册
首页 业界区 业界 Springboot3同时集成mybatis和mybatis-plus?

Springboot3同时集成mybatis和mybatis-plus?

告陕无 前天 13:38
言归正传,这是个伪命题,请看后文。
为何这么说?盖因开始的时候,我认为mybatis和mybatis-plus可以共存(保留各自的配置,或者换句话就是把原来独自
配置二者的内容简单杂糅在一起,做一些简单的调整),后面探索告诉我,让mybatis和mybatis-plus同时保留配置
可能很很困难也没有必要。
所以,不如说是把mybatis切换为mybatis-plus更加妥当一些!
 
由于某些缘故,必须在原来只使用mybatis中的项目中,加入mybatis-plus,虽然我个人非常讨厌mybatis-plus中plus出来的那一部分。
好消息是,mybatis-plus大概可以看作是mybatis的超集,所以整合的时候,主要解决配置问题即可。
特别说明:本示例中,不存在真正的共存,其实主要用myatis-plus。 
后人有遇到这个情况,建议直接移除mybatis即可,因为Mybatis-plus是超集,不用再模仿此处操作,除非有不得已的苦衷
 
以下内容主要参考:https://www.jb51.net/program/331926jhc.htm
和参考内容不同的是,我的项目中需要使用flowable等功能。
flowable自己倒是用的mybatis(据我所知,比较知名的开源较少用上mybatis-plus这种怪胎)。
 
以下是我的步骤(折腾一番后正确的)
springboot版本3.4.4
一、调整pom配置

修改两个pom文件,一个是所有模块共同依赖的,一个是单独使用flowable的。
公共pom
这个基本同参考的修改:
  1. <dependency>
  2.     <groupId>org.mybatis.spring.boot</groupId>
  3.     mybatis-spring-boot-starter</artifactId>
  4.    
  5.     <exclusions>
  6.         <exclusion>
  7.             <groupId>org.mybatis</groupId>
  8.             mybatis</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.             <groupId>org.mybatis</groupId>
  12.             mybatis-spring</artifactId>
  13.         </exclusion>
  14.     </exclusions>
  15. </dependency>
  16.         
  17. <dependency>
  18.     <groupId>com.baomidou</groupId>
  19.     mybatis-plus-spring-boot3-starter</artifactId>
  20.     <version>${mybatis-plus.version}</version>
  21. </dependency>
  22. <dependency>
  23.     <groupId>com.github.pagehelper</groupId>
  24.     pagehelper-spring-boot-starter</artifactId>
  25.     <exclusions>
  26.         <exclusion>
  27.             <groupId>org.mybatis.spring.boot</groupId>
  28.             mybatis-spring-boot-starter</artifactId>
  29.         </exclusion>
  30.     </exclusions>
  31. </dependency>
复制代码
修改后,和mybatis有关的配置大体如下图:
1.png

这意味着,没有特殊配置,mybatis的自动配置和mybatis-plus的自动配置都会留着。
 
使用flowable的
其它关键做了一点点的调整,在引入flowable的模块中,移除相关mybatis,转而用指定的mybatis,因为flowable自带的mytais版本和其它地方的冲突。
  1. <dependency>
  2.     <groupId>org.mybatis</groupId>
  3.     mybatis</artifactId>
  4.     <version>${mybatis.version}</version>                       
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.flowable</groupId>
  8.     flowable-spring-boot-starter-process</artifactId>
  9.     <exclusions>
  10.         <exclusion>
  11.             <groupId>org.mybatis</groupId>
  12.             mybatis</artifactId>
  13.         </exclusion>
  14.     </exclusions>
  15. </dependency>
复制代码
 
需要注意的是,为了避免mybaits冲突,引入的mybatis,mybatis-plus必须匹配。
上面之所以要移除关联的mybatis就是因为版本冲突导致的。
 
二、移除原来的mybatis配置文件

原来有一个mybatis的配置,主要是配置SqlSessionFactory。现在整个配置类注释(删除也可以)。
只保留mybatis自己的自动配置即可。
 
三、修改yml文件
  1. mybatis-plus:
  2.   #搜索指定包别名,第一个是原来mybatis,第二个是mybatis-plus的
  3.   type-aliases-package: com.redot.hdp.**.mapper,com.redotxxx.flowable.**.plusmapper
  4.   mapperLocations: classpath*:mapper/**/*Mapper.xml  
  5.   configuration:
  6.      map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下
  7.      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
复制代码
 
移出掉了mybatis的配置,合并到mybatis-plus中。而这将导致mybatis的自动配置失效。
四、添加mybatis-plus配置
  1. @AutoConfiguration(before = MybatisPlusAutoConfiguration.class)
  2. @MapperScan(value = {"com.redotxxx.flowable"}, annotationClass = Mapper.class)
  3. public class MybatisPlusAutoConfig {
  4.     //此处略
  5. }
复制代码
plus只扫描plus模块下的。
 
而应用启动的地方不修改,依然只扫描标准mybatis的
  1. @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})
  2. @MapperScan(value = {"com.redotxxx.**.mapper"})
  3. @ComponentScan(value = {"com.redotxxx"} )
  4. public class HdpApplication
复制代码
注意:datasource是手动配置的,所以自动配置的时候移除了DataSourceAutoConfiguration。
 
注意从工程上考虑,应该把application中的这个MapperScan合并到MybatisPlusAutoConifig上。 但是分开也是可以的。
 
五、测试

通过。
 
六、小结

我对于mybatis-plus并没有什么好感,所以一直没有怎么学习,现在也不想,因为只要是我主导的,不可能使用mybatis-plus。
如果plus有什么称道的,就是可以用于快速开发一些简单的,要求不高的项目,也并非一无是处。但是我的项目很少这么单纯的。
我对于具有无数注解的java编程方式已经充满了厌倦,我觉得那样已经过度了。过度的注解违背了工程的基本要求:性能、可维护性等。
 
考虑的性能,有的时候,我都不用mybatis,而是直接用原生jdbc,或者spring-jdbc。
本次,颇为折腾了一些时间,终于可用了。
 
通过这个整合,大概可以得出几个结论:
1、mybatis和mybatis-plus可以共存,通常限于特定情形,例如一方作为另外一方的组件。
2、注解org.mybatis.spring.annotation.MapperScan可以用于一个项目的多个地方,我的例子中就是,分别用于扫描用于mybatis和mybatis-plus的配置
    MapperScan想用几个,用多个地方都可以!
3、当系统移除mybatis有关配置后(包括MybatisProperties类或者yaml中的mybatis属性),那么mybatis的自动配置是不会执行的。也就是说,我的这个例子中
      其实用的就是mybatis-plus的。
     现有版本的mybatisPlus的自动配置基本上是模仿mybatis自动配置,所以如果没有相关配置文件(或者类),那么mybatisplus也不会生效。
4、spring的自动配置机制还是有些灵活的
  1. @org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
  2. @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
  3. @ConditionalOnSingleCandidate(DataSource.class)
  4. @EnableConfigurationProperties(MybatisProperties.class)
  5. @AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
  6. public class MybatisAutoConfiguration implements InitializingBean
复制代码
由于删除了yml中mybatis片段,所以mybatis的自动配置并不会发生,只剩下plus的。在我的项目中保留着mybatis-plus的配置,所以只有plus生效。  
 
如果真想配置两套(什么sessionFactory之类的),那么麻烦很多,有可能不能成功,或者成功了也有许多问题,没有深究过!暂略,不讨论 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册