浅析MyBatis的工作原理

RK3308B开发板WiFi+蓝牙一体模组RTL8821CS驱动移植保姆级教程(含DTS配置与避坑点) 本文提供RK3308B开发板RTL8821CS WiFi+蓝牙模组驱动移植的完整教程,涵盖SDK环境配置、DTS设备树设置、内核编译优化及功能验证全流程。重点解析引脚复用冲突、电源管理等关键配置,并给出常见错误解决方案,帮助开发者快速实现双模通信功能。 阅读详情

一、Mybatis是什么

      myBatis是常见的Java数据库访问层框架,相比于传统的JDBC,Mybatis可以进行更为细致的SQL优化,减少查询字段、统一的SQL管理。

二、Mybatis的原理

      当我们使用mybatis的时候,通常需要配置一个xml文件,假如叫mybatis-config.xml文件,类似下面这样

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <setting name="logImpl" value="SLF4J"/>
    <!--<setting name="cacheEnabled" value="true" />-->
  </settings>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url"
          value="jdbc:mysql://localhost:3306/tanjie?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="tanjie666"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mapper/UserMapper.xml"/>
  </mappers>
</configuration>

      当我们配置了xml文件,然后需要一个mapper文件,这里我们叫UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tanjie.entity.mapper.UserMapper">
  <select id="findUserById" resultType="com.tanjie.entity.User">
      select * from  user where id = #{id}
  </select>
</mapper>

  然而mybatis是如何根据我们的配置来和DB进行数据交互的?下面我们一步一步跟着源码来解答这些疑问。

2.1 构建SqlSessionFactory

package com.tanjie.mybatis;


import com.alibaba.fastjson.JSON;
import com.tanjie.entity.User;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisDemo {

  public static void main(String[] args) throws IOException {
    String resource = "mybatis-config.xml";
    //读取核心配置文件并返回InputStream流对象。
    InputStream inputStream = Resources.getResourceAsStream(resource);
    //构建configuration对象,拿到数据源 dataSource,创建SqlSessionFactory工厂对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //根据一系列属性从SqlSessionFactory工厂中创建SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //从SqlSession中调用Executor执行数据库操作&&生成具体SQL指令
    User user = sqlSession.selectOne("com.tanjie.entity.mapper.UserMapper.findUserById", 1);
    System.out.println(JSON.toJSONString(user));
  }


}
  

     在这个main方法里面,首先我们读取mybatis-config.xml文件获取了一个InputStream,下一步我们构建了一个SqlSessionFactory对象,我们就从这一步入口,先看一下,mybatis是如何构建SqlSessionFactory的

 当执行

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

会走到下面这段代码,

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    SqlSessionFactory var5;
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      var5 = this.build(parser.parse());
    } catch (Exception var14) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
    } finally {
      ErrorContext.instance().reset();

      try {
        inputStream.close();
      } catch (IOException var13) {
      }

    }

    return var5;
  }

 这里面我们需要关注的是var5=this.build(parser.parse());

  public Configuration parse() {
    if (this.parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    } else {
      this.parsed = true;
      this.parseConfiguration(this.parser.evalNode("/configuration"));
      return this.configuration;
    }
  }

      上面代码片段的 核心就是解析我们的mybatis-config.xml文件,然后映射为一个Configuration对象,可以看到,传入的root对象就是我们的配置文件

  在这个方法里面,会依次解析xml,读取里面的配置,比如我们的dataSource是配置在environments节点下的,入口为

this.environmentsElement(root.evalNode("environments"));
private void environmentsElement(XNode context) throws Exception {
    if (context != null) {
      if (this.environment == null) {
        this.environment = context.getStringAttribute("default");
      }

      Iterator i$ = context.getChildren().iterator();

      while(i$.hasNext()) {
        XNode child = (XNode)i$.next();
        String id = child.getStringAttribute("id");
        if (this.isSpecifiedEnvironment(id)) {
          TransactionFactory txFactory = this.transactionManagerElement(child.evalNode("transactionManager"));
          DataSourceFactory dsFactory = this.dataSourceElement(child.evalNode("dataSource"));
          DataSource dataSource = dsFactory.getDataSource();
          Builder environmentBuilder = (new Builder(id)).transactionFactory(txFactory).dataSource(dataSource);
          this.configuration.setEnvironment(environmentBuilder.build());
        }
      }
    }

  }

   再比如我们配置的mapper对应的xml文件在节点mapper下面,入口为

 this.mapperElement(root.evalNode("mappers"));

   上面的代码即是映射为一个configuration对象,最后构建一个SqlSessionFactory

 public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

   2.2 创建SqlSession

    执行代码如下

 SqlSession sqlSession = sqlSessionFactory.openSession();

 

 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;

    DefaultSqlSession var8;
    try {
      Environment environment = this.configuration.getEnvironment();
      TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      Executor executor = this.configuration.newExecutor(tx, execType);
      var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
    } catch (Exception var12) {
      this.closeTransaction(tx);
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
    } finally {
      ErrorContext.instance().reset();
    }

    return var8;
  }

  上面的代码代码片段主要做了几件事情,

