zoukankan      html  css  js  c++  java
  • MyBatis的执行流程分析

    核心流程介绍

    我们都知道 MyBatis 是对 JDBC 的封装,不管怎样,JDBC 的那一套还是不会变的,只是做了抽象、封装、归类等;所以我们顺着 JDBC 的思路来说下MyBatis的执行流程,JDBC执行六部走

    1. 注册驱动
    2. 获取Connection连接
    3. 执行预编译
    4. 执行SQL
    5. 封装结果集
    6. 释放资源

    然后通过这张图来分析下MyBatis的是怎样来封装这个过程的:

    MyBatis执行八步走

    上面中流程就是 MyBatis 内部核心流程,咱么来一步步解释下

    1. 读取 MyBatis 的核心配置文件。mybatis-config.xmlMyBatis的全局配置文件,用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器 (mapper.xml)等信息,这个核心配置文件最终会被封装成一个 Configuration 对象。
    2. 加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,映射文件是在 mybatis-config.xml中加载;可以加载多个映射文件,每个文件对应数据库中的—张表。配置的方式有两种:
    <!-- 使用包路径,扫描包下所有的接口,这种方式比较方便 -->
    <package name="com.mybatis.demo"/>
    
    <!-- resource∶使用相对路径的资源引用-->
    <!-- url∶使用绝对类路径的资源引用-->
    <!-- class∶使用映射器接口实现类的完全限定类名-->
    <mapper resource="xxx.xml"/>
    
    1. 构造会话工厂获取 SqlSessionFactory。这个过程其实是用建造者设计模式使用SqlSessionFactoryBuilder对象构建的, SqlSessionFactory的的最佳作用域是应用作用域

    2. 创建会话对象 SqlSession。由会话工厂创建 SqlSession对象,对象中包含了执行SQL语句的所有方法,每个线程都应该有它自己的 SqlSession实例。 SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

    3. Executor执行器。是 MyBatis的核心,负责 SQL 语句的生成和查询缓存的维护,它将根据 SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护

      • SimpleExecutor -SIMPLE 就是普通的执行器。
      • ReuseExecutor -执行器会重用预处理语句(PreparedStatements)
      • BatchExecutor --它是批处理执行器
    4. MappedStatement对象。 MappedStatement是对解析的SQL的语句封装,一个 MappedStatement 代表了一个sql语句标签,如下∶

    <select id="selectUserList" resultType="com.mybatis.User">
        select * from t_user
    </select>
    
    1. 输入参数映射。输入参数类型可以是基本数据类型,也可以是 Map 、List 、 POJO 类型复杂数据类型,这个过程类似于 JDBC 的预编译处理参数的过程。
    2. 封装结果集。可以封装成多种类型可以是基本数据类型,也可以是 Map、 List 、 P0JO 类型复杂数据类型。封装结果集的过程就和 JDBC 封装结果集是一样的。

    这样一对比,就可以看出了其实 Mybatis 的执行流程和 JDBC 其实大同小异
    如果用代码表示如下∶

    // 1.加载配置文件
    InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xmL");
    // 2.创建SqLSessionFactory对象实际创建的是Default SqLSessionFactory对象
    SqlSessionFactory builder=new SqlSessionFactoryBuilder().build(inputStream);
    //3.创建SqLSession对象实际创建的是DefaultSqLSess ion对象
    SqLSession sqLSession= builder.openSession();
    // 4.创建代理对象
    UserMapper mapper=sqLSession.getMapper(UserMapper. class);
    // 5.执行查询语句
    List<User> users = mapper.selectUserList();
    

    小结
    这节主要通过对 JDBC 执行步骤的分析来对比分析 MyBatis 的执行的流程,总体上来看它们的执行步骤基本是一样的,所以大家是不是觉得 MyBatis 这个框架其实也挺简单的,总结下就是

    • 加载解析配置文件
    • 处理参数
    • 执行查询
    • 封装结果集
    本文原创自博客园文章,想了解Java相关知识,欢迎到我的博客踩踩~ 地址:https://www.cnblogs.com/reminis/
  • 相关阅读:
    安卓客户端获取手机号码
    安卓自定义控件之设计自己的提示dialog
    一步步打造自己的分页控件4
    C#winform小游戏之贪吃蛇重温C#
    android观察者模式
    Android开发之Java设计模式
    Android 用Animationlist实现逐帧动画
    图片压缩
    Android使用缓存优化ListView
    Android命令行启动程序正确使用技巧解析
  • 原文地址:https://www.cnblogs.com/reminis/p/14515612.html
Copyright © 2011-2022 走看看