Mybatis源码(三)如何操作数据库

news2025/1/12 7:42:17

前言

接着environmentElement获取数据源信息后,同级执行代码的mappersElement。里面参杂了mybatis缓存。

Mybatis源码(三)如何操作数据库

MyBatis源码(二)如何执行sql

Mybatis源码(一)获取数据源

结构小结

分析main函数:

public class MybatisMain {
    public static void main(String[] args) throws IOException {
        String resource = "mapper/config/mybatis-config.xml"; //全局配置
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        SqlSession session = sqlSessionFactory.openSession();
        OrderPojo orderPojo = session.selectOne("com.cbry.mybatis.OrderDao.findSimpleOrderInfo" , 0);
        System.out.println(orderPojo);
    }
}

我们将一条简单SQL的执行分为三个部分:

  1. Mybatis是如何获取数据库源
  2. Mybatis是如何获取SQL
  3. Mybatis是如何操作数据库

如何运行

寻到DefaultSqlSessionFactory.openSession方法:这里注意到this.configuration.getEnvironment, 我们在获取数据源的时候setEnvironment。如何连接起来的呢?都是同一个类对象:

//setEnvironment
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

//getEnvironment
SqlSession session = sqlSessionFactory.openSession();

由openSession进入:

在这里插入图片描述

这里注意到执行器的产生,这里默认是execTyoe SIMPLE

在这里插入图片描述

BaseExcutor这是一个抽象类,用来存放Executor共有功能的,比如获取连接、缓存操作(一级缓存)

在这里插入图片描述

Caching Executor同样实现了Executor接口,拥有二级缓存的功能,也有着Executor属性,而且使用了**装饰者模式(在不改变原有类结构和继承的情况下,通过组装这个类对象,来扩展一个新功能

在这里插入图片描述

数据库源的配置信息在SqlSessionFactory里面的openssion用到

一级缓存默认开启的源码

在这里插入图片描述

selectOne

对应代码

 OrderPojo orderPojo = session.selectOne("com.cbry.mybatis.OrderDao.findSimpleOrderInfo" , 0);

selectOne和too many报错

在这里插入图片描述

我们把存起来的MappedStatemen又拿出来了。

在这里插入图片描述

在query里面(CachingExecutor实现类):我们发现执行SQL

在这里插入图片描述

传入SQL为何由#dv 变为 ?

执行器里面的sql:传入SQL由#dv 变为 ? :防止SQL注入问题,出入的SQL语句参数全部用?代替的,预编译PreparedStatement将参数值用单引号包起来,进行转义,仅将其看作字符串:

延申:技术的本质:ORM框架将对象的值 映射 对应到数据库类型: 如 String -> varchar。

ORM框架只是映射,Java操作Mysql只能通过JDBC操作(本质:是封装他)。

运用到的设计模式:构建者模式、工厂模式、动态代理模式

ps:学习源码:主干方法 => debug明白流程哪里出现问题,快速定位。 出现问题的方法最终会回溯到主干逻辑源码中。

缓存

如果没有用到二级缓存,依旧使用BaseExcutor里面的query方法(是否使用一级缓存)

在这里插入图片描述

不使用一级缓存,则query里面调用queryFromDatabase,再调用doQuery

在这里插入图片描述

doQuery构造一个RoutingStatementHandler ,

在这里插入图片描述

具体是在构造的时候就设置了PREPARED,选择PreparedStatementHandler。

在这里插入图片描述

PreparedStatementHandler到这里实际用的就已经是JDBC的方法了

在这里插入图片描述

ResultSetWrapper怎么封装的呢?

在这里插入图片描述

三个集合columnNames、jdbcTypes、classNames遍历获取值:

在这里插入图片描述

得到对应表字段的列名、值类型、java对应类型,后面的转换

在这里插入图片描述

继续往下走,找到handleResulSet即对结果集进行处理:

在这里插入图片描述

再往下挖DefaultResultSetHandler.handleRowValues(),这里再往下的handleRowValuesForNestedResultMap方法,已经相对于遍历row结果集了:

在这里插入图片描述

在这里插入图片描述

      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");
         }

getRowValue里面的applyAutomaticMappings

在这里插入图片描述

下面这里的this,getNullableResult方法具体实现类是:

在这里插入图片描述

StringTypeHandler,对应字段String类型

在这里插入图片描述

在这里插入图片描述

再回顾一下,这里对应上了rs.getString,换做其它类型如int同理:

  while(rs.next()){
     //Retrieve by column name
     int id  = rs.getInt("id");
     int age = rs.getInt("age");
     String first = rs.getString("first");
     String last = rs.getString("last");
     }

输出结果:(PS:mapper.xml的代码早就在SqlSessionFactory build的时候就加载到jvm里面了)执行就只是调用执行而已

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从咖啡馆到世界,共赴下一个十年 |写在 EMQX 开源十周年

十年前,在 2012 年 12 月 17 日,源于个人对 Erlang、MQTT 和开源的热爱,EMQX 诞生于一家咖啡馆并作为开源项目在 GitHub 上发布了初次提交。十年后的今天,EMQX 已成长为 Erlang 生态中最具影响力的物联网开源基础软件项目,作为全球最具扩展性的 MQTT 消息服务器在物联网、工业互…

【Java开发】Spring Cloud 02 :微服务项目介绍及开发环境

了解完 Spring Cloud 的发展背景以及各个组件库后,在敲代码前,本章节会聊一聊优惠券平台项目的整体功能和模块,以及每个功能点的技术选型和背后的依据,最后讲解下搭建项目所需的开发环境~ 目录 1 优惠券平台项目 1.1 项目介绍 …

[Linux安装软件详解系列]05 安装ElasticSearch和IK分词器

