mybatis源码阅读系列(二)
前言
上一篇文章mybatis源码阅读系列(一)介绍了mybatis和原生jdbc的区别,并通过代码展示了两者的运行过程和结果,下面让我们继续详细了解下mybatis的执行过程;
package com.wyl.mybatis.service;import com.wyl.mybatis.entity.FullCity;
import com.wyl.mybatis.mapper.FullCityMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** @Description* @Author WuYiLong* @Date 2024/2/26 16:04*/
public class MybatisService {public static void main(String[] args) throws IOException {// 读取mybatis的配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 通过SqlSessionFactoryBuilder 的 build 方法用于解析配置文件并创建 SqlSessionFactory 对象。SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// SqlSessionFactory 通过解析配置文件(通常是 mybatis-config.xml)和映射文件(mapper.xml),来创建一个能够执行映射语句的会话对象SqlSessiontry(SqlSession sqlSession = sqlSessionFactory.openSession()) {// 使用SqlSession获取映射器实例FullCityMapper mapper = sqlSession.getMapper(FullCityMapper.class);// 使用映射器执行操作FullCity fullCity = mapper.selectByName("广东省");System.out.println("城市的名称:"+fullCity.getName());}}
}
改造了一下获取SqlSession的方式,使用try-with-resources的语法自动管理资源,为什么可以使用这个方法呢?因为SqlSession继承了Closeable这个接口,换而言之,凡是继承或实现这个接口的方法都可以用这种方式。
读取配置文件(mybatis-config.xml)
Resources.getResourceAsStream(resource) 方法是 MyBatis 提供的一个工具方法,用于从类路径下加载资源文件。



SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 是 MyBatis 框架中的一个关键组件,它用于创建 SqlSessionFactory 实例。SqlSessionFactoryBuilder 在创建 SqlSessionFactory 之后通常就没有其他用途了,因此它可以在创建 SqlSessionFactory 之后被丢弃。

我们可以看到,SqlSessionFactoryBuilder利用了方法重载创建了SqlSessionFactory,同时使用了建造者模式
SqlSessionFactory

SqlSessionFactory 是 MyBatis 框架的核心接口之一,它负责创建 SqlSession 实例
从上面可以看出SqlSessionFactory是通过实现类DefaultSqlSessionFactory构造方法传入配置信息创建实例的
SqlSession
SqlSession 是 MyBatis 框架中用于与数据库交互的接口。它是 MyBatis 应用程序中执行 SQL 语句、获取映射器(mappers)和进行事务控制的主要接口。SqlSession 实例是通过 SqlSessionFactory 创建的,并且在使用完毕后需要关闭以释放资源。

从上面可以看出,SqlSession 是通过SqlSessionFactory,利用工厂方法创建的,其中有两种方式:

openSessionFromConnection :它允许你使用一个已有的数据库连接来创建 SqlSession。
openSessionFromDataSource :它允许你使用一个已有的数据源(DataSource)来创建 SqlSession。这种方法在需要控制数据源的使用,而不是直接管理数据库连接的场景中非常有用。数据源通常由连接池实现,它负责数据库连接的创建、管理和回收。

相关文章:
mybatis源码阅读系列(二)
前言 上一篇文章mybatis源码阅读系列(一)介绍了mybatis和原生jdbc的区别,并通过代码展示了两者的运行过程和结果,下面让我们继续详细了解下mybatis的执行过程; package com.wyl.mybatis.service;import com.wyl.mybat…...
【Web开发】CSS教学(超详细,满满的干货)
💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Web开发】CSS教学(超详细,满满的干货) 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 CSS一. 什么是CSS?1.1 基本语法规范1.2 引入方式1.3 规范 二. CSS选…...
系列学习前端之第 5 章:学习 ES6 ~ ES11
1、什么是 ECMAScript ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。 从第 6 版开始,发生了里程碑的改动,并保持着每年迭代一个版本的习惯。 ES62015年,ES72016年,ES82017年,ES92018年&#…...
Linux学习(4)——使用编辑器
1.gedit编辑器 简单易懂,依赖图形界面。可以使用ctrlc ctrlv等快捷键,ctrls进行保存,与windows系统中相类似。 2.vi/vim编辑器 vi/vim可以直接通过控制台的终端完成文本的编辑,不依赖图形界面,使用范围更广。它的编辑…...
简单函数_短信计费
任务描述 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送…...
centos命令history设置记录10000行
今天在操作服务器的时候,用history查看操作记录的时候,发现只能查看10条,这样不行啊,我想查看所有人对服务器操作的命令。 [rootbogon ~]# history解决办法: #1、找到/etc/profile文件中的histsize 把10改成10000 […...
SpringBoot打造企业级进销存储系统 第七讲
Transientprivate String roles; // 所拥有的角色package com.java1234.entity;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.p…...
1.实用Qt:解决绘制圆角边框时,圆角锯齿问题
目录 问题描述 解决方案 方案1: 方案2: 结果示意图 问题描述 做UI的时候,我们很多时候需要给绘制一个圆角边框,初识Qt绘制的童鞋,可能绘制出来的圆角边框很是锯齿,而且粗细不均匀,如下图&…...
JavaWeb08-Filter和Listener
目录 一、Filter 1.概述 2.作用 3.快速入门 4.执行流程 5.拦截路径配置 6.拦截器链(多个过滤器) 7.登录验证 二、Listener(了解即可) 1.概述 2.主要作用 3.分类 4.快速入门 一、Filter 1.概述 Filter 表示过滤器&am…...
关于ClickHouse的一些小技巧
关于ClickHouse的一些小技巧 设置变量 set param_nameAlex; select {name:String};projection的使用 基于projection(投影)的优化需要打开开关optimize_use_projections。ClickHouse里的projection是物化的,也就是说数据会复制存一份。 Pr…...
有来团队后台项目-解析7
sass 安装 因为在使用vite 创建项目的时候,已经安装了sass,所以不需要安装。 如果要安装,那么就执行 npm i -D sass 创建文件 src 目录下创建文件 目录结构如图所示: reset.scss *, ::before, ::after {box-sizing: border-…...
用户数据的FLASH存储与应用(FPGA架构)
该系列为神经网络硬件加速器应用中涉及的模块接口部分,随手记录,以免时间久了遗忘。 一 背景 我们知道,在FPGA做神经网络应用加速时,涉及到权重参数的存储和加载。通常在推理过程中,会将权重参数存储在外部DDR或片上S…...
Chrome的V8引擎 和操作系统交互介绍
Chrome的V8引擎是一个用C编写的开源JavaScript和WebAssembly引擎,它被用于Chrome浏览器中,以解释和执行JavaScript代码。V8引擎将JavaScript代码转换为机器代码,这使得JavaScript能够以接近本地代码的速度运行。 V8引擎与操作系统的交互主要体…...
Redis:持久化、线程模型、大 key
Redis持久化方式有什么方式? Redis 的读写操作都是在内存中,所以 Redis 性能才会高,但是当 Redis 重启后,内存中的数据就会丢失,那为了保证内存中的数据不会丢失,Redis 实现了数据持久化的机制,…...
Linux 16个常用脚本(初级)练习
(1)编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户 #!/bin/bash # 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户 # 不输入账户名,则提示必须输入账户名并退出脚本;如果用…...
接口测试及接口测试工具【Postman】相关的面试题
Postman是一种接口调试与http接口测试的工具,可以非常方便的模拟get、post或其他请求来调试和测试接口 文章目录 Postman优点Postman使用流程Postman参数化有哪几种方式Postman如何设置关联接口测试能发现什么问题如何分析bug是前端还是后端当一个接口出现异常时&am…...
android 怎么自定义view
首先了解view的绘制流程: 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout,确定子view 而onDraw----是继承view时候需要操作的。 所以:自定义ViewGroup一般是利用现有的组件根据特定的布局…...
JavaScript的事件
JavaScript的事件 先写一个test测试函数以查看事件是否触发 function test(){var ddocument.getElementById("tid");console.log("测试成功"d) //控制台输出 }onclick 鼠标单击事件: <input type"button" id"tid" va…...
android 简单快速 自定义dialog(简单好用,不需要设置样式)
1.MyDialog代码: public class MyDialog{private Activity activity;private ViewGroup contentView;private View view;public MyDialog(Activity activity) {this.activityactivity;contentView activity.findViewById(android.R.id.content);viewLayoutInflate…...
JAVA代理模式梳理
什么是代理模式 代理模式:为其他对象提供一种代理,用以控制对这个对象的访问; 我们使用代理对象,可以在不修改目标对象的基础上,增强主业务逻辑;比如说我们的系统中有一个登录接口,我们要对这个…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
