MyBatis和Spring 的结合实现

概述: mybatis结合Spring 之后如下图所示:

sequenceDiagram participant SpringContainer as Spring 容器 participant DataSource as DataSource participant SqlSessionFactoryBean as SqlSessionFactoryBean participant SqlSessionFactory as SqlSessionFactory participant MapperScannerConfigurer as MapperScannerConfigurer participant Mapper as Mapper接口 SpringContainer->>DataSource: 初始化数据源 SpringContainer->>SqlSessionFactoryBean: 实例化并注入DataSource SqlSessionFactoryBean->>SqlSessionFactory: 创建SqlSessionFactory SpringContainer->>MapperScannerConfigurer: 配置Mapper扫描 MapperScannerConfigurer->>Mapper: 扫描并注册Mapper接口 Mapper->>SqlSessionFactory: 使用SqlSessionFactory

以下是与 Spring 与Mybatis集成时的典型配置步骤和相关代码:

  1. Spring 容器启动并初始化 DataSource
  2. SqlSessionFactoryBean 被实例化,并注入 DataSource
  3. SqlSessionFactoryBean 创建 SqlSessionFactory
  4. MapperScannerConfigurer 被配置来扫描并注册 Mapper 接口。
  5. Mapper 接口使用 SqlSessionFactory 来获取数据库连接和执行 SQL 操作。

1. 添加依赖

在项目的 pom.xml 文件中添加 MyBatis-Spring 的依赖:

xml 复制代码
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>版本号</version>
</dependency>

2. 配置 DataSource

在 Spring 的配置文件中配置数据源 DataSource

xml 复制代码
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">    
    <property name="driverClassName" value="数据库驱动类" />
    <property name="url" value="数据库URL" />
    <property name="username" value="数据库用户名" />
    <property name="password" value="数据库密码" />
</bean>

或者在 Spring Boot 的 application.propertiesapplication.yml 中配置:

properties 复制代码
spring.datasource.url=数据库URL
spring.datasource.username=数据库用户名
spring.datasource.password=数据库密码
spring.datasource.driver-class-name=数据库驱动类

3. 配置 SqlSessionFactory

在 Spring 配置文件中配置 SqlSessionFactory

xml 复制代码
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>

在 Spring Boot 中,可以省略这一步,因为 mybatis-spring-boot-starter 会自动配置 SqlSessionFactory

4. 配置 SqlSessionTemplate

SqlSessionTemplateSqlSession 的实现,它会代理一个 SqlSession 的调用,将 SqlSession 的创建和关闭交给 Spring 管理。

xml 复制代码
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

在 Spring Boot 中,SqlSessionTemplate 也会被自动配置。

5. 配置 Mapper 接口

在 Spring 配置文件中配置 Mapper 接口:

xml 复制代码
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

在 Spring Boot 中,可以使用 @MapperScan 注解来自动扫描和注册 Mapper 接口:

java 复制代码
@SpringBootApplication
@MapperScan("com.example.mapper")
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

启动过程

当 Spring 应用启动时,它会根据配置文件或注解创建和初始化所有的 bean。对于 MyBatis 集成:

  1. Spring 容器启动。
  2. 数据源 DataSource 被创建并配置。
  3. SqlSessionFactory 被创建。Spring 调用 SqlSessionFactoryBean,它背后使用 SqlSessionFactoryBuilder 来构建 SqlSessionFactory
  4. SqlSessionTemplate 被创建,它将被用作 SqlSession 的代理。
  5. Mapper 接口被扫描并注册为 Spring bean,它们内部使用 SqlSessionTemplate
  6. 应用程序现在可以注入 Mapper 接口并使用它们来执行数据库操作。

通过这种方式,MyBatis 与 Spring 的集成使得数据库操作的事务管理和依赖注入更加简单和一致。

Spring 和 MyBatis 的结合为开发者提供了一个强大的数据访问框架,它结合了 Spring 的依赖注入和事务管理能力以及 MyBatis 的灵活性和对 SQL 的精细控制。通过这种集成,开发者可以利用 MyBatis 易于使用的映射和会话管理,同时享受 Spring 提供的声明式事务和简化的资源管理。Spring 通过其 IoC 容器自动配置和管理 MyBatis 的核心组件,如 SqlSessionFactorySqlSession,并通过 MapperScannerConfigurer@MapperScan 注解自动发现和注册 Mapper 接口。这种集成方式简化了配置过程,提高了开发效率,并有助于维护大型项目的清晰结构。

总的来说,Spring 和 MyBatis 的结合使得 Java 应用的数据库操作变得既简洁又强大,允许开发者专注于业务逻辑,同时确保了应用的可扩展性和可维护性。

相关推荐
wuminyu4 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ5 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
千寻girling6 小时前
《 Git 详细教程 》
前端·后端·面试
wbs_scy6 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo7 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup8 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
Cosolar8 小时前
一文吃透 LangChain&LangGraph:设计理念、框架结构与内部组件全拆解
人工智能·面试·架构
952368 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.8 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19438 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法