Mybatis源码(一)获取数据源

news2025/1/16 16:00:31

前言

Mybatis做为一种半ORM框架(半:需要手动写sql)。ORM(Object Relational Mapping)的技术本质是:ORM框架将对象的值 映射到 对应数据库类型: 如 String -> varchar。

且mybatis分为两种实现方式:基于xml和基于注解,本文为xml。

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是如何操作数据库

解析xml文件树状图:

在这里插入图片描述

获取数据库源

获取配置文件参数

首先通过Resources.getResourceAsStream , 获取mybaris-config.xml配置信息; 通过这些参数构建SqlSessionFactory:

官网具体配置信息介绍:https://mybatis.net.cn/configuration.html

在这里插入图片描述

mybatis-sourcecode.properties

其中在:<properties resource="mybatis-sourcecode.properties"></properties>配置文本流的参数,使用如下:${cbry.datasource.password}:

#mybatis 源码的数据库信息配置
cbry.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
cbry.datasource.url=jdbc:mysql://localhost:3306/cbry?useUnicode=ture&characterEncoding=UTF-8&serverTimezone=GMT%2B8&characterEncoding=utf-8
cbry.datasource.username=root
cbry.datasource.password=123456

mybaris-config.xml

ps:二级缓存的配置生效与否在此设置。

<?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>

    <properties resource="mybatis-sourcecode.properties"></properties>
    <settings>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />

        <!-- 控制全局缓存(二级缓存)-->
        <setting name="cacheEnabled" value="true"/>

        <!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
        <!--
         MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。
        -->
        <setting name="localCacheScope" value="SESSION"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/><!-- 单独使用时配置成MANAGED没有事务 -->
            <dataSource type="POOLED">
                <property name="driver" value="${cbry.datasource.driver-class-name}"/>
                <property name="url" value="${cbry.datasource.url}"/>
                <property name="username" value="${cbry.datasource.username}"/>
                <property name="password" value="${cbry.datasource.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/orderDao.xml"/>
    </mappers>

</configuration>

构建SqlSessionFactory

对应代码

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

SqlSessionFactory -> build -> XMLConfigBuilder -> parse方法

获取mybatis-config配置文件

在这里插入图片描述

parse方法:

在这里插入图片描述

在这里插入图片描述

evaNode传入string , 返回XNode对象:是mybatis-config.xml全局配置里面的内容(这个要实操获取值)

在这里插入图片描述

在这里插入图片描述

xml文件格式附讲

mybatis-config.xml文件配置里面的参数存在头部的dtd文件

具体值可以参考mybatis官网的mybatis-config.xml的参数

在这里插入图片描述

即标签的格式、属性类型等,左键点击即可进去。

在这里插入图片描述

截取对应信息(以数据库信息为例)

讲mybatis-config.xml全局配置文件的子内容截取,封装到对应对象,再将其注入SqlSessionFactory。将数据库源信息获取注入到环境: jdbc.prrperties等。继续下走:比如属性:environment对象

在这里插入图片描述

属性赋值set入参:XNode context , 依旧是config的完整文本。

到了 实际方法里面xxxElement截取对应部分的文本,比如environmentsElement里面就是datasource的子部分

在这里插入图片描述

将对应的赋予在对应的datasourceFactory里面

在这里插入图片描述

实例化对应子信息对象

每一个配置信息都对应了一个实例化类,那么如何对应不同类型的实例化类呢?比如说<dataSource type="POOLED">

可以看到resolveClass里面维护了一个hashMap,其value是类名。然后实例话这个对象,

在这里插入图片描述

在这里插入图片描述

就此我们找到了数据源。最终ds -> environment.set -> configuration.set。来存储

在这里插入图片描述

后续

此处已经获取datasource的信息,后面下文获取mapper的执行sql,是与此出处的environmentElement同级执行代码的mappersElement方法,如下。

小结

