mybatis spring boot starter 是怎么做的

Table of Contents

Overview

要与 Spring 一起使用 MyBatis,你至少需要一个 SqlSessionFactory 和一个 mapper 接口。

MyBatis-Spring-Boot-Starter 将会:

  • 自动探测存在的 DataSource
  • 将使用 SqlSessionFactoryBean 创建并注册一个 SqlSessionFactory 的实例,并将探测到的 DataSource 作为数据源
  • 将创建并注册一个从 SqlSessionFactory 中得到的 SqlSessionTemplate 的实例
  • 自动扫描你的 mapper,将它们与 SqlSessionTemplate 相关联,并将它们注册到Spring 的环境(context)中去,这样它们就可以被注入到你的 bean 中

MyBatis-Spring-Boot-Starter 是一个开箱即用的解决方案,用于将 MyBatis 与 Spring Boot 集成。它简化了 MyBatis 的配置和使用,同时充分利用了 Spring 的依赖注入和生命周期管理功能。以下是它的实现原理的详细解析:

  1. 自动配置的实现

    MyBatis-Spring-Boot-Starter 利用了 Spring Boot 的自动配置机制,通过 @EnableAutoConfiguration 和 spring.factories 文件实现自动化配置。

    • spring.factories
      MyBatis-Spring-Boot-Starter 的 spring.factories 文件中包含如下配置:

      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

      这意味着 Spring Boot 启动时会加载 MybatisAutoConfiguration,自动配置 MyBatis。

    • MybatisAutoConfiguration
      该类的职责是自动创建和配置核心 MyBatis 组件,包括:

    • SqlSessionFactory:负责生成和管理数据库连接会话。

    • SqlSessionTemplate:Spring 管理的线程安全的 MyBatis 操作类。

    • Mapper 接口的动态代理:将 Mapper 接口注入到 Spring 容器中。

  2. SqlSessionFactory 的创建

    MybatisAutoConfiguration 会自动配置 SqlSessionFactory。其核心步骤包括:

    • 加载配置文件和配置信息
    • 如果用户提供了自定义的 MyBatis 配置文件(mybatis.config-location),则加载用户的配置文件。
    • 如果用户未指定配置文件,则使用默认配置。
    • 加载数据库映射文件(Mapper XML)
      MybatisProperties 中的 mapper-locations 属性指定了 Mapper XML 文件的路径。这些 XML 文件会被 ResourcePatternResolver 加载并绑定到 SqlSessionFactory。
    • 集成插件
      如果有自定义的拦截器(如分页插件),它们会通过 MybatisConfiguration 加入到 MyBatis 配置中。
  3. Mapper 接口的动态代理

    MyBatis 提供了 MapperProxy 用于动态代理接口,Spring Boot Starter 通过以下步骤将其与 Spring 管理的 Bean 注入机制集成:

    • 扫描 Mapper 接口
      @MapperScan 注解会扫描指定包中的 Mapper 接口,并将这些接口交由 Spring 管理。
      例如:

      @MapperScan("com.example.mapper")
      public class Application {}
    • 注册 Mapper 动态代理对象
      Spring 将 Mapper 接口动态代理为 MapperProxy 对象,并通过 SqlSessionTemplate 与数据库交互。

    • 自动注入
      在服务类中直接通过 @Autowired 注入 Mapper 接口即可使用,而无需手动创建对象。

  4. 事务管理

MyBatis-Spring-Boot-Starter 完全兼容 Spring 的事务管理机制:

  • 声明式事务
    使用 @Transactional 注解管理事务,Spring 会通过事务拦截器将事务的开启、提交或回滚委托给 MyBatis。
  • 事务集成点
    Spring 通过 DataSourceTransactionManager 管理数据库事务,而 SqlSessionTemplate 会感知事务的存在,确保与事务管理器保持一致。
  1. MyBatis 配置的定制化

    MyBatis-Spring-Boot-Starter 支持高度的配置定制化,用户可以通过以下方式自定义行为:

    • 配置属性
      通过 application.properties 或 application.yml 文件,设置与 MyBatis 相关的属性。例如:

mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.domain

  • 覆盖默认配置
    如果需要更复杂的自定义配置,可以实现 SqlSessionFactoryBeanCustomizer 接口,手动修改 SqlSessionFactoryBean 的属性。
  • 动态 SQL
    使用 MyBatis 的动态 SQL 功能,通过条件动态生成 SQL 查询语句。
  1. 插件机制

    MyBatis 支持自定义插件(Interceptor),可以拦截以下四种操作:

    • Executor:执行 SQL 语句。
    • ParameterHandler:处理 SQL 参数。
    • ResultSetHandler:处理结果集。
    • StatementHandler:处理 SQL 语句的构建。

Spring Boot 会自动加载用户定义的插件,只需在配置中注册插件类。

  1. 与 Spring Boot DevTools 的集成

    MyBatis-Spring-Boot-Starter 支持 Spring Boot 的开发工具(DevTools),在代码热重载时能够正确刷新 Mapper 接口和配置文件。

  2. 优点总结

    • 简化配置:无需手动配置 DataSource、SqlSessionFactory 和 Mapper。
    • 与 Spring 完美集成:支持声明式事务、依赖注入和 Spring 生命周期管理。
    • 灵活性:支持高度定制化的 MyBatis 配置。
    • 开箱即用:提供默认配置,减少了开发复杂度。

Reference

Comments |0|

Legend *) Required fields are marked
**) You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Category: 似水流年