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 执行完成后,进行输出结果映射,把数据库返回的结果按配置规则映射到相应的对象中,至此完成整个数据操作流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值