​ 总体来说,还是先通过文本流获取文本配置,类似的有java获取普通参数文件和含有section的参数文件中的参数。然后通过解析xml树状结构,通过不同的子内容,实例化不同类型的实例化类对象封装对应的xml子内容,而后存放在SqlSessionFactory里面的configuration,比如说environment,mappers等。到时候创建sqlsession或者执行sql的时候取用。

​ 但是从源码的浏览,我们发现了如mappers的四种构造的优先级的原因。

Mybatis是如何获取数据库源,类结构(截图于视频):

在这里插入图片描述

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

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

相关文章

数字孪生核电站促进界面监测的应用实践

未来核电站将向着数字化、智能化发展,“少人值守、智能监测”会广泛应用于核电站运行管理。利用数字孪生技术,可以对实体核电站和孪生核电站的数据进行交换分析,促进核电站的运行管理和监测,更好地确保反应堆运行安全。 数字孪生核电站促进界面监测的应用实践 北京智汇云舟科技…

h5中使用微信分享

1.需要 绑定域名&#xff1a; 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”&#xff08;即访问前端项目对应的域名)。 2.在项目中引入sdk: 在需要调用 JS 接口的页面引入如下 JS 文件&#xff0c;&#xff08;支持https&#xff09;&#xff…

搭vue项目(初级版)

这个项目只有 会员管理和直播管理两个模块。创建两个模块是为了验证一下路由跳转。 下载项目&#xff1a; 可以到我的资源中下载压缩包 或者 git clone 前端项目搭建: 前端搭建的项目&#xff0c;仅供学习使用 1.安装vue-cli,全局只需要安装一次&#xff0c;如果安装过一次&am…

MyBatisPlus ---- 入门案例

MyBatisPlus ---- 入门案例1. 开发环境2. 创建数据库及表a>创建表b>添加数据3. 创建SpringBoot工程a>初始化工程b>引入依赖c>idea中安装lombok插件4. 编写代码a>配置application.ymlb>启动类c>添加实体d>添加mappere>测试f>添加日志1. 开发环…

了解 Oracle 中单引号与双引号的用法,一篇文章教会你!

无论测试或者开发&#xff0c;对数据库的增删改查都是家常便饭。但有些小知识是经常被忽略&#xff0c;却又不能不去了解的&#xff0c;例如单引号和双引号的用法和区别&#xff0c;看完这一篇&#xff0c;你肯定会有收获。 首先我们要区别一个概念&#xff0c;即单引号(‘)和双…

docker应用部署示例

Docker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --na…

如何通过文档管理控制合同管理

如何通过文档管理控制合同管理 如果您的公司处理的合同比以往任何时候都多&#xff0c;那么您并不孤单。这种指数级增长的原因包括日益增长的监管要求、供应链问题以及全球化带来的业务关系的复杂性。此外&#xff0c;员工更频繁地换工作&#xff0c;因此&#xff0c;需要管理更…

Unity实用小工具—以对象形式操作Sqlite

一、介绍 1.1、版本说明&#xff1a;使用的Unity版本为个人版2020.3.39&#xff0c;数据库为Sqlite&#xff08;一个轻量级跨平台数据库&#xff09;&#xff0c;Sqlite的查看管理工具可以在网上下载https://dbeaver.io/download/&#xff0c;可以直接保存下来使用。 1.2、数…

微服务(四)——统一网关

目录1. 概念2. 实现网关1. 实现流程2. 小结3. 断言工厂4. 过滤器工厂1. GatewayFilter2. GlobalFilter3. 过滤器的执行顺序5. 解决跨域问题1. 概念 网关的作用&#xff1a; 认证、鉴权服务路由、负载均衡请求限流 网关的实现&#xff1a; gateway 基于Spring5中提供的WebFlu…

linux 设置登录提示语

勿以恶小而为之&#xff0c;勿以善小而不为---- 刘备 /etc/motd 文件里面 保存的是 登录后提示语 vim /etc/motd可以放置自定义的 文字信息 -------------------- 每天都要加油努力噢&#xff0c;岳泽霖!!! -------------------登录之后&#xff0c;就会展示信息: 参考链接: …

