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 应用的数据库操作变得既简洁又强大,允许开发者专注于业务逻辑,同时确保了应用的可扩展性和可维护性。

相关推荐
不修×蝙蝠2 分钟前
八大排序--01冒泡排序
java
sky丶Mamba17 分钟前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
数据龙傲天42 分钟前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
带带老表学爬虫1 小时前
java数据类型转换和注释
java·开发语言
千里码aicood1 小时前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
cyt涛1 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
彭于晏6891 小时前
Android广播
android·java·开发语言
程序员-珍2 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
2401_857297912 小时前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
福大大架构师每日一题2 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes