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

目录
  • 一、传统JDBC的弊端
  • 二、mybatis介绍
  • 三、MyBatis架构图
    • 核心类解释
    • 工作流程
  • 四、自己通过加载xml配置走mybais流程实现例子
  • 总结

一、传统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

总结

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

(0)

相关推荐

  • Java经典面试题汇总:Mybatis

    目录 1. MyBatis 中 #{}和 ${}的区别是什么? 2. MyBatis 有几种分页方式? 3. MyBatis 逻辑分页和物理分页的区别是什么? 4. MyBatis 是否支持延迟加载?延迟加载的原理是什么? 5. 说一下 MyBatis 的一级缓存和二级缓存? 6. MyBatis 有哪些执行器(Executor)? 7. MyBatis 分页插件的实现原理是什么? 8. MyBatis如何返回主键? 9. Xml映射文件中,除了常见的select|insert|update|d

  • Java中Mybatis,SpringMVC,Spring的介绍及联系

    目录 一.Mybatis 1.简介 2.工作原理: 3.工作流程图: 二.SpringMVC 1.MVC工作原理: 1.1.MVC工作原理图: 2.1.SpringMVC工作原理 2.2.SpringMVC中的组件: 2.3.SpringMvc工作原理图 2.4. SpringMvc工作流程 2.5. SpringMVC重点 三.Spring 1.简介: 2.Spring原理: 3.Spring AOP与IOC 3.1. IoC(Inversion of control): 控制反转 3.2.A

  • java SpringMVC学习使用详解

    Controller学习(Spring官网) SpringMVC 标记 某些java代码使其成为Controller,从而这些代码具有和前端网页 交互数据的功能了. 在学习controller之前先把SpringMVC大致捋一下: 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供

  • Java框架---Spring详解

    目录 一 技术发展 二 框架设计 Spring Framework 6大模块 三 Spring AOP详解 AOP两种方式 四 Spring Bean核心原理 Bean的加载过程 五 Spring XML配置原理 六 Spring Messaging相关技术 七 总结 一 技术发展 技术的创新和发展都是为了解决一类问题 二 框架设计 Spring Framework 6大模块 三 Spring AOP详解 循环依赖问题如何处理? 打破依赖 / 超时推出机制 AOP两种方式 字节码增强技术 四 S

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

    目录 一.传统JDBC的弊端 二.mybatis介绍 三.MyBatis架构图 核心类解释 工作流程 四.自己通过加载xml配置走mybais流程实现例子 总结 一.传统JDBC的弊端 jdbc没有连接池.操作数据库需要频繁创建和关联链接,消耗资源很大. 在java中,写原生jdbc代码,硬编码不易维护(比如修改sql.或传递参数类型时.解析结果). 二.mybatis介绍 MyBatis是一款优秀的持久层框架,它支持自定义SQL.存储过程以及高级映射.MyBatis免除了几乎所有的JDBC代码

  • 一篇文章带你了解Java Spring基础与IOC

    目录 About Spring About IOC Hello Spring Hello.java Beans.xml Test.java IOC创建对象的几种方式 Spring import settings Dependency Injection 1.构造器注入 2.set注入 3.拓展注入 P-namespcae&C-namespace Bean scopes singleton prototype Bean的自动装配 byName autowire byType autowire 小结

  • 一篇文章带你了解Java中ThreadPool线程池

    目录 ThreadPool 线程池的优势 线程池的特点 1 线程池的方法 (1) newFixedThreadPool (2) newSingleThreadExecutor (3) newScheduledThreadPool (4) newCachedThreadPool 2 线程池底层原理 3 线程池策略及分析 拒绝策略 如何设置maximumPoolSize大小 ThreadPool 线程池的优势 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些

  • 一篇文章带你了解JAVA面对对象应用

    目录 常用API String类 关于String为啥不可改变 StringBuilder类 String.StringBuffer 和 StringBuilder 的区别: ArrayList 1.1ArrayList类概述 1.2ArrayList类常用方法 学生管理系统 总结 常用API API理解 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将

  • 一篇文章带你入门Java字面量和常量

    目录 引言 概念 字面量 字面量的分类 常量 总结 引言 ♀ 小AD:哥,前两天我没有闪现到刺客脸上了吧 ♂ 明世隐:在这方面做的有进步. ♀ 小AD:明哥教的好,通过学习Java关键字,游戏水平也得到了提升,一举两得,舒服. ♂ 明世隐:可是你看到残血还是上头啊,是了多少次,你说? ♀ 小AD:5.6次吧 ♂ 明世隐:岂止5.6,起码10次. ♀ 小AD:这不是看到200金币,经不住诱惑吗 ♂ 明世隐:关爱残血,你学哪里去了,游戏中就不能多一些人间的关爱吗?你就不能关爱一下放暑假的小弟弟小妹妹

  • 一篇文章带你学习Mybatis-Plus(新手入门)

    目录 Mybatis-Plus 1.快速入门地址:安装 | MyBatis-Plus (baomidou.com) 2.创建数据库mybatis-plus 3.创建springboot项目,配置yml文件 4.导入依赖 5.创建pojo包,新建User实体类 6.创建mapper包,新建UserMapper实体类 7.在主启动类中加上Mapperscan注解扫描mapper映射文件 8.查询所有数据测试类 9.开启mybatis-plus日志配置文件 10.主键生成策略 11.增加数据测试类 1

  • 一篇文章带你了解Java容器,面板及四大布局管理器应用

    目录 什么是容器? 什么是面板? JPanel面板 JScrollPane面板 什么是布局管理器? 绝对布局管理器 流布局管理器 边界布局管理 网格布局管理器 容器.面板.布局管理器之间的关系 总结 什么是容器? 在Java的GUI界面设计中,关于容器的理解,从字面意思我们就可以认为它是存放控件的地方,而这个地方依托在窗体之上,常用的容器是container. 而关于container容器我们应该有这样的认识:Swing组件中的窗体通常是与容器相关联的,所以在一般情况下,建立完JFrame窗体后

  • 一篇文章带你入门Java继承

    目录 Java中继承 什么是继承: 为什么要用继承: 学习总结: 继承关键字:extends 总结 Java中继承 什么是继承: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 为什么要用继承: 可以去掉重复代码,方便后期维护 举个列子,大家应该都玩过英雄联盟,每个英雄都是一个类,如果说不用继承的话每次都要重复定义每个英雄的成员属性,如下图我举了一个MF,一个EZ的列子 public class MissFortu

  • 一篇文章带你入门Java运算符

    目录 算数运算符(Arithmetic operator) 关系运算符(Relational operator) 逻辑运算符(Logical operator) 赋值运算符(Assignment Operators) 三元运算符(Ternary operator) 运算符优先级 标识符的命名规则和规范 关键字定义和特点 保留字 总结 运算符时一种特殊的符号,用以表示数据的运算,赋值和比较等. 算数运算符 赋值运算符 关系运算符 逻辑运算符 位运算符 三元运算符 算数运算符(Arithmetic

  • 一篇文章带你入门java面向对象

    目录 一.继承 示例: 二.重载 三.接口 1.接口与类相似点: 2.接口与类的区别: 3.语法 四.枚举 1.定义 2.迭代枚举元素 3.在 switch 中使用枚举类 总结 一.继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为 本章就以人.学生.老师作为例子.学生和老师都继承人这个对象,都有人的特征和行为,人就是父类,老师和学生就是子类 示例: 人类: package com.zhouzy.base.t7;

随机推荐