(五)Mybatis 底层执行流程及主要特点

前言

前面我们完成了 Mybatis 的基本代码编写,增删改查,具体配置详解以及日志的使用,但我们并没有对 Myabtis 的底层实现有一个具体的认识,这里我将对 Mybatis 基于我个人的了解进行一个简单的总结。

Mybatis

MyBatis 是一个开源的持久层框架,它可以将 Java 对象映射到关系型数据库中的SQL语句。MyBatis 的设计思想是将 SQL 语句和程序代码分开,通过 XML 文件或注解的方式描述 SQL 语句,然后由 MyBatis 框架自动将其转换为对应的 Java 对象。

底层执行流程

首先,我们将曾经完成的具体代码附在这里,以便我们对照来学习:Mybayis 基本实现以及环境搭载

这里给出 Mybatis 的底层执行流程,下面再做具体赘述:

最初,我们为了方便,编写了 MybatisUtils 工具类,来将固定的代码放在其中:

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}
  • 第6-7行,可以看到这里创建一个InputStream对象,将我们的全局配置文件通过 resource 加载为文件输入流;

  • 第8行,实例化了 SqlSessionFactoryBuilder() 构造器,在这里我们可以查看源码,发现在实例化 SqlSessionFactory 之前还做了其他事情:

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
        SqlSessionFactory var5;
        try {
            XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
            var5 = this.build(parser.parse());
        } catch (Exception var14) {
            throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
        } finally {
            ErrorContext.instance().reset();

            try {
                reader.close();
            } catch (IOException var13) {
            }

        }
//build()的时候传递了一个 Configuration,然后通过 XMLConfigBuilder 解析这个对象
public SqlSessionFactory build(Configuration config) {
        return new DefaultSqlSessionFactory(config);
    }

这里我们可以看到,SqlSessionFactoryBuilder()类中通过 build() 来对我们的 InputStream流进行解析(如果 xml 配置文件出现问题,就会在这里报错),这里还通过 XMLConfigBuilder()创建一个对象 parser ,将这个对象放在我们的 Configuration 配置中。

我们通过 debug 可以发现,DefaultSqlSession 也是这个时候创建的(DefaultSqlSession 实现了 SqlSession 接口的所有方法,包括对数据库的增删改查、事务管理等功能),build()之后才实例化了SqlSessionFactory。

实例化了 SqlSessionFactory 的同时也产生了 transactional 事务管理和 executor 执行器:

  • 创建 sqlSession ,实现增删改查,然后回滚,检查是否成功,然后接着回滚。

  • sqlSession 中的 executor 执行器,执行 mapper

public void getUserByIdTest() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper.getUserById(1);
        System.out.println(user1);

        sqlSession.close();
    }

通过 mapper 接口读取配置文件中的 sql 语句,实现增删改查。

  • 总结:

MyBatis 的底层实现主要包括以下几个方面:

  1. Configuration(配置):MyBatis 的配置文件包含了连接数据库的信息、映射文件的位置和一些全局性的属性等。
  2. SqlSession(会话):SqlSession 是 MyBatis 的一个重要组件,它是应用程序与数据库之间交互的一个会话,可以用来执行 SQL 语句、获取映射器、提交或回滚事务等。
  3. MappedStatement(映射语句):MappedStatement 是 MyBatis 中用于描述 SQL 语句的一个对象,它包含了 SQL 语句的 ID、参数类型、返回值类型、SQL 语句的类型(增、删、改、查)、SQL 语句字符串等信息。
  4. Executor(执行器):Executor 是 MyBatis 中的一个重要组件,它负责执行 SQL 语句,与 SqlSession 相关联,可以通过 SqlSession 获取Executor 实例。MyBatis 提供了三种 Executor 实现:SimpleExecutor、ReuseExecutor 和 BatchExecutor。
  5. StatementHandler(语句处理器):StatementHandler 是 MyBatis 中用于处理 SQL 语句的一个对象,它包含了创建 PreparedStatement 对象、设置参数等操作。
  6. ParameterHandler(参数处理器):ParameterHandler 是 MyBatis 中用于处理 SQL 语句参数的一个对象,它负责将 Java 对象转换为 JDBC 参数,并设置到 PreparedStatement 对象中。
  7. ResultSetHandler(结果集处理器):ResultSetHandler 是 MyBatis 中用于处理 SQL 语句查询结果的一个对象,它负责将查询结果集转换为 Java 对象。

MyBatis 的底层实现主要涉及到配置、会话、SQL 语句描述、执行器、语句处理器、参数处理器和结果集处理器等。这些组件相互协作,完成了 MyBatis 的核心功能,即将 Java 对象映射到关系型数据库中。

MyBatis的主要特点

1、灵活性:MyBatis可以通过XML文件或注解的方式描述SQL语句,可以方便地进行定制化配置,满足各种复杂的需求。

2、易于学习:MyBatis的API简洁易懂,可以快速上手。

3、易于扩展:MyBatis的插件机制可以方便地实现自定义功能。

4、SQL优化:MyBatis提供了多种优化查询的手段,例如缓存、分页等。

5、与Spring集成:MyBatis可以与Spring框架无缝集成,可以方便地使用Spring的事务管理等功能。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MyBatis是一款优秀的Java持久层框架,它封装了JDBC,使开发者无需关注繁琐的连接、驱动加载等细节,只需关注SQL语句本身。它采用ORM思想解决了实体和数据库映射的问题。MyBatis通过XML或注解配置要执行的SQL语句,并将Java对象和SQL的动态参数进行映射生成最终的SQL语句。最后,MyBatis执行SQL并将结果映射为Java对象返回。 总体执行流程如下: 1. 通过getResourceAsReader(String resource)方法读取mybatis.xml配置文件,生成Reader对象。 2. 使用SqlSessionFactoryBuilder的build()方法,通过构建者模式创建SqlSessionFactory对象。 3. 通过openSession()方法获取DefaultSqlSession对象,用于执行数据库操作。 4. 在进行数据库的insert、update、delete、select等操作后,通过sqlSession.commit()提交事务。 5. 最后使用sqlSession.close()关闭连接,释放资源。 解析mapper节点时,首先获取命名空间并将其放入builderAssistant对象中。然后解析cache-ref、cache、parameterMap、resultMap和Sql片段等内容。接下来是解析增删改查的地方,通过上下文构建statement对象。真正解析增删改查的方法是buildStatementFromContext(list, null)。通过构建者模式生成一个statementParser对象,用于解析增删改查标签。通过parseStatementNode()方法解析和设置各个标签的属性。最后使用构建者模式将解析得到的statement对象添加到builderAssistant对象中,用于构建statement对象。重要的是使用addMappedStatement()方法判断是否为select方法,如果是,则构建一个statement对象并将其添加到MappedStatement类型的statement变量中。最终将statement对象放入configuration对象中,将所有增删改查的标签解析为一个statement对象并放入configuration对象中。 在MyBatis底层源码中,使用了build(Reader reader, String environment, Properties properties)方法来构建SqlSessionFactory对象。实际上,该方法内部调用了build(Reader reader)方法。在build(Reader reader, String environment, Properties properties)方法中,声明了一个XMLConfigBuilder对象parser,通过parser.parse()方法解析XML配置文件,最终返回一个builde对象[3]。 总体来说,MyBatis底层源码分析涉及到读取配置文件、创建SqlSessionFactory对象、解析mapper节点、构建statement对象等过程。这些过程都有各自的细节和步骤,用于实现MyBatis的功能和特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HB0o0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值