目录1、安装ElasticSearch2、安装IK分词器操作系统:Anolis OS 8.6 RHCK 64位、jdk1.8。ElasticSearch:v6.8.6下载文件: ElasticSearch v6.8.6: https://elastic.co/downloads/elasticsearch IK分词器 v6.8.6:https://g…

脚本-简单脚本

脚本执行顺序 默认脚本是无序执行,也就是哪个脚本先执行,哪个脚本后执行是未知的。 也可以手动指定执行顺序, 在如上图所示中,可以点击 加号 按钮,然后添加脚本的顺序,数值越大,执行顺序越靠后…

为什么团队执行力差,管理者应该如何解决?

没有执行力,一切都是空谈。团队执行力差可能是这些原因: 1、目标不明确,项目方向不清晰。 2、责任不清,不知道干啥,也不知道为什么而干。 3、技能不熟练,没有明确的完成标准。 4、分配任务,…

【JavaScript】飞机大战

文章目录一、效果演示设计思路二、鼠标版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码js.js文件plane.js文件三、键盘版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码四、代码资源分享一、效果演示 利用html,css,js制…

华为云服务器上部署war包(虚拟机也同样适用)

目录linux部署war包安装jdk关闭防火墙简单粗暴(推荐虚拟机使用)复杂但安全(推荐服务器使用)安装tomcat部署war包linux部署war包 安装jdk 执行命令查看可安装java版本 yum -y list java*执行命令安装jdk8 yum install -y java-…

12. 爬虫训练场项目,jinja2 模板继承,项目继续迭代

本篇博客我们将前端模板的通用部分进行抽离,便于整理管理,使用的是 jinja2 中模板继承相关技术。 文章目录Flask 模板引擎块(Block)更细的块拆解完善 general 目录和 school 目录 HTML 文件宏(Macro)Flask …

章节六:RASA NLU组件介绍--特征生成器

目录一、前言二、特征生成器MitieFeaturizerSpacyFeaturizerConveRTFeaturizerLanguageModelFeaturizerRegexFeaturizerCountVectorsFeaturizerLexicalSyntacticFeaturizer一、前言 RASA在处理对话时,整体流程是pipeline结构,自然语言理解(N…

SpringBoot操作Redis

目录 1.IDE创建一个maven项目 2、 添加redis启动器 3.修改配置文件application.properties 4.在测试类中测试 SpringBoot操作Hash(哈希) SpringBoot操作List集合类型 SpringBoot操作Set集合类型 SpringBoot操作ZSet集合类型 1.IDE创建一个maven项…

dubbo(尚硅谷)学习笔记2

我们现在来做dubbo和springboot整合: 我们先来创建一个springboot项目: 然后把serviceimpl层拷贝过来。 因为我们这个也需要用到公用接口和实体类,所以还是需要导入一下这个依赖: 同样的我们也需要创建一个服务的消费者&#xf…

设计模式之美总结(行为型篇)

title: 设计模式之美总结(行为型篇) date: 2022-12-26 17:25:29 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. 观察者/发布订阅模式(Observer Design Pattern/Publish-Subscribe Design Pattern…

Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例

目录 前言 什么是帧? 什么是Aseprite? 运行环境 正文 示例:绘制人物 制作多帧动画 微调 导出精灵表 总结 作品欣赏 附一个下载链接: 前言 什么是帧? 我们看到的动画都是由一张张图片连续播放而成的&#…

scipy

scipy.interpolate插值方法 import numpy as np def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2grid_x, grid_y np.mgrid[0:1:100j, 0:1:200j]rng np.random.default_rng() points rng.random((1000, 2)) values func(points[:,0], points[:…

高颜值蓝牙耳机有哪些?音质好颜值高的蓝牙耳机推荐

喜欢安静的人们,相信都会有一副蓝牙耳机吧,作为我们生活当中必不可少的数码产品,除了手机以外,蓝牙耳机几乎也是使用率很高的,它通过蓝牙连接,非常方便,下面是小编精心挑选的四款蓝牙耳机。 一…

告别“限速”,个人网盘进入云时代

配图来自Canva可画 在数字经济广泛渗透的条件下,个人网盘市场也得到了长足发展。而在5G和AI的加持下,个人网盘不断进行技术融合和迭代,云盘已然成为互联网用户以及智能设备存储的基本服务,而其应用场景也顺理成章地开始向各个细分…

window11 node.js 安装与下载

最近电脑莫名其妙的被一些恶意流氓软件捆绑了,今天我直接给恢复出厂设置了。顺便记录一下软件的安装步骤。 1. 先去官网下载 官网地址 ① 进入到官网后如下图所示 ②根据自己电脑选择合适的版本下载(我是wiindows 64位 ) ③ 双击安装包点击…

道路交通警示牌数据集以及训练好的YOLO模型权重文件

道路交通警示牌yolo模型1.交通标志数据集的介绍2.训练出权重文件1.交通标志数据集的介绍 交通标志(国外的交通标志)数据集是经过标注过的数据集,包括77个类别;标注类别如下: ‘200m’, ‘50-100m’, ‘Ahead-Left’, …

如何写好一份数据分析报告?

数据分析报表怎么做?这是一个很笼统的问题,所以这篇尝试从数据分析报表的3个方面来说下,准备了3天,内容较长,心急的小伙伴先看索引: 数据分析报表的原则数据分析报表的数据来源数据分析报表的可视化展示 0…

【按钮的两种状态 Objective-C语言】

一、继续上一篇文章的按钮案例 1.先说思路: 1)先把最上面的图片按钮实现了 我们拽1个按钮,给它一个背景图,加一个文字“点我啊” 当你鼠标按下去的时候,换成另1个背景图 当你鼠标按下去的时候,按钮的背景图变了,并且上面的文字也变了,变成“摸我干啥” 当你鼠标抬起…