18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建

学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS

文章目录

  • 1. 架构设计
  • 2. 核心组件及调用关系
  • 3. 源码环境搭建
    • 3.1 测试类
    • 3.2 实体类
    • 3.3 核心配置文件
    • 3.4 映射配置文件
    • 3.5 遇到的问题

1. 架构设计

在这里插入图片描述

Mybatis整体架构分为4层:

  1. 接口层:提供增删改查的接口,通过调用这些接口可以完成与数据库的交互。调用的方式有两种:基于statementId和基于mapper接口。
  2. 数据处理:是Mybatis框架的核心层,负责解析SQL,根据调用请求完成一次数据库交互。
  3. 框架支撑层:负责通用基础服务支撑。SQL语句配置方式:基于xml配置和基于注解配置。对于一些简单的SQL,使用注解的方式比较方便。但对于一些复杂的SQL,比如SQL的动态拼接等,使用注解的方式是非常繁琐的,所以推荐使用xml配置更加方便和维护。
  4. 引导层:mybatis启动需要的配置信息。包括:基于xml配置方式和基于Java API方式。

2. 核心组件及调用关系

在这里插入图片描述
从上往下各组件介绍:

  1. SqlSession:Mybatis对外暴力的核心API,一些增删改查接口,如selectOne、selectList、insert、delete、update。
  2. Excutor: 负责数据库操作及两级缓存的维护。SqlSession并不直接调用JDBC,而是委派给Excutor去执行的。
  3. StatementHandler:语句执行器。负责封装JDBC操作:参数设置,结果集合封装。
  4. ParameterHandler:参数处理器。实际上把参数处理的过程,委托给TypeHandler
  5. TypeHandler:类型转换类似,将参数从Java类型转换为jdbc类型,将结果集从jdbc类型转换为java类型。
  6. ResultSet:结果集
  7. ResultHandler:结果集处理器。实际上把参数处理的过程,委托给TypeHandler。

3. 源码环境搭建

这个就比较简单了。到mybatis官网https://mybatis.p2hp.com/,找到仓库地址https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.7,下载源码。我这里用的版本和视频中的一样3.5.7。
打开项目新建核心配置文件、映射配置文件、实体类、测试类。目录如下:
在这里插入图片描述

3.1 测试类

public class MybatisTest {@Testpublic void test1() throws IOException {System.setProperty("javax.xml.accessExternalDTD", "all");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream,"development");SqlSession sqlSession = build.openSession();User user = new User();user.setId(1);user.setUsername("xiaoming");Object o = sqlSession.selectOne("com.mqlyes.dao.UserDao.findByCondition", user);System.out.println(o);}
}

3.2 实体类

public class User {private Integer id;private String username;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +'}';}
}

3.3 核心配置文件

注意替换数据库地址和密码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 数据源配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://192.168.x.x:3306/test?useSSL=false&amp;serverTimezone=UTC"/><property name="username" value="xxxx"/><property name="password" value="xxxx"/></dataSource></environment></environments><!-- Mapper 配置 --><mappers><mapper resources="mapper/UserMapper.xml"/></mappers>
</configuration>

3.4 映射配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mqlyes.dao.UserDao"><!--    唯一标识: namespace.id--><!-- 查询所有用户 --><select id="findAll" resultType="com.mqlyes.pojo.User">select * from user</select><!-- 按条件查询用户 --><!--    --><select id="findByCondition" resultType="com.mqlyes.pojo.User" parameterType="com.mqlyes.pojo.User">select * from user where id = #{id} and username = #{username}</select>
</mapper>

3.5 遇到的问题

错误1:如果下面的报错,就在测试类中添加代码

 System.setProperty("javax.xml.accessExternalDTD", "all"); 

在这里插入图片描述
这个错误我在网上试了一个方案,不生效。用代码指定的方式可以。
错误2. 如果报配置文件找不到,就检查build后自己的target目录下,是否包含配置文件。可以试试把pom文件中resource和testResource相关的注释掉,用默认的方式。我这里注释掉就可以了。这个错误是由于没把配置文件编译进target导致的。
在这里插入图片描述
等到后边我把自己的源码传上去~

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

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

