MyBatis的执行流程:
Spring Boot项目
- MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
- 在Spring Boot项目中集成MyBatis可以极大地简化数据库访问层的开发。
Spring Boot则通过自动配置和约定大于配置的原则,进一步简化了MyBatis的使用。以下是Spring Boot中MyBatis的执行流程:
一、配置MyBatis:
- 在Spring Boot项目中,MyBatis的配置主要通过application.yml(或application.properties)文件完成。
开发者需要配置数据源信息:
- 数据库URL
- 用户名
- 密码
- 指定Mapper XML文件的位置以及别名包的位置
# application.yml示例配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 这是MyBatis配置项的根节点,表明下面的配置项都是关于MyBatis的
mybatis:
# mapper-locations: 这个配置项用于指定MyBatis的Mapper XML文件的位置
# classpath:mapper/*.xml
# 表示在类路径下的mapper目录中寻找所有的.xml文件。这些XML文件通常包含了SQL语句和结果映射的定义。
mapper-locations: classpath:mapper/*.xml
# type-aliases-package: 这个配置项用于指定别名包的位置。
# MyBatis会为在这个包下的所有Java类创建别名,这样你就可以在Mapper XML文件中使用简单的类名而不是全限定类名。
# com.example.demo.model包下的所有类都会被MyBatis赋予别名,方便在SQL映射文件中引用。
type-aliases-package: com.example.demo.model
二、启动应用程序与数据库准备:
当Spring Boot应用程序启动时,它会做以下几件事来准备与数据库的交互:
1、读取配置:
- 首先,应用程序会读取配置文件,获取如何连接到数据库的信息(如数据库的地址、用户名和密码)。
2、准备数据源:
- 根据配置文件中提供的信息,Spring Boot会自动配置并准备好一个数据源(DataSource)。这个数据源是应用程序与数据库之间的桥梁,负责管理和提供数据库连接。
3、创建会话工厂(SqlSessionFactory):
- MyBatis的SqlSessionFactory是通过Spring Boot的自动配置机制创建的。它是MyBatis的核心组件,负责创建与数据库的会话(SqlSession)。可以将SqlSessionFactory视为一个生产SqlSession的工厂。
4、会话(SqlSession)与数据库操作:
- 当应用程序需要与数据库进行交互时,它会从SqlSessionFactory中获取一个SqlSession实例。这个SqlSession代表了与数据库的一次会话,可以用来执行SQL查询、插入、更新或删除等操作
- SqlSession是线程不安全的,因此最佳实践是在方法作用域内获取并使用它,然后在使用完毕后立即关闭。但在Spring集成中,通常通过声明式事务管理来处理SqlSession的生命周期。
5、执行器(Executor)工作:
- 在MyBatis内部,Executor是执行SQL语句的核心组件。它负责准备SQL语句、绑定参数、执行查询或更新,并处理结果集。
- MyBatis提供了三种Executor类型:SimpleExecutor、ReuseExecutor和BatchExecutor,它们分别适用于不同的使用场景。但在大多数情况下,开发者不需要直接与Executor交互,因为MyBatis和Spring Boot会处理这些细节
这些步骤共同确保了当Spring Boot应用程序启动时,它能够正确地与数据库建立连接,并通过MyBatis执行SQL操作。
三、Mapper接口扫描与注入
Spring Boot扫描Mapper接口,并为它们创建代理实现类。这些实现类在内部会使用SqlSession来执行数据库操作,而SqlSession内部则封装了Executor执行器。
Service层示例
@Service
public class UserService {
private final UserMapper userMapper;
@Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Integer id) {
// 此处调用Mapper方法,触发MyBatis内部流程
// 包括Executor执行器的使用来执行SQL语句
return userMapper.findUserById(id);
}
}
@Mapper
public interface userMapper{
public User findUserById(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findUserById" resultType="com.example.demo.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
在MyBatis内部,Executor执行器负责准备SQL语句、绑定参数、执行查询或更新,并处理结果集。根据配置和SQL类型(查询、更新等),Executor可能是SimpleExecutor、ReuseExecutor或BatchExecutor之一。
四、MyBatis内部流程 - Executor执行器
在MyBatis内部,当Mapper接口的方法被调用时,会经历以下步骤:
1、SQL准备: MyBatis首先根据Mapper方法和其对应的XML映射文件或注解准备SQL语句。
2、参数绑定: 接着,它会将方法参数绑定到SQL语句中的占位符上。
3、执行器选择: MyBatis根据配置选择一个Executor实现(SimpleExecutor、ReuseExecutor或BatchExecutor)。
4、SQL执行: Executor执行器使用数据源中的连接执行SQL语句。
5、结果处理: 执行器将数据库返回的结果集转换为Java对象或对象列表。
6、返回结果: 最后,转换后的Java对象被返回给Service层,进而返回给调用者