2.2.1 根据configuration的Environment属性来创建事务工厂

2.2.2 根据事务工厂创建事务

2.2.3 创建执行器Executor

2.2.4 根据执行器创建SqlSession

下面的片段可以看到SqlSession对象持有Executor

  2.3 Executor操作DB

 

  当我们执行  
User user = sqlSession.selectOne("com.tanjie.entity.mapper.UserMapper.findUserById", 1); 

  代码进入到

      根据我们传入的statement,从configuration里面拿到MappedStatement,所以mybatis是根据类名+方法名来定位一个Sql的,故我们不能在我们的mapper文件里面重载某个方法。

    然后拿到id对应的sql语句,和DB进行交互,返回Result

  

       至此,mybatis是如何和DB进行交互的流程就走完了,我们画一个简单的时序图来回顾一下

 

 

 

 

 

 

 

 

 

nicegui 可视化扩展库 总体来说,这段代码使用nicegui库创建了一个具有一些基本UI元素的界面,并使用扩展库来实现更多的布局功能。这段代码使用了nicegui库创建了一个UI界面。函数导入了一个扩展库,用于实现更多的布局功能。然后又使用了一个行布局,并添加了两个按钮(在UI界面中,使用了一个卡片(在行布局中依次添加了一个标签(在卡片中使用了一个头像(接下来使用了一个行布局(设置了背景颜色为绿色。设置了居中对齐和红色。设置了间距和字体大小。设置了居中对齐和样式。设置了按钮的对齐方式。 阅读详情

相关推荐

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 926

MyBatis原理分析-深入浅出

真正掌握一个框架源码分析是少不了的~ 在讲解整合Spring的原理之前理解原生的MyBatis执行原理是非常有必要的 MyBatis工作流程简述 - 传统工作模式 public static void main(String[] args) { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactor

lucky_love816的博客 540

Android7以上抓取https数据包-无需root

手机内装一个虚拟机,然后在虚拟机内运行我需要抓包的应用,该虚拟机内是不需要证书验证的。完美解决android7.0以上https无法抓包的问题。

qq_45764684的博客 1454

使用myBatis访问数据库原理

本文介绍mybatis访问数据库的流程以及其插件原理 使用 配置文件如下 一般使用方式如下 下面介绍访问数据库具体流程 构建DefaultSqlSessionFactory对象 new SqlSessionFactoryBuilder().build(reader); 使用XMLConfigBuilder进行配置文件解析 解析sql配置文件 XMLMapperBuilder解析 org.a...

u012829112的博客 1687

保姆级教程:用Python和PyTorch复现PTB-XL心电信号分类论文(附完整代码)

本文提供了一份详细的PTB-XL心电信号分类教程,涵盖从数据预处理到模型优化的完整流程。通过PyTorch实现三种深度学习架构(Conv1D、SincNet和熵特征融合网络),并针对医疗AI特有的类别不平衡问题提供解决方案。教程包含可运行的代码示例,帮助开发者快速复现论文结果并应用于实际心电信号分析场景。

weixin_30555125的博客 405

Vcenter虚拟机磁盘转换实战:如何用StarWind V2V将vmdk转为qcow2(附空间优化技巧)

本文详细介绍了如何使用StarWind V2V Converter将Vcenter中的vmdk虚拟机磁盘高效转换为qcow2格式,并提供了空间优化技巧。从准备工作、导出vmdk文件到转换过程中的性能调优,帮助管理员在迁移虚拟机时减少资源消耗,确保数据完整性和性能。

dell8的博客 203

mybatis连接数据库底层原理

这行代码中的child.evalNode("dataSource")方法,该方法的作用就是解析< dataSource >标签及其子标签的属性值,获取数据库连接属性,如下图所示。这三种连接数据库属性的配置方式,任选一种即可,也可以三种方式混合使用。Mybatis在加载这些属性时,首先读取第一种方式配置的,其次读取第二种方式配置的,最后读取第三种方式配置的,如果三种方式中存在同名属性,先读取的属性会被后读取的属性覆盖,即第三种配置方式的优先级高于第二种方式,第二种方式的优先级高于第一种方式。

cxbtdd的博客 1210

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”画面并进行“思考”,是当前视觉项目的重点。我们知道目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。因此本项目将 YOLO 目标检测模型(兼容 YOLO26/v11/v8 系列)与 DeepSeek 等顶流大语言模型(LLM) 进行联合,使用 Django (后端) + Vue3 (前端) 技术栈

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2839

MyBatis 的工作原理解析

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

m0_49692893的博客 3598

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 205

支付宝h5参数如何实现跳转?(包含相关Demo代码)

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 3249

MyBatis的工作原理

细讲MyBatis的工作原理

qingsushuo的博客 2428

1.嵌入式控制器EC学习,编译环境搭建

工欲善其事,必先利其器。 在学习EC相关知识之前,首先需要完成EC代码编译环境的搭建,需要如下内容: Keil C51(用于EC中C代码的编译器环境) EC源代码,我们使用从网上可以下载到的 ITE_V12.4_Update 版的代码为例进行学习 代码编辑器,这个可以根据自己的习惯选择,VS Code或者Source Insight等 Keil C51下载地址: http://www.downcc.com/soft/307131.html 下载完成后请进行破解 EC源代码 ...

qq_30135687的博客 3917

Mybatis工作原理浅析

萨达撒多

u014018804的博客 253

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mybatis源码笔记之浅析StatementHandler

目录概述职责类图源码 概述 职责 首先了解一下statementHandler职责:主要负责处理MyBatis与JDBC之间Statement的交互,通俗而言就是负责操作Statement对象与数据库之间的交互。其执行过程中主要依赖ParameterHandler和ResultSetHandler进行参数绑定和结果实体类绑定。 类图 BaseStatementHandler:StatementHandler接口的抽象实现类,主要用于简化StatementHandler接口的实现难度,适配 器设计模式的体

增量星球 4985

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Mybatis浅析与应用

在IT行业,与java打交道的伙伴们,相信对Mybatis这个名词很熟悉。这里小编和大家分享浅析Mybatis及其应用。 Mybatis是什么        Mybatis是一个优秀的持久层框架,封装了jdbc操作数据库的过程,支持存储过程、sql定制化、映射,开发人员不用处理jdbc过程。总的来说,它主要做根据 JDBC 规范建立与数据库的连接;实现 Java对象与关系数据库之间相互转化

时光刻下的容颜 843

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot 集成 mybatis 浅析

SpringBoot是对Spring框架的封装增强,通过Starter依赖管理和自动配置机制简化开发。它提供spring-boot-starter-*依赖包自动管理兼容版本,利用@EnableAutoConfiguration基于条件注解实现零配置启动。核心仍为Spring Framework,默认集成SpringMVC但支持多种应用类型。自动配置通过扫描classpath组件实现,开发者也可手动集成非官方模块。相比传统Spring,SpringBoot显著减少了配置工作量,使开发者能快速构建生产级应用。

chxii的专栏 1221

mybatis浅析

SqlSession是Mybatis最重要的构建之一,提供select/insert/update/delete方法,SqlSession的运行主要是依靠Executor执行器调用(调度)StatementHandler、parameterHanlder、ResultSetHandler,Executor首先通过创建StamentHandler执行预编译并设置参数运行。SqlSession重...

taotao12312的博客 404

浅析MyBatis的各个方面

MyBatis的核心组件 SqlSessionFactoryBuilder(构造器):作用是根据配置信息生成SqlSessionFactory(工厂接口) SqlSessionFactory:(工厂接口):作用是生成SqlSession(会话) SqlSession:可以向数据库发送信息的,类似于request对象,或者jdbc的connection对象 S...

weixin_39634532的博客 639

深入浅析MyBatis源码

MyBatis 1. SqlSessionFactoryBuilder通过build方法去解析xml配置文件 通过调用XMLConfigBuilder的parse方法将配置文件封装成一个Configuration对象 Xml节点解析 封装好Configuration对象,回到build方法 进入到这个build创建SqlSessionFactory接口的默认实现类 ...

qq_39606047的博客 315

mybatis架构浅析

MYBATIS架构 mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。 mybatis底层自定义了Executor执行器接口

embelfe_segge的博客 83

MyBatis技术原理浅析:使用MyBatis+Druid连接MySQL数据库

(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.youkuaiyun.com/article/details/95763605冷血之心的博客) 关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~ 目录 前言: 正文: MyBatis是什么? MyBatis的核心组件: SqlSessionFactoryBuilder: SqlSe...

冷血之心的博客 1万+

MyBatis源码浅析

MyBatis源码浅析 我这里分析的源码是spring-mybatis整合的源码 先扒一张mybatis架构图镇楼 一:初始化 mybatis-spring-boot-autoconfigure org\mybatis\spring\boot\autoconfigure\MybatisAutoConfiguration.class mybatis的一切都起源于这里 初始化的时候MybatisPropertise中封装着我们在配置文件中加的关于mybatis所有配置 如果使用了M

lkylkyl的博客 173

浅析Mybatis的SqlSource

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34405332的博客 1438

浅析MyBatis执行器原理

文章目录一、执行器在什么位置二、执行器生成源码解析2.1、生成默认执行器三、执行器的结构分析四、完整查询分析4.1、二级缓存4.2、一级缓存4.3、数据库查询4.4、大致执行结构图五、手写代码还原基本骨架 本文大部分代码来自MyBatis源码,你可以对照着源码一起看 一、执行器在什么位置 初学MyBatis时,我们都知道MyBatis是拥有一级和二级两种缓存,并且默认开启一级缓存,二级缓存我们只需要在配置文件中手动配置即可。 <!--开启全局缓存,默认也是开启的,但是建议还是手动的开启--&

持续Java学习中 802

pageHelper分页及工作原理浅析

1、pageHelper PageHelper是Github上开源的MyBatis分页插件,使用起来简单、方便,支持多种数据库。 Github网址: https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md。 maven: <dependency> <groupId>com.github.pagehelper</groupId>

YUAN_YONG_的博客 3003
上一篇: kafka提交异常org.apache.kafka.clients.consumer.CommitFailedException
下一篇: 深入浅出MYSQL索引实现机制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值