相关文章

未启用CUDA支持的PyTorch环境** 中使用GPU加速解决方案

1. 错误原因分析 根本问题&#xff1a;当前安装的PyTorch是CPU版本&#xff0c;无法调用GPU硬件加速。当运行以下代码时会报错&#xff1a;model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解决方案步骤 步骤1&#xff1a;验证CUDA可用性 在Pyth…

JVM-基于Hotspot

前言 Java虚拟机&#xff08;Java Virtual Machine简称JVM&#xff09;是运行所有Java程序的抽象计算机&#xff0c;是Java语言的运行环境&#xff0c;其主要任务为将字节码装载到内部&#xff0c;解释/编译为对应平台上的机器指令执行。 Java虚拟机规范定义了一个抽象的——…

智能合约安全审计平台——可视化智能合约漏洞扫描

目录 可视化智能合约漏洞扫描 —— 理论、实践与安全保障1. 引言2. 理论背景与漏洞原理2.1 智能合约简介2.2 常见漏洞类型2.3 漏洞扫描与安全评估原理3. 系统架构与工作流程3.1 系统总体架构3.2 模块说明4. 漏洞扫描流程详解4.1 代码上传与静态解析4.2 漏洞模式检测4.3 风险评估…

【MySQL数据库】数据类型详解

目录 数据类型tinyint类型(整形)bit类型小数浮点数 float、doubledecimal 字符串类型charvarcharchar与varchar的比较 日期时间类型enum和set总结 数据类型 tinyint类型(整形) 例&#xff1a; mysql> create table tt1(num tinyint);mysql> insert into tt1 values(1)…

咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包

咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包&#xff08;内有教程&#xff09; 刷机教程简单说明&#xff1a; 1、把下载好的刷机包&#xff0c;U盘里建立一个upgrade文件夹&#xff0c;固件放入此文件夹里&#xff0c;放入U盘中&#xff0c;注意升级包为压缩包不要对…

CS61A:STRING REPRESENTATION

Python 规定所有对象都应该产生两种不同的字符串表示形式&#xff1a;一种是人类可解释的文本&#xff0c;另一种是 Python 可解释的表达式。字符串的构造函数 str 返回一个人类可读的字符串。在可能的情况下&#xff0c;repr 函数会返回一个计算结果相等的 Python 表达式。rep…

LangChain缓存嵌入技术完全指南:CacheBackedEmbedding原理与实践(附代码示例)

一、嵌入缓存技术背景与应用场景 1.1 为什么需要嵌入缓存&#xff1f; 算力消耗问题&#xff1a;现代嵌入模型&#xff08;如text-embedding-3-small&#xff09;单次推理需要约0.5-1秒/文本 资源浪费现状&#xff1a;实际业务中约30%-60%的文本存在重复计算 成本压力&#…

精益数据分析(3/126):用数据驱动企业发展的深度解析

精益数据分析&#xff08;3/126&#xff09;&#xff1a;用数据驱动企业发展的深度解析 大家好&#xff01;一直以来&#xff0c;我都坚信在当今竞争激烈的商业环境中&#xff0c;数据是企业获得竞争优势的关键。最近深入研究《精益数据分析》这本书&#xff0c;收获颇丰&…

wpf ScaleTransform

在WPF中&#xff0c;ScaleTransform是用于实现元素缩放的核心类&#xff0c;属于System.Windows.Media命名空间下的变换类型。以下是其主要特性与使用方式的总结&#xff1a; ‌核心属性‌ ‌缩放比例‌ ScaleX&#xff1a;水平方向缩放比例&#xff08;默认1.0&#xff0c;即…

用纯Qt实现GB28181协议/实时视频/云台控制/预置位/录像回放和下载/事件订阅/语音对讲

