mybatis-spring-boot-starter&mybatis-plus-boot-starter

引子

        在一个spring项目中发现同时引用了mybatis-spring-boot-starter、mybatis-plus-boot-starter,这两个starter需要同时引用?

看了一下mybatis-plus-boot-starter的pom,发现它已经引用了mybatis-spring;

另外去yBatis Plus https://baomidou.com/ 官网看了一下文档,

仅提到了需要添加依赖mybatis-plus-boot-starter;

既然这样果断移除mybatis-spring-boot-starter,启动一下项目没有任何异常,访问数据库也一切正常。

但移除mybatis-spring-boot-starter之前,项目也可以正常访问。那么多引用会对有什么影响呢?分析一下吧!

mybatis-spring-boot-starter

在其包中可以看到仅引用了mybatis-spring-boot-autoconfigure,另外包中有一个spring.provides,文件内容为:

provides: mybatis-spring-boot-autoconfigure

这个包里没什么东西了,再看一下mybatis-spring-boot-autoconfigure;发现了spring.factories,文件内容如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

spring在启动时会可能加载以下两个类

MybatisLanguageDriverAutoConfiguration

package org.mybatis.spring.boot.autoconfigure;

@Configuration
@ConditionalOnClass(LanguageDriver.class)
public class MybatisLanguageDriverAutoConfiguration {

  @Configuration
  @ConditionalOnClass(FreeMarkerLanguageDriver.class)
  @ConditionalOnMissingClass("org.mybatis.scripting.freemarker.FreeMarkerLanguageDriverConfig")
  public static class LegacyFreeMarkerConfiguration {}

  @Configuration
  @ConditionalOnClass({ FreeMarkerLanguageDriver.class, FreeMarkerLanguageDriverConfig.class })
  public static class FreeMarkerConfiguration {}

  @Configuration
  @ConditionalOnClass(org.mybatis.scripting.velocity.Driver.class)  
@ConditionalOnMissingClass("org.mybatis.scripting.velocity.VelocityLanguageDriverConfig")
  @SuppressWarnings("deprecation")
  public static class LegacyVelocityConfiguration {}

  @Configuration
  @ConditionalOnClass({ VelocityLanguageDriver.class, VelocityLanguageDriverConfig.class })
  public static class VelocityConfiguration {}

  @Configuration
  @ConditionalOnClass(ThymeleafLanguageDriver.class)
  public static class ThymeleafConfiguration {}

}

        MybatisLanguageDriverAutoConfiguration加载的条件是项目中有LanguageDriver.class,我的项目有这个类;MybatisLanguageDriverAutoConfiguration要加载内部类的条件FreeMarkerLanguageDriver.class、 FreeMarkerLanguageDriverConfig.class、org.mybatis.scripting.velocity.Driver.class、VelocityLanguageDriver.class, VelocityLanguageDriverConfig.class、ThymeleafLanguageDriver.class,在我项目中都不存在。因此spring仅会在我的项目中生成MybatisLanguageDriverAutoConfiguration这个对象;

MybatisAutoConfiguration

package org.mybatis.spring.boot.autoconfigure;

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration implements InitializingBean {
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
  }

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
  }

  @org.springframework.context.annotation.Configuration
  @Import(AutoConfiguredMapperScannerRegistrar.class)
  @ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })
  public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {
    @Override
    public void afterPropertiesSet() {
      logger.debug(
          "Not found configuration for registering mapper bean using @MapperScan, MapperFactoryBean and MapperScannerConfigurer.");
    }

  }

}

        MybatisAutoConfiguration依赖SqlSessionFactory.class, SqlSessionFactoryBean.class,并且项目中有一个主的DataSource的时候会加载。同步项目中缺少SqlSessionFactory和SqlSessionTemplate时,会创建这两个对象;

mybatis-plus-boot-starter

spring.factories内容如下:

# Auto Configure
org.springframework.boot.env.EnvironmentPostProcessor=\
  com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baomidou.mybatisplus.autoconfigure.IdentifierGeneratorAutoConfiguration,\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor 安全组件、com.baomidou.mybatisplus.autoconfigure.IdentifierGeneratorAutoConfiguration id自动生成自动配置,这两个暂且不看,因为是mybatis-plus多出来的。

MybatisPlusLanguageDriverAutoConfiguration

Auto-Configuration for MyBatis's scripting language drivers.
copy from org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration

这个类是从org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration复制过来。

MybatisPlusAutoConfiguration

If org.mybatis.spring.annotation.MapperScan is used, or a configuration file is specified as a property, those will be considered, otherwise this auto-configuration will attempt to register mappers based on the interface definitions in or under the root auto-configuration package.
copy from org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

这个类是从org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration复制过来。

总结

        到这里发现mybatis-plus-boot-starter包含了mybatis-plus-boot-starter的功能。虽然他们两个同时引用对项目功能没有什么影响,但是为了spring能少加载几个类,在使用mybatis-plus-boot-starter就不要使用mybatis-plus-boot-starter了。

MyBatis 相关资源

MyBatis

优秀的数据库ORM组件

MyBatis Spring

由MyBatis提供,目的是方便的和Spring做集成。

MyBatis Plus

引用官网的说明:“MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。”

