浅谈MyBatis的工作原理

浅谈Mybatis中的事务提交Commit()方法 Mybatis通过对JDBC进行封装,极大地简化了程序员对数据库的操作,例如对数据库的增删改查操作。其中当进行增删改操作时,都会涉及到用户数据的提交,那么Mybatis中究竟是如何完成数据的提交的呢?这里将对Mybatis中的commit()方法进行简单的剖析,看看底层是如何实现事物提交的。 其实Mybatis中可以设置自动提交功能。在利用工厂模式获得SqlSession实现类对象时,采用openSession(true),即可实现自动提交,无需调用commit()方法。但是程序是为了现实中的应用场景 阅读详情

了解MyBatis工作原理先了解这几个类的作用:

Configuration           MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中

SqlSession               作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能

Executor                   MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护

StatementHandler    封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等

ParameterHandler    负责对用户传递的参数转换成JDBC Statement 所对应的数据类型

ResultSetHandler     负责将JDBC返回的ResultSet结果集对象转换成List类型的集合

TypeHandler             使用Java反射技术完成JavaBean对象到数据库参数之间的相互转换

SqlSource                 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回

BoundSql                  表示动态生成的SQL语句以及相应的参数信息

MyBatis层次结构图:

 

创建SqlSession的工程源码解读:

// 这是一个创建SqlSession的过程

// 将配置文件以流的形式引入
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建SqlSessionFactory
SqlSessionFactoryBuilder sessionFactory = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = sessionFactory.build(inputStream);
// 创建sqlSession
SqlSession session = factory.openSession();
  • 了解一下SqlSessionFactory创建过程及作用:
/**
 * SqlSessionFactoryBuilder类中只有9个重写的build方法,
 * 我删除了方法体中的内容、
 */

public class SqlSessionFactoryBuilder {

  
  public SqlSessionFactory build(Reader reader) {}

  public SqlSessionFactory build(Reader reader, String environment) {}

  public SqlSessionFactory build(Reader reader, Properties properties) {}

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {}

  // 以流的形式将配置文件引入
  public SqlSessionFactory build(InputStream inputStream) {}

  public SqlSessionFactory build(InputStream inputStream, String environment) {}

  public SqlSessionFactory build(InputStream inputStream, Properties properties) {}
  
  // 将主配置文件加载
  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {}
  
  // 将主配置文件引入的其他配置文件加载
  public SqlSessionFactory build(Configuration config) {}

}

 

  • 接下来看一下SqlSession的创建过程:
// SqlSession和核心类Executor挂钩
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
    this.configuration = configuration;
    this.executor = executor;
    this.dirty = false;
    this.autoCommit = autoCommit;
  }

  public DefaultSqlSession(Configuration configuration, Executor executor) {
    this(configuration, executor, false);
  }
  • SqlSession都是通过Executor来执行的,所以Executor是MyBatis的核心。
  • Executor并没有真正的去执行数据库操作,而是交由StatementHanlder来处理的。
public interface StatementHandler {

	//从Connection中获取Stament对象
	Statement prepare(Connection connection) throws SQLException;
	
	//设置预处理参数
	void parameterize(Statement statement) throws SQLException;
	
	//调用批量操作
	void batch(Statement statement) throws SQLException;
	
	//更新操作
	int update(Statement statement) throws SQLException;
	
	//查询操作
	<E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException;
	
	//获取执行SQL语句的封装类BoundSql
	BoundSql getBoundSql();
	
	//参数处理器
	ParameterHandler getParameterHandler();

}
  •  接下来就是使用ParameterHandler来设置参数,getParameterObject()是获取参数的,而setParameters()是设置参数的

        ,相当于对一条sql所有的参数都执行ps.setXXX(value); 

/**
 * A parameter handler sets the parameters of the {@code PreparedStatement}
 *
 * @author Clinton Begin
 */
public interface ParameterHandler {

  Object getParameterObject();

  void setParameters(PreparedStatement ps)
      throws SQLException;

}
  • 从mybatis接收参数到mysql存储数据,都会用到typeHandler类型处理器。这也就是从JavaType->JdbcType的转化过程。由于mybatis初始时已经内置大部分基础类型转化的TypeHandler,已经足够我们平常的简单应用开发了,所以大多数情况下并不需要我们自己去定义类型转换器。