一、前言 在技术的长河中探索&#xff0c;有些目标一旦确立&#xff0c;便如同璀璨星辰&#xff0c;指引着我们不断前行。早在2014年&#xff0c;我心中就种下了用纯Qt实现GB28181协议的种子&#xff0c;如今回首&#xff0c;一晃十年已逝&#xff0c;好在整体框架和逻辑终于打…

0x01、Redis 主从复制的实现原理是什么?

Redis 主从复制概述 Redis 的主从复制是一种机制&#xff0c;允许一个主节点&#xff08;主实例&#xff09;将数据复制到一个或多个从节点&#xff08;从实例&#xff09;。通过这一机制&#xff0c;从节点可以获取主节点的数据并与之保持同步。 复制流程 开始同步&#xf…

整活 kotlin + springboot3 + sqlite 配置一个 SQLiteCache

要实现一个 SQLiteCache 也是很简单的只需要创建一个 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 则不启用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…

深入探索如何压缩 WebAssembly

一、初始体积&#xff1a;默认 Release 构建 我们从最基础的构建开始&#xff0c;不开启调试符号&#xff0c;仅使用默认的 release 模式&#xff1a; $ wc -c pkg/wasm_game_of_life_bg.wasm 29410 pkg/wasm_game_of_life_bg.wasm这是我们优化的起点 —— 29,410 字节。 二…

多角度分析Vue3 nextTick() 函数

nextTick() 是 Vue 3 中的一个核心函数&#xff0c;它的作用是延迟执行某些操作&#xff0c;直到下一次 DOM 更新循环结束之后再执行。这个函数常用于在 Vue 更新 DOM 后立即获取更新后的 DOM 状态&#xff0c;或者在组件渲染完成后执行某些操作。 官方的解释是&#xff0c;当…

前端面试-自动化部署

基础概念 什么是CI/CD&#xff1f;在前端项目中如何应用&#xff1f;自动化部署相比手动部署有哪些优势&#xff1f;常见的自动化部署工具有哪些&#xff1f;举例说明它们的区别&#xff08;如Jenkins vs GitHub Actions&#xff09;。如何通过Git Hook实现自动化部署&#xf…

架构生命周期(高软57)

系列文章目录 架构生命周期 文章目录 系列文章目录前言一、软件架构是什么&#xff1f;二、软件架构的内容三、软件设计阶段四、构件总结 前言 本节讲明架构设计的架构生命周期概念。 一、软件架构是什么&#xff1f; 二、软件架构的内容 三、软件设计阶段 四、构件 总结 就…

GPTNet如何革新创意与效率

引言 人工智能正在以前所未有的速度改变我们的工作与生活方式&#xff0c;从智能写作到视觉创作&#xff0c;AI工具已成为不可或缺的伙伴。在众多平台中&#xff0c;GPTNet以其强大的功能整合和直观体验崭露头角。它不仅汇集了GPT系列、Claude、Grok、Gemini等顶级对话模型&am…

【计网】SSL/TLS核心原理

序言 在HTTP协议中&#xff0c;信息是明文传输的&#xff0c;因此为了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议。HTTPS也是一种超文本传送协议&#xff0c;在HTTP的基础上加入了SSL/TLS协议&#xff0c;SSL/TLS依靠证书来验证服务端的…

Web Components 开发与集成

以下是关于 Web Components 开发与集成 的系统知识梳理,涵盖核心概念、高级特性、集成与优化等内容: 一、Web Components 核心概念 技术作用核心 APICustom Elements定义可复用的自定义 HTML 元素customElements.define()、生命周期钩子(connectedCallback 等)Shadow DOM封…

day26 学习笔记

文章目录 前言一、图像颜色转换1.HSV颜色空间2.颜色转换 二、灰度化1.最大值法2.平均值法3.加权均值法 三、二值化1.全局阈值法1.阈值法(THRESH_BINARY)2.反阈值法(THRESH_BINARY_INV)3.截断阈值法(THRESH_TRUNC)4.低阈值零处理(THRESH_TOZERO)5.超阈值零处理(THRESH_TOZERO_IN…