Spring 整合 MyBatis:核心知识点详解
一、Spring 整合 MyBatis 的优势
-
依赖注入:Spring 的 IOC 容器可以管理 MyBatis 的组件(如 SqlSessionFactory、Mapper 接口等),减少手动创建对象的繁琐。
-
事务管理:Spring 提供了声明式事务管理,可以轻松管理 MyBatis 的数据库操作。
-
简化配置:通过 Spring 的配置,可以简化 MyBatis 的初始化和配置过程。
-
解耦:Spring 和 MyBatis 的整合使得业务逻辑与数据访问逻辑分离,代码更易于维护和测试。
二、Spring 整合 MyBatis 的核心组件
在整合过程中,以下几个核心组件是关键:
-
SqlSessionFactory:MyBatis 的核心工厂类,用于创建 SqlSession。
-
SqlSessionTemplate:Spring 提供的 SqlSession 实现,线程安全且与 Spring 事务管理集成。
-
Mapper 接口:MyBatis 的 Mapper 接口定义了数据库操作的方法,Spring 会自动生成其实现类。
-
DataSource:数据库连接池,用于管理数据库连接。
-
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>