【Linux】Linux命令行git的使用

前进才是唯一的方向 文章目录一、git是什么&#xff1f;二、gitee仓库创建1.新建仓库2.复制仓库链接3.克隆远端仓库到本地来三、git提交代码1.下载git2. 配置用户名和邮箱&#xff08;否则git commit无法正常使用&#xff09;3. git提交代码三板斧3.1 git add&#xff08;将代…

git merge合并开发分支到上线分支遇到的问题,提示 no new changes

git merge 后 push 到 Gerrit 失败&#xff0c;提示 no new changes 解决思路&#xff1a; 分析&#xff1a;no new changes 的意思&#xff0c;是说&#xff0c;这个合并&#xff0c;是个线性的合并。而合并的那些历史的 commit 节点&#xff0c;在 gerrit 上都已经评审过了&…

在Linux中安装ShowDoc

在Linux中&#xff0c;有两种方式安装ShowDoc。第一种是自动脚本安装&#xff0c;第二种是手动安装。官方推荐使用自动脚本安装ShowDoc。如果自动脚本安装ShowDoc失败&#xff0c;可以考虑手动安装ShowDoc。 自动脚本安装ShowDoc 自动脚本利用docker来安装运行环境&#xff0…

酒鬼私定,只是酒鬼酒一次破圈营销?

围坐红泥小火炉&#xff0c;煮酒谈今夕。 过去一年多时间&#xff0c;经历了业绩向上&#xff0c;股市向下的反差时期后&#xff0c;越来越多人意识到白酒行业已步入存量时代。 2022年前三季度&#xff0c;中国规模以上白酒行业实现总产量487.9万千升&#xff0c;同比减少2.5…

proxychains for Windows

proxychains for Windows背景介绍项目地址使用scoop安装proxychains for windows验证命令行能否调用proxychains配置代理使用为Windows终端配置proxy--适用于cmd为Windows终端配置proxy--适用于PowerShellpowershell配置变量背景介绍 有时候Windows下的一些命令行程序想要挂代…

正大国际期货:外盘德指期货交易应该怎么做?

作为一个期货交易者&#xff0c;想要在市场上生存下来&#xff0c;就必须针对各种可能性都有所准备。比如&#xff0c;如果你强烈看涨&#xff0c;就必须准备好应对市场打你个冷不防的可能。相反&#xff0c;如果你对眼前的涨势高度怀疑&#xff0c;也不能彻底排除上演一场黑天…

ElasticSearch安装和部署和整合springboot

因为项目每次用到&#xff0c;每次重新搭都踩坑&#xff0c;特此记录一些坑&#xff0c;防止花费大量时间在搭建和整合上面安装 准备好压缩包elasticsearch-6.2.4解压 在config文件夹下配置文件elasticsearch.yml&#xff0c;可更改自行喜欢的端口和配置账号密码安装中文分词器…

git笔记

coderwhy听课笔记 什么是集中式 分布式 集中式是将整个仓库放到服务器&#xff1b;分布式是每台电脑上都有对应的仓库&#xff0c;可以在本地提交&#xff0c;之后把本地的仓库同步到服务器的仓库里 git安装 除了能使用git命令&#xff0c;还安装了git bash,git GUI git ba…

mysql数据库有关教程

我们打开Navicat 我使用的是16版本的,我们选择连接,我们新建连接 这里会有菜单栏目,比如说常规,高级,数据,SSL,SSH HTTP 其他的我们先不看,后期有机会我会解释的,先看常规 连接名字,就是你可以自己命名一个名字,也可以不写,比如说连接名字 studentdemo1 主机默认是localhos…

NetInside网络攻击分析帮您轻松发现可疑主机

分析概要 分析概要从以下三点做介绍。 分析内容 NetInside网络流量分析设备采集的流量。 分析时间 报告分析时间范围为&#xff1a;2020-09-28 07:58:00-11:58:00&#xff0c;时长共计3小时。 分析目的 本报告主要分析目的&#xff1a;查找和定位存在可疑现象的主机、查…