<think>好的,我现在需要回答用户关于MyBatis-Plus Spring Boot Starter使用方法及文档的问题。用户提到在集成过程中遇到了依赖冲突和找不到绑定语句的错误,引用了三个相关的资料。 首先,我应该先理解用户的具体需求。用户想了解如何正确使用MyBatis-PlusSpring Boot Starter,可能涉及到依赖配置、基本用法以及常见问题的解决。根据用户提供的引用,问题可能出在依赖冲突,特别是mybatis-spring-boot-startermybatis-plusstarter之间的冲突,还有JDK版本兼容性问题。 接下来,我需要按照系统级指令来组织回答。必须使用中文,行内数学表达式用$...$,但这个问题可能不太涉及数学公式,但要注意代码块和引用格式。回答需要结构清晰,分步骤说明,并生成相关问题。同时,引用用户提供的三个参考资料,在适当的地方添加引用标识。 首先,要说明如何正确引入依赖。根据引用[2]和[3],用户可能在同时使用mybatis-spring-boot-startermybatis-plusstarter,导致冲突。正确的做法应该是只引入MyBatis-Plusstarter,因为它已经包含了MyBatis的核心依赖。需要给出Maven和Gradle的依赖示例,并提醒用户不要同时引入两个starter。 然后,配置部分,可能需要配置数据源、MyBatis-Plus的相关设置,比如mapper扫描路径、分页插件等。这部分需要给出application.yml或properties的示例,并说明各个配置项的作用。 基本用法部分,可以提到如何创建实体类、Mapper接口,以及使用Service CRUD接口。需要给出代码示例,比如实体类注解@TableName,Mapper继承BaseMapper,Service接口的使用等。同时,要提醒用户关于XML映射文件的位置,确保资源文件被正确扫描,避免出现找不到绑定语句的错误,如引用[1]提到的。 文档和资源部分,需要引导用户查看官方文档,特别是版本兼容性。引用[3]提到用户使用JDK22,而MyBatis-Plus的某些版本可能不支持高版本JDK,需要确认版本是否兼容。例如,建议使用3.x版本,并检查是否支持JDK22,或者可能需要升级到更新的版本。 常见问题解决部分,需要总结用户提到的依赖冲突、绑定语句找不到、JDK版本问题,并给出解决方法。例如,检查依赖树排除冲突,确认XML文件路径正确,检查JDK版本兼容性。 最后,生成相关问题,应该围绕依赖管理、配置优化、高级功能、异常处理等,帮助用户进一步解决问题。 在回答过程中,需要确保所有引用都正确标注,比如引用[1]关于错误排查,引用[2]关于依赖冲突,引用[3]关于JDK版本问题。同时,代码块要使用正确的语法高亮,比如用```xml或```java。 现在需要检查是否有遗漏的部分,比如是否提到了分页插件、自动填充等功能,这些都是MyBatis-Plus的常用特性,用户可能会感兴趣。此外,是否需要提到Spring Boot的版本兼容性,因为不同版本的Spring Boot可能需要不同版本的MyBatis-Plus Starter。 总结下来,回答的结构应该是: 1. 依赖引入 2. 基础配置 3. 基本用法(实体类、Mapper、Service) 4. 文档参考 5. 常见问题 6. 相关问题 确保每个部分都简洁明了,并引用相关的问题点。例如,在依赖引入部分强调不要同时引入MyBatisMyBatis-Plusstarter,引用[2]中的冲突情况。在配置部分提醒检查XML路径,引用[1]中的绑定错误。在常见问题中提到JDK版本,引用[3]中的问题。</think>### MyBatis-Plus Spring Boot Starter 使用方法及文档 #### 1. 依赖引入 MyBatis-Plus Spring Boot Starter 提供了开箱即用的集成能力,**需避免与其他 MyBatis Starter 冲突**。 - **Maven 配置**(注意排除冲突依赖): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.6</version> <exclusions> <exclusion> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> ``` - **Gradle 配置**: ```groovy implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.6' ``` > **注意**:若同时引入 `mybatis-spring-boot-starter` 会导致类重复加载,引发冲突[^2]。 #### 2. 基础配置 在 `application.yml` 中配置数据源和 MyBatis-Plus 参数: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 mybatis-plus: configuration: map-underscore-to-camel-case: true # 字段下划线转驼峰 mapper-locations: classpath*:/mapper/**/*.xml # XML 映射文件路径 ``` > **排查绑定错误**:若出现 `Statement not found`,检查 XML 路径和接口方法名是否匹配[^1]。 #### 3. 基本用法 - **实体类定义**: ```java @TableName("user") // 指定表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; } ``` - **Mapper 接口**: ```java public interface UserMapper extends BaseMapper<User> { // 继承 BaseMapper 后自动拥有 CRUD 方法 } ``` - **Service 层**: ```java public interface UserService extends IService<User> {} @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {} ``` #### 4. 文档参考 - **官方文档**:[MyBatis-Plus 官网](https://baomidou.com/) 重点关注: - 分页插件配置 - 自动填充功能(如 `@TableField(fill = FieldFill.INSERT)`) - 逻辑删除配置 - **版本兼容性**:JDK 22 需确认 MyBatis-Plus 是否支持,建议使用 **3.5.6+** 版本[^3]。 #### 5. 常见问题解决 | 问题类型 | 解决方案 | |---------------------------|--------------------------------------------------------------------------| | 依赖冲突 | 使用 `mvn dependency:tree` 检查并排除冲突依赖 | | 找不到绑定语句 | 检查 XML 文件路径、方法名与 XML ID 是否一致 | | JDK 版本不兼容 | 降级 JDK 或升级 MyBatis-Plus 到支持高版本 JDK 的发行版 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值