public TypeHandlerRegistry() {
    register(Boolean.class, new BooleanTypeHandler());
    register(boolean.class, new BooleanTypeHandler());
    register(JdbcType.BOOLEAN, new BooleanTypeHandler());
    register(JdbcType.BIT, new BooleanTypeHandler());

    register(Byte.class, new ByteTypeHandler());
    register(byte.class, new ByteTypeHandler());
    register(JdbcType.TINYINT, new ByteTypeHandler());

    register(Short.class, new ShortTypeHandler());
    register(short.class, new ShortTypeHandler());
    register(JdbcType.SMALLINT, new ShortTypeHandler());

    register(Integer.class, new IntegerTypeHandler());
    register(int.class, new IntegerTypeHandler());
    register(JdbcType.INTEGER, new IntegerTypeHandler());

    register(Long.class, new LongTypeHandler());
    register(long.class, new LongTypeHandler());

    .......
}
  • 这样就生成了原生的JDBC操作代码。
  • 再看ResultSetHandler负责的任务:

(1)处理Statement执行后产生的结果集,生成结果列表

(2)处理存储过程执行后的输出参数

/**
 * @author Clinton Begin
 */
public interface ResultSetHandler {

  // 处理执行statement后的结果集
  <E> List<E> handleResultSets(Statement stmt) throws SQLException;

  // 执行存储过程执行后的输出参数
  <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;

  void handleOutputParameters(CallableStatement cs) throws SQLException;

}

 

Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法 摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。 阅读详情

相关推荐

告别轮询!用STM32CubeMX给STM32F030配置ADC多通道+DMA,实测代码分享

本文详细介绍了如何使用STM32CubeMX为STM32F030配置ADC多通道采集与DMA传输,显著提升采集效率。通过实测对比轮询与DMA模式的性能差异,提供完整的代码实现和优化技巧,帮助开发者快速掌握这一高效采集方案。

weixin_42570296的博客 410

[Mybatis源码篇]二、TypeHandler原理

是什么 上一篇说到Mybatis会把所有的配置放到一个类中——Configuration 在这个Configuration里,有一个对象叫做 TypeHandlerRegistry。 TypeHandlerRegistry是一个TypeHandler容器,而TypeHandler定义着Java类型与数据库类型之间的映射关系。 构造函数中自定义了一些映射关系,作为myabtis的默认配置。 除了默认的处理器外,mybatis允许用户自定义处理器,满足一些特殊场合的引用。 用户需要继承...

小楼夜听雨的博客 937

国产机载操作系统天脉ACoreOS实战:从零搭建开发环境到应用移植

本文详细介绍了国产机载操作系统天脉ACoreOS的实战开发流程,从核心特性解析到开发环境搭建,再到VxWorks应用移植策略。重点阐述了其符合ARINC 653标准的时空分区架构如何保障高可靠性,并提供了从零创建分区工程、重构通信与任务代码的具体步骤,为开发者向这一国产化平台迁移提供了实用指南。

flower的专栏 634

JDBC简介(2)

前篇:JDBC简介(1) 1、Connection角色       Connection表示与特定数据库的连接,可以获取到数据库的一些信息,这些信息包括:其表信息,应该支持的SQL语法,数据库内有什么存储过程,此链接功能的信息等等。 在一般实际使用情况下,我们关注的Connection的功能有以下几点: 1.1 创建可以执行sql语句或者存储过程的对象stateme

爱上在路上 938

避坑指南:LISFLOOD-FP模型数据单位、参数文件与results文件夹结果解析全攻略

本文详细解析了LISFLOOD-FP洪水模拟模型的关键应用环节,包括数据单位校验、参数文件优化及结果文件解读与可视化。特别针对常见的单位混淆问题,提供了从DEM到边界条件的全面校验方法,并深入剖析了.par参数文件的配置技巧,帮助用户避免模型崩溃和结果失真。

weixin_42533622的博客 237

OpenIddict实战指南:在.NET Core中构建安全的OAuth 2.0与OpenID Connect服务

