Mybatis执行流程知多少
思维导图:
一、MyBatis 执行流程概述
MyBatis 的执行流程可以大致分为以下几个关键步骤:配置加载、会话创建、SQL 执行和结果处理。下面我们将逐步详细介绍每个步骤。
二、配置加载
1. 配置文件的重要性
MyBatis 的配置文件是整个框架的基础,它包含了数据库连接信息、映射器配置、插件配置等重要内容。常见的配置文件有 mybatis-config.xml 和映射器 XML 文件(如 UserMapper.xml)。
如图所示:
2. 加载配置文件
在 Java 代码中,我们通常使用 SqlSessionFactoryBuilder 来加载配置文件并构建 SqlSessionFactory。示例代码如下:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;public class MyBatisConfigLoader {public static SqlSessionFactory getSqlSessionFactory() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);return new SqlSessionFactoryBuilder().build(inputStream);}
}
在上述代码中,Resources.getResourceAsStream(resource) 方法用于读取配置文件,SqlSessionFactoryBuilder().build(inputStream) 方法根据配置文件构建 SqlSessionFactory。
3. 配置文件解析
SqlSessionFactoryBuilder 在构建 SqlSessionFactory 时,会对配置文件进行详细的解析。它会读取配置文件中的数据库连接信息、映射器配置等,并将这些信息存储在 Configuration 对象中。Configuration 对象是 MyBatis 配置信息的核心载体,后续的操作都会依赖于它。
具体来说,SqlSessionFactoryBuilder 会使用 XML 解析器对配置文件进行解析,将其中的 XML 标签转换为 Java 对象。例如,<dataSource> 标签会被解析为 DataSource 对象,<mapper> 标签会被解析为映射器对象。在解析过程中,SqlSessionFactoryBuilder 会对配置信息进行验证和处理,确保配置信息的正确性和完整性。
三、会话创建
1. SqlSessionFactory 的作用
SqlSessionFactory 是 MyBatis 的核心对象之一,它负责创建 SqlSession 对象。SqlSession 是 MyBatis 与数据库交互的会话对象,类似于 JDBC 中的 Connection。SqlSessionFactory 是一个线程安全的对象,通常在应用程序启动时创建一次,并在整个应用程序的生命周期中使用。
2. 创建 SqlSession
通过 SqlSessionFactory 的 openSession() 方法可以创建一个 SqlSession 对象。openSession() 方法有多个重载形式,可以根据需要指定是否自动提交事务、隔离级别等参数。代码示例:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;public class MyBatisSessionCreator {public static SqlSession getSqlSession() throws Exception {SqlSessionFactory sqlSessionFactory = MyBatisConfigLoader.getSqlSessionFactory();return sqlSessionFactory.openSession();}
}
3. 会话管理
SqlSession 对象在使用完毕后需要关闭,以释放资源。可以使用 try-with-resources 语句来确保 SqlSession 正确关闭。try-with-resources 语句是 Java 7 引入的一种自动资源管理机制,它会在代码块执行完毕后自动调用资源的 close() 方法。以下是一个示例:
try (SqlSession session = MyBatisSessionCreator.getSqlSession()) {// 执行数据库操作
}
四、SQL 执行
1. 获取映射器
在 SqlSession 中,可以通过 getMapper() 方法获取映射器接口的实例。映射器接口定义了数据库操作的方法,MyBatis 会根据接口方法的定义自动生成对应的 SQL 语句。示例代码如下:
import org.apache.ibatis.session.SqlSession;public class MyBatisMapperExecutor {public static void executeMapperMethod() throws Exception {try (SqlSession session = MyBatisSessionCreator.getSqlSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);// 调用映射器方法}}
}
2. 执行 SQL 语句
当调用映射器接口的方法时,MyBatis 会根据方法的定义和映射器配置文件(或注解)生成对应的 SQL 语句,并通过 Executor 执行该 SQL 语句。Executor 是 MyBatis 执行 SQL 语句的核心组件,它负责与数据库建立连接、执行 SQL 语句、处理事务等操作。
MyBatis 提供了两种类型的 Executor:SimpleExecutor 和 ReuseExecutor。SimpleExecutor 每次执行 SQL 语句时都会创建一个新的 PreparedStatement 对象,而 ReuseExecutor 会重用已经创建的 PreparedStatement 对象,以提高性能。
3. SQL 语句的生成
MyBatis 支持 XML 配置和注解两种方式来定义 SQL 语句。
XML 配置方式
在 XML 配置中,可以在映射器 XML 文件中使用 <select>、<insert>、<update>、<delete> 等标签来定义 SQL 语句。以下是一个示例:
<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" parameterType="int" resultType="com.example.entity.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>
注解方式
在注解方式中,可以在映射器接口的方法上使用 @Select、@Insert、@Update、@Delete 等注解来定义 SQL 语句。以下是一个示例:
import org.apache.ibatis.annotations.Select;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);
}
五、结果处理
1. 结果集映射
当 SQL 语句执行完毕后,MyBatis 会将数据库返回的结果集映射到 Java 对象中。可以通过映射器配置文件或注解来定义结果集映射规则。
XML 配置方式
在 XML 配置中,可以使用 <resultMap>
标签来定义结果集映射。以下是一个示例:
<mapper namespace="com.example.mapper.UserMapper"><resultMap id="userResultMap" type="com.example.entity.User"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" /></resultMap><select id="getUserById" parameterType="int" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id}</select>
</mapper>
注解方式
在注解方式中,可以使用 @Results
和 @Result
注解来定义结果集映射。以下是一个示例:
import org.apache.ibatis.annotations.*;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "age", column = "age")})User getUserById(int id);
}
2. 返回结果
经过结果集映射后,MyBatis 会将映射后的 Java 对象作为方法的返回值返回给调用者。调用者可以直接使用这些 Java 对象进行业务逻辑处理。
六.执行流程总结
MyBatis 的执行流程包含以下关键环节:
- 读取 MyBatis 配置文件 mybatis - config.xml,加载运行环境及映射文件,为后续数据库操作做好基础配置准备。
- 依据加载的配置构造会话工厂 SqlSessionFactory,它是创建数据库会话的核心工厂。
- 通过会话工厂创建 SqlSession 对象,该对象包含执行 SQL 语句的所有方法,是与数据库交互的直接会话实例。
- 实际操作数据库时,使用 Executor 执行器,它不仅负责 SQL 语句的执行,还承担着查询缓存的维护工作。
- 在 Executor 接口的执行方法中,存在一个 MappedStatement 类型的参数,该参数封装了映射信息(如 SQL 语句、结果映射规则等),是 SQL 执行的关键数据载体。
- 执行 SQL 前,进行输入参数映射,将传入的参数按规则正确应用到 SQL 语句中。
- SQL 执行完成后,进行输出结果映射,把数据库返回的结果按配置规则映射到相应的对象中,至此完成整个数据操作流程。