Mybatis源码1JDBC->mybatis主要流程->mybatis Excutor简介

===

一丶mybatis概述

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis – MyBatis 3 | 官方文档

二丶传统JDBC操作

JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作

mybatis让我们重复的jdbc操作中解放开来 ,但是不能被工具的便捷蒙蔽了双眼,让我们从锤子开始

  public List selectAllStudent() {
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (Exception e) {

        }
        ArrayList list = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            //获取连接
            connection = DriverManager.getConnection("url","username","password");
            //创建statement
            statement = connection.prepareStatement("select * from student");
            //执行查询,得到结果集
            resultSet = statement.executeQuery();
            //结果集到对象的映射
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                boolean sex = resultSet.getBoolean("sex");
                Student temp = Student.builder()
                        .id(id)
                        .name(name)
                        .sex(sex)
                        .build();
                list.add(temp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }
  1. 注册驱动 Class.forName,利用反射获取驱动的class,实际执行了Driver的静态代码块内容
    //将mysql的驱动注册到DriverManager
    static {
        try {
            //把driver加载到 DriverManager的registeredDrivers 集合中去
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
    /**
     * 空白的构造函数
     *
     * @throws SQLException
     *             if a database error occurs.

     */
    public Driver() throws SQLException {
        //下面说明了 使用Class.forName
        // Required for Class.forName().newInstance()
    }
  1. 获取连接 DriverManager.getConnection() 方法用于获得试图建立到指定数据库 URL 的连接。DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序(可能存在多个已经注册的连接) 这里面的逻辑是,调用了
return (getConnection(url, info, Reflection.getCallerClass()));
//Reflection.getCallerClass()获取调用方法的类
//如果当前调用方为null 那么从当前线程获取类加载器
//Thread.currentThread().getContextClassLoader()
//遍历每一个驱动,返回第一个合适的驱动
  1. 构造Statement 用于执行静态SQL语句并返回其生成的结果的对象。 PrepareStatement: 表示预编译的SQL语句的对象,SQL语句已预编译并存储在 PreparedStatement对象中。 然后可以使用该对象多次有效地执行此语句
  2. 执行查询,得到结果集,结果集映射到对象 ResultSet 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在 ResultSet对象中没有更多行时返回 false ,因此可以在 while循环中使用循环来遍历结果集。
  3. 关闭连接

三丶mybatis的简单使用和大致执行流程

//mybatis全局配置
String resource = "com/cuzz/mybatislearn/mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//根据配置拿到sqlSessionFactory 【工厂模式】
SqlSessionFactory sqlSessionFactory = new
    SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession 该对象中包含了执行SQL语句的所有方法【门面模式】
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取代理后的mapper
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
//执行
List students = mapper.listAll();

Mybatis源码1JDBC->mybatis主要流程->mybatis Excutor简介

(1)读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。

(2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。

(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。

(5)Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。

(6)MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。

(7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。

(8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。z

四丶mybatis中的执行器

mybatis&#x7684;&#x6267;&#x884C;&#x5668;&#xFF0C;&#x662F;mybatis&#x6700;&#x4E3A;&#x5173;&#x952E;&#x7684;&#x5730;&#x65B9;(&#x76F8;&#x6BD4;&#x4E8E;&#x626B;&#x63CF;mapper&#x5F97;&#x5230;&#x5168;&#x5C40;&#x914D;&#x7F6E;)

Mybatis源码1JDBC->mybatis主要流程->mybatis Excutor简介

1.Executor接口

  • 该接口提供了改和查的基本功能(数据库的删除插入本质也是更新,其实对应了statement中的executeUpdate和executeQuery方法)
  • 提交和回滚
  • 缓存相关方法
  • 批处理刷新
  • 执行器关闭
  • 延迟加载

2.BaseExecutor

​ 对Executor中的接口中的大部分方法进行了通用的实现,并且可以通过配置文件,或者手动指定执行器类型来让mybatis使用具体执行器实现(这里说的实现只有BatchExcutor,SimpleExecutor,ReuseExcutor),还提供了三个抽象方法(如下)让子类实现

  • doUpdate
  • doFlushStatements
  • doQuery

3.SimpleExecutor

简单执行器,是 MyBatis 中默认使用的执行器,对BaseExecutor中的方法进行了简单的实现,(根据配置获取连接,根据连接获取Statement,执行sql,结果集映射)每执行一次 update 或 select,就开启一个 Statement 对象,用完就直接关闭 Statement 对象

4.BatchExecutor

主要应对批量更新,插入,删除,一次向数据库发送多个SQL语句从而减少通信开销,从而提高性能。(对查找不生效)

&#x6279;&#x91CF;&#x5904;&#x7406;&#x5141;&#x8BB8;&#x5C06;&#x76F8;&#x5173;&#x7684;SQL&#x8BED;&#x53E5;&#x5206;&#x7EC4;&#x5230;&#x6279;&#x5904;&#x7406;&#x4E2D;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x5BF9;&#x6570;&#x636E;&#x5E93;&#x7684;&#x4E00;&#x6B21;&#x8C03;&#x7528;&#x6765;&#x63D0;&#x4EA4;&#x5B83;&#x4EEC;&#xFF0C;&#x4E00;&#x6B21;&#x6267;&#x884C;&#x5B8C;&#x6210;&#x4E0E;&#x6570;&#x636E;&#x5E93;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF1A;JDBC&#x4E2D;&#x7684;&#x6279;&#x5904;&#x7406;&#x53EA;&#x652F;&#x6301; insert&#x3001;update &#x3001;delete &#x7B49;&#x7C7B;&#x578B;&#x7684;SQL&#x8BED;&#x53E5;&#xFF0C;&#x4E0D;&#x652F;&#x6301;select&#x7C7B;&#x578B;&#x7684;SQL&#x8BED;&#x53E5;&#x3002;

5.ReuseExecutor

ReuseExecutor &#x4E0D;&#x540C;&#x4E8E; SimpleExecutor &#x7684;&#x5730;&#x65B9;&#x5728;&#x4E8E; ReuseExecutor &#x7EF4;&#x62A4;&#x4E86; Statement &#x7F13;&#x5B58;

ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map

6.CachingExecutor

CachingExecutor没有继承BaseExecutor, CachingExecutor 不具备 Executor 执行器功能, CachingExecutor 是一个装饰器, Mybatis 采用装饰者模式对 Executor 执行器提供了功能增强。CachingExecutor &#x88C5;&#x9970;&#x5668;&#x80FD;&#x591F;&#x4F7F;&#x5F97;&#x88AB;&#x88C5;&#x9970;&#x7684;Executor 具备二级缓存功能

附录

  1. 为什么注册驱动需要使用Class.forName Class.forName(String)会加载类,并且并且执行类初始化,会执行driver中的静态代码块,静态代码块中进行了驱动的注册,
  2. Class.forName,和ClassLoader.loadClass的区别
  3. Class.forName(String): 加载类,并且执行类初始化,可以通过Class.forName(String, boolean, ClassLoader)第二个参数来仅仅加载类不执行初始化
  4. ClassLoader.loadClass(String): 仅仅加载类,不执行类初始化
  5. 注册驱动的方式有哪些 在java 6中,引入了service provider的概念,即可以在配置文件中配置service(可能是一个interface或者abstract class)的provider(即service的实现类)。配置路径是:/META-INF/services/下面。
    而java.sql.DriverManager也添加了对此的支持,因此,在JDK6中,DriverManager的查找Driver的范围为:
    1)system property “jdbc.drivers” 中配置的Driver值;
    2)用户调用Class.forName()注册的Driver
    3)service provider配置文件java.sql.Driver中配置的Driver值。
    因此,在jdk6中,其实是可以不用调用Class.forName来加载mysql驱动的,因为mysql的驱动程序jar包中已经包含了java.sql.Driver配置文件,并在文件中添加了com.mysql.jdbc.Driver.但在JDK6之前版本,还是要调用这个方法。

Original: https://www.cnblogs.com/cuzzz/p/16609738.html
Author: Cuzzz
Title: Mybatis源码1JDBC->mybatis主要流程->mybatis Excutor简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713897/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go实现安全双检锁的方法和最佳实践

    不安全的双检锁 从其他语言转入Go语言的同学经常会陷入一个思考:如何创建一个单例? 有些同学可能会把其它语言中的双检锁模式移植过来,双检锁模式也称为懒汉模式,首次用到的时候才创建实…

    技术杂谈 2023年7月11日
    0109
  • html大文件传输方法

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag 客户端每次…

    技术杂谈 2023年5月30日
    082
  • 摆了

    ; ; 这段时间只放板子了。为什么不写题解?答:rt。 posted @2022-01-10 16:35 T_X蒻 阅读(30 ) 评论() 编辑 Original: https:…

    技术杂谈 2023年6月21日
    077
  • 新博客评论使用方式介绍

    新博客终于上线了,与旧博客不同的是,我在评论方面花了许多精力,希望可以提供一个优秀的评论方法。我对优秀的定义是”格式丰富,使用简单”,再加上由于是技术博客,…

    技术杂谈 2023年5月31日
    0109
  • 梯度下降算法

    一、基本概念 梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代能使待优化的目标函数逐步减小。梯度下降法是2范数下的最速下降法。 最速下降法的一种简单形式是:…

    技术杂谈 2023年5月31日
    0112
  • Android中的Coroutine协程原理详解

    前言 协程是一个并发方案。也是一种思想。 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高。但是面对计算密集型的任务不如多线程并行运算效率高。 不同的语言…

    技术杂谈 2023年7月10日
    085
  • dremio odbc 驱动包下载说明

    dremio 就在5月底左右的时候,对于odbc 驱动停止了下载,目前在dremio 社区网站有不大好人员反馈了,总的来说是很不好对于数据处理领域基于python (会使用到odb…

    技术杂谈 2023年5月30日
    0144
  • Apache Doris 轻松入门和快速实践

    Doris 最早是解决百度凤巢统计报表的专用系统,随着百度业务的飞速发展对系统进行了多次迭代,逐渐承担起百度内部业务的统计报表和多维分析需求。2013 年,百度把 Doris 进行…

    技术杂谈 2023年6月1日
    091
  • Adroid动态加载Apk-插件化技术框架(动态代理方案)

    Android动态加载Apk-插件化技术(动态代理方案) 一.概述 为什么要使用插件化?在开发中,一个项目只会越做越大。初始版本可能是单一功能,后续可能加上各种风马牛不相及的功能。…

    技术杂谈 2023年5月31日
    098
  • 从lore.kernel.org获取补丁的工具b4

    如何安装b4? 1.1 获取b4的源码$ git clone git://git.kernel.org/pub/scm/utils/b4/b4.git1.2 使能b4$ cat ~…

    技术杂谈 2023年5月31日
    0104
  • 云筑集采研发团队的Scrum敏捷实践总结

    Edison作为团队内部敏捷教练,这是我正式辅导的第一个Scrum Master童鞋(花名:大师兄;)的敏捷迭代实践总结,在互联网公司做敏捷转型, 难而正确! Scrum 是用于开…

    技术杂谈 2023年5月31日
    094
  • 2022最新版SSM源码分析:一套教程助你深入理解底层原理,提高核心竞争力!

    众所周知SSM源码分析教程里面包括Mybatis、Spring以及SpringMVC这三个经典的开源框架的源码分析。我们编程人员技术提升逃不过的一个重要方式就是阅读和理解优秀开源项…

    技术杂谈 2023年7月24日
    094
  • Worktile协同特色之二:任务看板管理

    什么是看板 看板是一种使用可视化管理的方式,跟踪任务在整个价值流中流经的不同阶段,通常我们会用带贴纸的白板,或是电子卡片墙。具备如下几个特征:1. 流程可视化 把工作拆分成小块,一…

    技术杂谈 2023年5月31日
    095
  • []总结常见获客渠道

    [原创]总结常见获客渠道 [原创]总结常见获客渠道 1 搜索 百度 搜狗 360 2 媒体 图文 微信公众号 头条 微博 视频 短视频 抖音 快手 长视频 爱奇艺 腾讯视频 直播 …

    技术杂谈 2023年5月30日
    0128
  • MySQL笔记汇总(1)基础篇

    通用语法及分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段) DML: 数据操作语言,用来对数据库表中的数据进行增删改 DQL: 数据查询语言,用来查询数据库中表…

    技术杂谈 2023年7月24日
    060
  • PYQT5学习(12)Qtabwidget选项卡及其窗口,Qstackedwidget和Qtabwidget的效果类似,以及系统托盘QsystemtrayIcon

    参考博文:https://blog.csdn.net/jia666666/article/details/81669092QTabWidget控件提供一个选项卡和一个页面区域,默认…

    技术杂谈 2023年7月24日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球