本文详细介绍了如何在.NET Core中使用OpenIddict框架构建安全、标准的OAuth 2.0与OpenID Connect授权服务。内容涵盖从快速搭建授权服务器、理解核心配置与授权流程,到集成用户数据库、实现完整登录授权,以及生产环境下的安全加固与部署指南,为.NET开发者提供了一套现代、可维护的认证授权解决方案。

weixin_29229989的博客 355

MyBatis基本工作原理介绍

1、MyBatis基本工作原理介绍 计算机的基本工作就是存储和计算,而MyBatis是存储领域的利器。MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。 2、MyBatis的核心流程介绍 mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory,然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过

weixin_44431073的博客 2万+

三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)

三维旋转引言三维旋转1)欧拉角2)轴角式旋转分解1)V||的旋转2)V⊥的旋转3)V的整体旋转 引言 前面我们了解了 复数在二维旋转中的作用与联系 而四元数与三维旋转之间的关系与复数对二维旋转有很多类似的地方,下面我们就先来详细了解一下三维旋转的过程。 三维旋转 首先讨论一下三维旋转,我们了解到常用的三维旋转有两种方式: 1)欧拉角 即按照一定的顺序,分别对X, Y, Z三个轴进行旋转 θ 角。绕各旋转轴的旋转矩阵为: 然后任意的三维旋转可以分解成上述三种旋转方式的组合。(注意:三个旋转的顺序是非常重要的

晓晨的博客 1万+

MyBatis的工作原理

MyBatis 是一个功能强大的持久层框架,通过对 SQL 语句的精确控制和方便的映射配置,提供了一种灵活且高效的数据库访问方式。MyBatis 的工作原理主要围绕SqlSessionMapperExecutor这几个核心组件展开,通过配置文件和映射文件,将 Java 对象和数据库表有效地连接起来。MyBatis 通过动态代理、缓存机制、动态 SQL、插件机制等特性,极大地提升了数据库操作的简洁性和可维护性,同时保留了对 SQL 语句的完全控制权,适合于各种需要精细化控制 SQL 的场景。

Flying_Fish_roe的博客 3207

AVL Cruise 2020.1 安装教程

AVL Cruise 2020.1 安装教程

chengkai730的博客 9486

SAP 屏幕增强:客户商主数据屏幕增强(KNA1、KNB1、KNVV)

本文介绍了SAP系统中针对客户主数据(KNA1、KNB1、KNVV)进行屏幕增强的具体实现方法。主要内容包括:1)在SPRO配置中创建新条目;2)通过SE80创建函数组和程序(LZKNA1TOP等);3)设置子屏幕9001并添加自定义结构字段;4)利用BADI(CUSTOMER_ADD_DATA等)实现数据交互逻辑。文章分别详细说明了针对客户主数据的一般数据(KNA1)、公司代码数据(KNB1)和销售数据(KNVV)三类不同数据的增强配置步骤,包括函数模块创建、屏幕设置和BADI方法调用等关键技术点。

SAP ABAP开发技能记录分享 1617

MyBatis 的工作原理解析

本文记录 Mybatis 的工作原理解析,做到知识梳理总结的作用。

m0_49692893的博客 3598

第67步 时间序列建模实战:ARIMA建模(Stata)

第67步 时间序列建模实战:ARIMA建模(Stata)

Jet4505的博客 6821

浅谈MyBatis的工作原理以及核心流程

在行内日常开发工作中,基于Java的研发项目会大量的与数据库做交互访问。传统方式是通过JDBC访问数据库,不仅需要繁琐的手工编写很多代码,增加了工程项目的复杂度,而且存在难以维护,配置不够灵活等特点。为解决传统解决方案存在的痛点,MyBatis作为一种开源的持久化框架应运而生。Mybatis是一种基于Java编程语言的ORM(对象关系映射)框架。它使用XML或注解的方式来描述SQL语句,将Java对象和关系型数据库中的数据进行映射,以实现数据的操作和持久化。

2301_76166241的博客 1382

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

浅谈MyBatis

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

AN_NI_112的博客 1321

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

浅谈 mybatis

