MyBatis 详解
1. 什么是 MyBatis?
MyBatis 是一款优秀的 持久层框架,它通过 XML 或注解配置,将 Java 对象(POJO)与数据库操作(SQL)进行灵活映射,简化了 JDBC 的复杂操作。
-
核心思想:SQL 与代码分离,开发者可专注 SQL 优化,同时享受 ORM(对象关系映射)的便捷。
-
定位:介于 JDBC 和全自动 ORM(如 Hibernate)之间的半自动化框架,灵活控制 SQL,适合复杂查询和高性能场景。
2. 核心特性
特性 | 说明 |
---|---|
动态 SQL | 支持条件分支(<if> 、<choose> )、循环(<foreach> )等动态生成 SQL。 |
参数映射 | 自动将 Java 对象属性映射到 SQL 参数(#{property} )。 |
结果集映射 | 将查询结果自动封装为 Java 对象(<resultMap> )。 |
缓存机制 | 提供一级缓存(SqlSession 级别)和二级缓存(Mapper 级别)。 |
插件扩展 | 支持自定义插件(如分页、日志),通过拦截器修改 MyBatis 核心行为。 |
3. 核心组件
1.SqlSessionFactory
-
作用:创建 SqlSession 的工厂类,全局唯一,通常由
SqlSessionFactoryBuilder
解析配置文件生成。 -
配置来源:XML 文件(如
mybatis-config.xml
)或 Java 代码。
2.SqlSession
-
作用:执行 SQL 操作、获取 Mapper 接口实例。非线程安全,需确保每次请求单独创建。
-
关键方法:
<T> T getMapper(Class<T> type); // 获取 Mapper 接口实例 int insert(String statement, Object parameter); // 直接执行 SQL
3.Mapper 接口与 XML 映射文件
-
Mapper 接口:定义数据库操作方法,方法名与 XML 中的 SQL ID 对应。
-
XML 映射文件:编写 SQL 语句,配置参数/结果映射。
4.Executor
-
作用:SQL 执行器,处理缓存、事务、语句调度等核心逻辑。
-
类型:
SimpleExecutor
(默认)、ReuseExecutor
(重用预处理语句)、BatchExecutor
(批处理)。
4. 工作原理
-
配置加载:
-
解析
mybatis-config.xml
,初始化数据源、事务管理器、Mapper 扫描路径等。 -
加载 Mapper XML 文件或扫描 Mapper 接口,构建 SQL 映射关系。
-
-
SqlSession 创建:
-
通过
SqlSessionFactory.openSession()
创建 SqlSession,内部包含Executor
和事务控制。
-
-
SQL 执行流程:
-
Mapper 代理:通过动态代理(如
MapperProxy
)将接口方法调用转发给 SqlSession。 -
SQL 解析:根据方法名找到对应的 SQL 语句,处理动态标签(如
<if>
)。 -
参数处理:将 Java 对象转换为 SQL 参数(
ParameterHandler
)。 -
SQL 执行:通过
Executor
执行 JDBC 操作,返回结果。 -
结果映射:将 ResultSet 转换为 Java 对象(
ResultSetHandler
)。
-
5. 缓存机制
缓存级别 | 作用范围 | 生命周期 | 开启方式 |
---|---|---|---|
一级缓存 | SqlSession 级别 | 随 SqlSession 关闭或清空 | 默认开启 |
二级缓存 | Mapper 级别 | 应用生命周期,可跨 SqlSession 共享 | XML 中配置 <cache/> 标签开启 |
6. 常见问题
-
MyBatis 与 Hibernate 的区别?
-
MyBatis:半自动化,需手动写 SQL,灵活控制细节。
-
Hibernate:全自动化,通过 HQL 操作对象,适合快速开发。
-
-
#{} 和 ${} 的区别?
-
#{}:预编译参数(防 SQL 注入),如
WHERE id = ?
。 -
**∗∗:字符串替换(慎用),如动态表名‘ORDERBY∗∗:字符串替换(慎用),如动态表名‘ORDERBY{column}`。
-
-
如何实现分页?
-
物理分页:使用插件(如 PageHelper)或数据库方言(
LIMIT
)。 -
内存分页:查询全部数据后在代码中分页(不推荐)。
-
7. 总结
-
优势:灵活控制 SQL、动态 SQL 强大、性能优化空间大。
-
适用场景:复杂查询、需深度优化 SQL、对数据库访问有精细控制需求的项目。
-
学习路径:掌握 XML/注解配置 → 理解动态 SQL → 熟悉缓存机制 → 整合 Spring/Spring Boot。
相关文章:
MyBatis 详解
1. 什么是 MyBatis? MyBatis 是一款优秀的 持久层框架,它通过 XML 或注解配置,将 Java 对象(POJO)与数据库操作(SQL)进行灵活映射,简化了 JDBC 的复杂操作。 核心思想:S…...
郑州工程技术学院党委书记甘勇一行莅临埃文科技调研交流
为深化产教融合、推动人工智能领域人才培养与产业需求精准对接,2025年4月9日下午,郑州工程技术学院党委书记甘勇、河南省人工智能产业创新发展联盟执行秘书长孟松涛等一行莅临埃文科技调研交流。 一、聚焦技术前沿 共话AI产业变革 座谈会上,…...
AI应用开发之扣子第一课-夸夸机器人
首先,进入官网:点击跳转至扣子。 1.创建智能体 登录进网站后,点击左上角+图标,创建智能体,输入智能体名称、功能介绍 2.输入智能体提示词 在“人设与回复逻辑”输入以下内容: # 角色 你是一…...
Node.js 数据库 CRUD 项目示例
希望使用Nodejs操作数据库做CRUD,用deepseek实战搜索“使用Nodejs对数据库表做CRUD的项目例子”,找到了解决方案,如下图所示: 项目结构 nodejs-crud-example/ ├── config/ │ └── db.js # 数据库连接配置 ├──…...
ESP8266/32作为AVR编程器(ISP programmer)的使用介绍
ESP8266作为AVR编程器( ISP programmer)的使用介绍 🌿ESP8266自带库例程:https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP📍支持ESP8266/32的ESP_AVRISP其它开源工程(个人没有再去验证)&…...
union all几个常见问题及其解决方案
UNION ALL 是 SQL 中用于合并两个或多个 SELECT 语句结果集的操作符。与 UNION 不同,UNION ALL 不会去除重复的记录,它简单地将一个查询的结果附加到另一个查询的结果之后。尽管 UNION ALL 相对来说更高效(因为它不需要检查重复项)…...
21.C++11
1.列表初始化 1.1C11中的{} •C11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 • 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最…...
【交叉编译】目标机编译安装对应依赖库总结
1、解压目标机交叉编译工具链 # 创建工具链存放目录(可选) sudo mkdir -p /opt/toolchain# 解压到目标路径(示例路径:/opt/toolchain) sudo tar -xzvf 目标主机编译工具链.tar.gz -C /opt/toolchain# 查看解压后的目录…...
Docker华为云创建私人镜像仓库
Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 : 或者在其他页面的搜索栏中搜索 容器镜像服务 : 进入到页面后,点击 创建组织 (华为云的镜像仓库称为组织): 设置组织名字后&…...
【15】数据结构之基于树的查找算法篇章
目录标题 二叉排序树 Binary Sort Tree二叉排序树的插入二叉树排序树的删除二叉排序树的查找二叉排序树的调试与代码集合 平衡二叉树-AV树平衡二叉树的平衡化旋转平衡二叉树的代码调试与代码集合 B树B树的查找B树的插入B树和B*树 二叉排序树 Binary Sort Tree 二叉…...
自定义类型之结构体
1.结构体类型概述 结构体类型是一种用户自定义的数据类型,用于将不同类型的数据组合成一个整体。在C语言中,结构体使用struct关键字定义,由一系列具有相同类型或不同类型的数据构成的数据集合,也称为结构。结构体中的数据在逻辑上…...
SGFormer:卫星-地面融合 3D 语义场景补全
论文介绍 题目:SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议:IEEE / CVF Computer Vision and Pattern Recognition Conference 论文:https://www.arxiv.org/abs/2503.16825 代码:https://githu…...
应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性处置封锁
钓鱼邮件的eml中会有 邮件服务器地址域名(发信人)发送的本地IP和主机名发送的内容以及附件 邮件钓鱼: 攻击者目的:通过发信人,附件,取得突破 定性钓鱼邮件 威胁情报,人工分析来源,…...
利用纯JS开发浏览器小窗口移动广告小功能
效果展示 直接上代码 如果要用到vue项目里面,直接按照vue的写法改动就行,一般没有多大的问题,顶部的占位是我项目需求,你可以按照要求改动。 <!DOCTYPE html> <html> <head><meta charset"utf-8"…...
java Stream流
Stream流 双列集合无法直接使用stream流,可以通过keyset()或enteyset转换为单列集合,再进行操作 1.单列集合 package mystream;import java.util.ArrayList; import java.util.Collections;public class StreamDemo1 {public sta…...
【实战中提升自己】 防火墙篇之VPX部署–L2TP over IPSEC
1 VPx部署【L2TP Over ipsec】 说明:在VPX上面,我们希望与分部建立VPX,保证与分部的财务部正常通信,另外还提供L2TP Over ISPEC功能,方便远程接入访问内部服务器等。当然我们也可以做详细的控制ÿ…...
贪心算法(20)(java)整数替换
给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n 1或n - 1替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1: 输入:n 8 输出:3 解…...
实验二.单按键控制LED
1.实验任务 如图4.1所示:在P0.0端口上接一个发光二极管L1,按键按一下灯亮,在按一下灯灭。 2.电路原理图 3.系统板上硬件连线 把“单片机系统”区域中的P0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容...
Ubuntu 常用命令行指令
1. 文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表)cd切换目录cd ~/Documentspwd显示当前目录路径pwdmkdir创建目录mkdir new_folderrm删除文件rm file.txtrm -r递归删除目录rm -r old_dircp复制文件cp file.txt backup/mv移动/重命名文件mv…...
Cribl 数据脱敏 -02 (附 测试数据)
先把实验的测试方向如下: Match Regex Replace Expression Example result <...
【项目管理】第16章 项目采购管理-- 知识点整理
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…...
根据关键字搜索日志内容,常用的Linux命令
在 Linux 中,根据关键字搜索日志内容是运维和开发的常见需求。以下是常用的命令及场景示例: 1. grep 基础搜索 (1) 简单关键字匹配 # 在文件中搜索包含 "error" 的行 grep "error" /var/log/nginx/error.log# 忽略大小写ÿ…...
数据结构(六)——红黑树及模拟实现
目录 前言 红黑树的概念及性质 红黑树的效率 红黑树的结构 红黑树的插入 变色不旋转 单旋变色 双旋变色 插入代码如下所示: 红黑树的查找 红黑树的验证 红黑树代码如下所示: 小结 前言 在前面的文章我们介绍了AVL这一棵完全二叉搜索树&…...
【Linux】基础 IO(文件描述符、重定向、缓冲区)
Linux 1.理解文件2.C文件接口1.打开 写文件2.读文件 简单实现cat命令3.输出信息到显示器的方式4.stdin、stdout、stderr5.打开文件的方式 3.系统接口 IO1.传递标志位2.open、close3.write、read 4.文件描述符1.是什么?2.分配规则3.重定向原理4.通过dup2系统调用重…...
记录一下远程调试 备忘
在进行远程调试时,目标主机不需要安装完整的编程环境(舍去重复安装)。可以使用Visual Studio的远程调试功能,或者使用gdb和gdbserver进行远程调试。 Visual Studio远程调试 复制远程调试器文件夹:将Visual Studio安装目录下的remot…...
libevent服务器附带qt界面开发(附带源码)
本章是入门章节,讲解如何实现一个附带界面的服务器,后续会完善与优化 使用qt编译libevent源码演示视频qt的一些知识 1.主要功能有登录界面 2.基于libevent实现的服务器的业务功能 使用qt编译libevent 下载这个,其他版本也可以 主要是github上…...
MyISAM索引方案
在InnoDB中索引即数据,也就是聚簇索引的B树叶子节点已经包含了所有完整的用户记录,MyISAM的索引方案虽然也是树形结构,但是将索引和数据分开存储 将表中的记录按记录的插入顺序单独存储在一个文件中【数据文件】,这个文件不划分数…...
Windows 图形显示驱动开发-WDDM 1.2功能—WDDM 1.2 中的 Direct3D 功能和要求
一、架构演进与驱动模型 1.1 WDDM驱动模型的革命性升级 Windows 8引入的WDDM 1.2驱动模型在以下方面实现突破: 内存管理:采用统一虚拟地址空间(UVA)架构,使CPU和GPU可共享相同的指针地址空间。具体实现通过DXGK_DRI…...
深度解析 Vue 项目 Webpack 分包与合包 一文读懂
深度解析 Vue 项目 Webpack 分包与合包 一文读懂 文章目录 深度解析 Vue 项目 Webpack 分包与合包 一文读懂一、Webpack 打包机制深度解析1.1 模块化系统的本质1.2 Webpack 构建流程解析1.3 默认打包的问题分析 二、分包策略深度配置2.1 SplitChunksPlugin 核心配置2.2 精细化分…...
【ROS】map_server 地图的保存和加载
【ROS】map_server 地图的保存和加载 前言地图的保存地图的加载 前言 在 ROS 中,想要实现导航功能,首先需要一张已建好的地图。导航系统依赖这张地图进行路径规划、定位和障碍物避让等操作。本文将讲解在使用 gmapping 或 hector_mapping 建图后&#x…...
【计网】SSL/TLS核心原理
序言 在HTTP协议中,信息是明文传输的,因此为了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议。HTTPS也是一种超文本传送协议,在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务端的…...
sqli-labs靶场 less 11
文章目录 sqli-labs靶场less 11 POS联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&…...
陕化之光(原创)
当城市在和周公化合 陕化的工装已与朝霞发生反应 工人先锋号已然吹响 陕化工人游走在工作的床层 钢铁森林间穿梭的身影 是沉默的催化剂 让冰冷的方程式 绽放出最活跃的分子温度 扳手与阀门对话时 塔林正在记录 关于电流与压力的学习笔记 每一次精确的调控 都是舞台上…...
【刷题2025】高级数据结构(并查集+优先队列+图论)
1.并查集 (1)基础理论 并查集是一种树形的数据结构,用于处理一些不相交集合的 合并 及 查询 问题。比如,可以用并查集判断一个森林中有几棵树、某个节点是否属于某棵树。 并查集由一个整形数组 pre[] 和两个函数 find() 、 join() 构成。 数组 pre[] 记录了每个点的前驱…...
数据库性能优化(sql优化)_分布式优化思路01_yxy
数据库性能优化_分布式优化思路01 1 分布式数据库的独特挑战2 分布式新增操作符介绍2.1 数据交换操作符(ESEND/ERECV):2.2 数据迭代操作符GI:3 核心优化策略(一)_分区裁剪优化3.1 普通分区裁剪3.2 动态分区裁剪1 分布式数据库的独特挑战 在分布式数据库系统中,核心为数据被…...
云服务器和物理服务器有什么区别
云服务器与物理服务器的核心区别在于资源分配方式、性能稳定性、成本结构、运维管理及 适用场景。以下是具体分析: 一、资源分配与架构差异 云服务器:基于虚拟化技术,将物理服务器集群分割为多个虚拟实例,资源由多个用户 共享,可根据需求弹性调整配置…...
FPGA-DDS技术的波形发生器
1.实验目的 1.1掌握直接数字频率合成(DDS)的基本原理及其实现方法。 1.2在DE2-115 FPGA开发板上设计一个可调频率的正弦波和方波发生器,频率范围10Hz~5MHz,最小分辨率小于1kHz。 1.3使用Quartus II进行仿真,并通过S…...
晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法
晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法 各种版本晶晨线刷工具下载: 晶晨线刷工具易出错点故障解决方法: 1、晶晨线刷工具加载固件的时候提示mac红字且剩余数为0的解决办法 很多同学可能会与遇到加…...
idea如何使用git
在 IntelliJ IDEA 中使用 Git 的详细步骤如下,分为配置、基础操作和高级功能,适合新手快速上手: 一、配置 Git 安装 Git 下载并安装 Git,安装时勾选“Add to PATH”。验证安装:终端输入 git --version 显示版本…...
python——学生管理系统
学生管理系统主要分为以下三个大类: 一、用户类(User): 属性:用户名(username)、密码(password) 功能:注册(register)、登录&#…...
快速幂+公共父节点
# 快速幂 求:23的10000次幂,那么就是求23的5000次幂,因为2350*235023^100;所以可以遍历log(n)次 int res1; int tmp23; for(int i1;i<logn;i) {tmp*tmp; }显然,我们无法通过logn计算次数; 比如是非偶数的怎么计算呢…...
【差分隐私相关概念】瑞丽差分隐私(RDP)命题4
命题4的证明详解(分情况讨论) 背景与设定 机制: f : D → R f: \mathcal{D} \to \mathcal{R} f:D→R 是由 n n n 个 ϵ \epsilon ϵ-差分隐私机制自适应组合而成。相邻输入: D D D 和 D ′ D D′ 是相邻数据集。目标…...
Vue 人看 React useRef:它不只是替代 ref
如果你是从 Vue 转到 React 的开发者,初见 useRef 可能会想:这不就是 React 版的 ref 吗?但真相是 —— 它能做的,比你想象得多得多。 👀 Vue 人初见 useRef 在 Vue 中,ref 是我们访问 DOM 或响应式数据的…...
C++第三方库【JSON】nlohman/json
文章目录 优势使用API从文件中读取json从json文本创建json对象直接创建并操作json对象字符串 <> json对象文件流 <> json对象从迭代器读取像使用STL一样的访问STL容器转化为 json数组STL容器 转 json对象自定义类型转化为 json对象 限制 优势 直观的语法ÿ…...
从源码到实战:深度解析`rsync`增量同步机制与高级应用
从源码到实战:深度解析rsync增量同步机制与高级应用 #mermaid-svg-C1ZMwvhtq4iP4E8m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-C1ZMwvhtq4iP4E8m .error-icon{fill:#552222;}#mermaid-svg-C1ZMwvht…...
数据库表设计五层分类系统表设计
文章目录 数据库表设计五层分类系统表设计代码思路详解类概述核心方法详解1. processString(String input) 方法2. createNo(String input, boolean peerNode) 方法3. isParent(String parentNo, String sonNo) 方法 编号系统设计使用场景推测代码特点可能的使用示例 NoProcess…...
Centos/RedHat 7.x服务器挂载ISCSI存储示例(无多路径非LVM)
客户让帮忙挂载个ISCSI存储,大概结构如下图所示: ISCSI存储为一台安装了truenas的X86服务器,提供存储服务的IP地址为10.16.0.1 服务器的ETH1网卡配置与10.16.0.1同段网络。 为了给客户做个简单培训,整理了一下操作步骤。下面是配…...
【android bluetooth 协议分析 21】【ble 介绍 2】【什么是IRK,是如何生成和传递的】
1. 什么是 IRK? IRK,全称 Identity Resolving Key(身份解析密钥),是 BLE 设备用于生成和解析 Resolvable Private Address(RPA) 的密钥。 2. IRK 的生成和传递过程 IRK 是在 BLE 配对…...
4.14-4.15学习总结 IO流:缓冲流+转换流+序列化流+打印流+压缩流+Commons—io工具包+Hutool工具包
图片加密操作: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class test {public static void main(String[] args) throws IOException {FileInputStream fisnull;FileOutputStream fosnull;try{fisnew…...
Linux入门学习笔记
一、文件路径相关 相对路径与绝对路径 相对路径:是从当前工作目录开始表示文件或目录位置的路径。例如,当前在 /home/user 目录下,若要访问 user 目录下 test 文件夹中的 file.txt 文件,相对路径就是 test/file.txt 。它依赖于当…...