当前位置: 首页 > article >正文

Spring 整合 MyBatis:核心知识点详解

一、Spring 整合 MyBatis 的优势

  1. 依赖注入:Spring 的 IOC 容器可以管理 MyBatis 的组件(如 SqlSessionFactory、Mapper 接口等),减少手动创建对象的繁琐。

  2. 事务管理:Spring 提供了声明式事务管理,可以轻松管理 MyBatis 的数据库操作。

  3. 简化配置:通过 Spring 的配置,可以简化 MyBatis 的初始化和配置过程。

  4. 解耦:Spring 和 MyBatis 的整合使得业务逻辑与数据访问逻辑分离,代码更易于维护和测试。


二、Spring 整合 MyBatis 的核心组件

在整合过程中,以下几个核心组件是关键:

  1. SqlSessionFactory:MyBatis 的核心工厂类,用于创建 SqlSession。

  2. SqlSessionTemplate:Spring 提供的 SqlSession 实现,线程安全且与 Spring 事务管理集成。

  3. Mapper 接口:MyBatis 的 Mapper 接口定义了数据库操作的方法,Spring 会自动生成其实现类。

  4. DataSource:数据库连接池,用于管理数据库连接。

  5. TransactionManager:Spring 的事务管理器,用于管理数据库事务。

三、Spring 整合 MyBatis 的步骤

以下是通过 XML 配置方式整合 Spring 和 MyBatis 的详细步骤。

1. 添加依赖

首先,在项目的 pom.xml 中添加 Spring、MyBatis 和相关依赖:

<dependencies>
    <!-- Spring 核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.21</version>
    </dependency>
    <!-- Spring JDBC 依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.21</version>
    </dependency>
    <!-- MyBatis 核心依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!-- MyBatis-Spring 整合依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.7</version>
    </dependency>
    <!-- 数据库驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>
    <!-- 连接池依赖 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.9.0</version>
    </dependency>
</dependencies>

2. 配置数据源

在 Spring 的 XML 配置文件中,配置数据源(以 DBCP2 连接池为例):

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="url" value="jdbc:mysql://localhost:3306/mydb" />
    <property name="username" value="root" />
    <property name="password" value="secret" />
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    <property name="initialSize" value="5" />
    <property name="maxTotal" value="10" />
</bean>

3. 配置 SqlSessionFactory

通过 SqlSessionFactoryBean 配置 MyBatis 的 SqlSessionFactory

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:mapper/*.xml" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
  • dataSource:指定数据源。

  • mapperLocations:指定 MyBatis 的 Mapper XML 文件位置。

  • configLocation:指定 MyBatis 的全局配置文件(可选)。

4. 配置 SqlSessionTemplate

SqlSessionTemplate 是 MyBatis 与 Spring 整合的核心组件,它是线程安全的:

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

5. 配置 Mapper 接口

通过 MapperFactoryBean 或 <mybatis:scan> 标签配置 Mapper 接口:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.example.mapper.UserMapper" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

或者使用 <mybatis:scan> 自动扫描 Mapper 接口:

<mybatis:scan base-package="com.example.mapper" />

6. 配置事务管理器

Spring 提供了声明式事务管理,可以通过以下配置启用:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

四、核心知识点详解

1. SqlSessionFactory 的作用

SqlSessionFactory 是 MyBatis 的核心工厂类,用于创建 SqlSession。每个 MyBatis 应用都需要一个 SqlSessionFactory 实例。在 Spring 中,通过 SqlSessionFactoryBean 来创建和管理 SqlSessionFactory

2. SqlSessionTemplate 的作用

SqlSessionTemplate 是 Spring 提供的 SqlSession 实现,它是线程安全的,并且与 Spring 的事务管理集成。它替代了 MyBatis 默认的 DefaultSqlSession,确保每次操作都能正确地参与到 Spring 的事务中。

3. Mapper 接口的自动注入

通过 MapperFactoryBean 或 <mybatis:scan>,Spring 可以自动创建 Mapper 接口的代理对象,并将其注入到需要的类中。这使得开发者无需手动编写 Mapper 的实现类。

4. 事务管理

Spring 的声明式事务管理可以通过 @Transactional 注解或 XML 配置实现。它与 MyBatis 的整合确保了数据库操作在事务中执行,保证了数据的一致性

五、示例代码

以下是一个完整的示例,展示了如何使用 Spring 和 MyBatis 进行数据库操作。

1. 实体类

public class User {
    private int id;
    private String name;
    private String email;
    // 省略 getter 和 setter
}

 2. Mapper 接口

public interface UserMapper {
    User selectUserById(int id);
    void insertUser(User user);
}

3. Mapper XML 文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser">
        INSERT INTO user (name, email) VALUES (#{name}, #{email})
    </insert>
</mapper>

4. 服务层

public class UserService {
    private UserMapper userMapper;

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User getUserById(int id) {
        return userMapper.selectUserById(id);
    }

    public void addUser(User user) {
        userMapper.insertUser(user);
    }
}

5. Spring 配置文件

<bean id="userService" class="com.example.service.UserService">
    <property name="userMapper" ref="userMapper" />
</bean>

http://www.kler.cn/a/540889.html

相关文章:

  • Docker容器访问外网:启动时的网络参数配置指南
  • 数据结构与算法(test3)
  • 图像锐化(QT)
  • 【网络安全】服务器安装Docker及拉取镜像教程
  • 【JavaScript】this 指向由入门到精通
  • rdian是一个结构体,pdian=^Rdian,list泛型做什么用?
  • 搜索二维矩阵——巧用右上角起点搜索法,高效解决二维矩阵查找问题
  • vue动态table 动态表头数据+动态列表数据
  • JAVA程序员面试总结
  • 【数据结构-异或字典树】力扣421. 数组中两个数的最大异或值
  • 【Pandas】pandas Series nunique
  • C++:将函数参数定义为const T的意义
  • 网络编程(预备知识)
  • GaN技术基站需要匹配的高性能电源解决方案
  • 美颜SDK架构设计指南:性能优化与跨平台适配实战
  • 数据可视化与交互融合:APP 界面设计的新维度
  • Python3 ImportError: cannot import name ‘XXX‘ from ‘XXX‘
  • 【Kubernetes的SpringCloud最佳实践】有Service是否还需要Eureka?
  • 【数据结构】双向链表(真正的零基础)
  • Rust 测试组织指南:单元测试与集成测试
  • 前端-导出png,jpg,pptx,svg
  • 【Kubernetes】常用命令全解析:从入门到实战(上)
  • 【Linux】深入理解linux权限
  • 【开源免费】基于SpringBoot+Vue.JS公寓报修管理系统(JAVA毕业设计)
  • VBA语言的软件工程
  • 《LeetCode Hot100》 Day01