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.properties 或 application.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

SqlSessionTemplate 是 SqlSession 的实现,它会代理一个 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 的核心组件,如 SqlSessionFactory 和 SqlSession,并通过 MapperScannerConfigurer 或 @MapperScan 注解自动发现和注册 Mapper 接口。这种集成方式简化了配置过程,提高了开发效率,并有助于维护大型项目的清晰结构。

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

相关推荐
聪明的笨猪猪3 分钟前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
软件技术NINI1 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang1 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了2 小时前
JAVA中的一些基础应用知识点
java·开发语言
SL_staff3 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶3 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
时间的拾荒人3 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
秋天的怀念_David4 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
Java码农也是农4 小时前
Spring 事务详解:@Transactional 如何生效、何时回滚、传播行为怎么选
java·spring boot·spring·事务
学长毕设4 小时前
基于SpringBoot的游乐园管理系统-附源码
java·spring boot·后端