一、什么是Mybatis Mybatis 是一个持久层的框架(dao),他是一个半自动ORM(对象关系映射)框架,它是对jdbc操作的一次封装 ORM: Object Relational Mapping,简称ORM ​ O:对象 ​ R:关系(对象和表关系) ​ M:映射(就是把表中的字段的值 映射到 对象的属性中) 半自动:就是需要自己书写sql语句 如何使用: 1、导入Mybatis的架包 2、配置Mybatis中的核心配置文件(有两种):1:核心配置文件(mybatis-config.xml):配置

weixin_49928707的博客 198

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MyBatis浅谈

1、什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 2、Mybatis优点 通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数...

Winn~ 293

浅谈MyBatis缓存

学过MyBatis框架的都知道,MyBatis自带一二级缓存,并且还有第三方给MyBastis提供二级缓存,例如ehcache、memcache,本文粗略的讲一下这个几个缓存的机制和使用吧。 首先解释一下缓存存在的意义:他避免了相同的sql查询语句频繁的去访问数据库。自动的把第一次查询的结果放在了缓存中,后续再次查询该同样的对象时,则直接从缓存中查询该对象即可。 一级缓存: MyBatis默认开启一级缓存,范围是同一个SqlSession对象。 public static void query() thro

JAVA领域优秀创作者 219

浅谈MyBatis连接数据库

   首先简单介绍一下MyBatis:MyBtis前身是iBatis,本是Apche的一个开源项目,2010年这个项目由Apache Software Foundation 迁移到了Google Code,并改名为MyBatis.2013年迁移到Github。MyBtis是一个开源的数据持久层框架。MyBatis内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎...

biubiubiulover的博客 1万+

浅谈Mybatis插件机制

哈哈哈,今天又拖更了!! Mybatis插件机制 废话不多说,直接进入主题,这个Mybatis插件机制有点像Spring MVC的拦截器,底层的設計模式都是拦截器模式。 插件机制原理 我们在编写插件时,除了需要让插件类实现 Interceptor 接口,还需要通过注解标注该插件的拦截点。所谓拦截点指的是插件所能拦截的方法,MyBatis 所允许拦截的方法如下: Executor (update, query, flushStatements, commit, rollback, getTransact.

Professor11的博客 436

浅谈Mybatis之mybatis是什么?

Mybatis是什么?在回答这个问题前,让我们先看一张图。 这张图想要传递的信息有两条。 一,程序员甲过去经常使用sql操作数据库,自从他遇见了mybatis,开发效率立马提升好多倍! 二,mybatis作为众多orm框架中的一员,其实质无非就是对纯jdbc进行封装,让程序员能够以面向对象的思想操作数据库而已。 说白了,mybatis就是jdbc的壳儿!mybatis与orm的关系myb

简简简简abc 4202

浅谈 MyBatis 缓存

1、一级缓存 MyBatis 默认开启了一级缓存,一级缓存是在 SqlSession 层面进行缓存的。即,同一个 SqlSession ,多次调用同一个 Mapper 和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。但是不同的 SqlSession 对象,因为不用的 SqlSession 都是相互隔离的,所以相同的 Mapper、参数和方法,它还是会再次发送到 SQL 到数据库去执行,返回结果。 2、二级缓存 为了解决这个问题,需要手

m0_67401660的博客 306

浅谈MyBatis3连接池

MyBatis3连接池分析

懒人的博客 6111

浅谈Mybatis的一级缓存和二级缓存

MyBatis的缓存机制 缓存的引入 当我们大量执行重复的查询SQL语句的时候,会频繁的和数据库进行通信,会增加查询时间等影响用户体验的问题,可以通过缓存,以降低网络流量,使网站加载速度更快. MyBatis的一级缓存 默认情况下,MyBatis只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。这也就是大家常说的MyBatis一级缓存,一级缓存的作用域是SqlSession。 第1种情况:同个session进行两次相同查询 代码验证 //测试一级缓存 @Test

Zmj的博客 1231

浅谈框架之Spring,Mybatis

芜湖!!!!!!

m0_63750620的博客 260
上一篇: 简单几行代码理解hashCode()、identityHashCode()、equals()关系和区别
下一篇: Spring框架的各个jar包及其作用
_Howard_Allen
博客等级 码龄8年 5粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值