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

相关推荐
Yaml42 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~2 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616882 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7892 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java3 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~3 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
毕业设计制作和分享3 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果3 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
小屁孩大帅-杨一凡4 小时前
java后端请求想接收多个对象入参的数据
java·开发语言
java1234_小锋4 小时前
使用 RabbitMQ 有什么好处?
java·开发语言