一篇文章带你学习JAVA MyBatis底层原理

 更新时间:2021年09月02日 10:20:48   作者:令狐前生  
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,本文就详细总结了MyBatis工作原理,,需要的朋友可以参考下

一、传统JDBC的弊端

  • jdbc没有连接池、操作数据库需要频繁创建和关联链接,消耗资源很大。
  • 在java中,写原生jdbc代码,硬编码不易维护(比如修改sql、或传递参数类型时、解析结果)。

二、mybatis介绍

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

三、MyBatis架构图

核心类解释

SqlSessionFactoryBuilder:

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个 SqlSessionFactory实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory:

SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次,多次重建SqlSessionFactory被视为一种代码“坏习惯”。因此SqlSessionFactory的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession:

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将SqlSession实例的引用放在任何类型的托管作用域中,如Servlet框架中的HttpSession。如果你现在正在使用一种Web框架,考虑将SqlSession放在一个和HTTP请求相似的作用域中。换句话说,每次收到HTTP请求,就可以打开一个SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到finally块中。

Executor:

Executor(执行器)接口有两个实现类,其中BaseExecutor有三个继承类分别是BatchExecutor(重用语句并执行批量更新),ReuseExecutor(重用预处理语句prepared statement,跟Simple的唯一区别就是内部缓存statement),SimpleExecutor(默认,每次都会创建新的statement)。

Mapped Statement:

用来存放我们SQL映射文件中的信息包括sql语句,输入参数,输出参数等等。一个SQL节点对应一个MappedStatement对象。

工作流程

首先解释下两个文件

mybatis-config.xml:全局配置文件,引入了数据源、事务等mybatis运行环境;

Mapper.xml:配置映射文件,配置sql结果集封装类型、传参类型;

1.解析配置文件(MyBatis-config.xml、Mapper.xml),MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

2.SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。

3.SqlSessionFactory创建会话SqlSession;

4.执行器将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象,使用Paramterhandler填充参数,使用statementHandler绑定参数。

5.JDBC执行sql,借助MappedStatement中的结果映射关系,使用ResultSetHandler将返回结果转化成HashMap、JavaBean等存储结构并返回。

6.关闭sqlsession会话。

四、自己通过加载xml配置走mybais流程实现例子

获得代理映射器代码(在MapperProxyFactory<T>):

    protected T newInstance(MapperProxy<T> mapperProxy) {
        return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
    }

参考资料:https://baijiahao.baidu.com/s?id=1666562082269776543&wfr=spider&for=pc

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Java后端实现MD5加密的方法

    Java后端实现MD5加密的方法

    有的时候因为业务的需要,我们要制作关于密码的修改功能。而关于密码的加密一般都是用MD5,那么这篇文章将介绍如何在Java的后端实现MD5加密,有需要的可以参考借鉴。
    2016-08-08
  • 详解Java线程池的使用(7种创建方法)

    详解Java线程池的使用(7种创建方法)

    这篇文章主要介绍了详解Java线程池的使用(7种创建方法),线程池的创建⽅式总共包含7种,其中6种是通过Executors创建的,1种是通过ThreadPoolExecutor创建的,今天我们就来详细说一下
    2023-03-03
  • Spring MVC实现GET请求接收Date类型参数

    Spring MVC实现GET请求接收Date类型参数

    这篇文章主要介绍了Spring MVC实现GET请求接收Date类型参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Intellij无法创建java文件解决方案

    Intellij无法创建java文件解决方案

    这篇文章主要介绍了Intellij无法创建java文件解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringCloud之Zuul服务网关详解

    SpringCloud之Zuul服务网关详解

    这篇文章主要介绍了SpringCloud之Zuul服务网关详解,服务网关是微服务架构中一个不可或缺的部分,通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制(鉴权)等功能,需要的朋友可以参考下
    2023-08-08
  • java利用Socket实现聊天室功能实例

    java利用Socket实现聊天室功能实例

    这篇文章主要介绍了java利用Socket实现聊天室功能实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • 轻轻松松吃透Java并发fork/join框架

    轻轻松松吃透Java并发fork/join框架

    fork/join是一个工具框架 ,本文详细的介绍了fork/join框架的具体使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java_int、double型数组常用操作工具类(分享)

    Java_int、double型数组常用操作工具类(分享)

    下面小编就为大家带来一篇Java_int、double型数组常用操作工具类(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java后台Controller实现文件下载操作

    Java后台Controller实现文件下载操作

    这篇文章主要介绍了Java后台Controller实现文件下载操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java中SpringBoot 自动装配的原理分析

    java中SpringBoot 自动装配的原理分析

    这篇文章主要介绍了SpringBoot 自动装配的原理分析的相关资料,需要的朋友可以参考下
    2022-12-12

最新评论