【MyBatis 核心工作机制】注解式开发与动态代理原理
有很多朋友可能已经在开发中熟练使用 MyBatis 或者刚开始学习 MyBatis,对于它的一些工作机制不太了解。“咦,怎么写几个注解,写几个配置文件,就能实现这些效果呢,好神奇呀!”当你看完这篇博客之后,你会不经赞叹 MyBatis 框架设计者的巧妙,并且会帮助你理解这个工作机制。
还是先大致介绍一下 Mybatis,在现代 Java 开发中,MyBatis 是一个非常流行的持久层框架,它帮助我们简化了数据库操作,减少了重复代码,并提升了开发效率。今天,我们将重点探讨 MyBatis 中的注解式开发和它背后的动态代理机制。通过理解这些核心概念,你将能够更高效地使用 MyBatis 进行数据库交互。
一、什么是 MyBatis 注解式开发?
我们先来简单回顾一下 MyBatis 的基本概念。MyBatis 是一个半自动化的 ORM(对象关系映射)框架,它通过 SQL 映射文件(XML 或注解)将 Java 对象与数据库表中的数据进行映射。与传统的 JDBC 操作相比,MyBatis 提供了更简洁的代码和更灵活的 SQL 操作方式。
在注解式开发中,我们将 SQL 语句直接写在 Java 接口的方法上,MyBatis 会根据这些注解自动执行相应的 SQL。这种方式简化了传统 XML 配置,适用于一些简单、直接的数据库操作。
二、核心机制:SqlSessionFactory 和 SqlSession
1. SqlSessionFactory 的作用
无论是使用 XML 还是注解,SqlSessionFactory 都是 MyBatis 的核心。它的主要任务是解析配置文件、创建 SqlSession 实例,并初始化所有相关的环境配置。通过 SqlSessionFactory,我们可以访问数据库和执行 SQL。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
在注解式开发中,SqlSessionFactory 会根据我们提供的配置文件来加载数据库连接、事务管理等信息,并为每个数据库操作生成 SqlSession 对象。
2. SqlSession 的核心作用
SqlSession 是与数据库交互的关键对象,它负责执行 SQL 语句、管理事务,并返回查询结果。在注解式开发中,SqlSession 会通过动态代理的方式创建 Mapper 接口的实例,从而完成数据库操作。
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(1);System.out.println(user.getName());
}
在这个代码中,SqlSession 通过 session.getMapper(UserMapper.class) 获取到一个动态代理的 UserMapper 接口对象,并执行查询操作。
三、Mapper 接口:动态代理的神奇之处
1. 什么是 Mapper 接口?
Mapper 接口是 MyBatis 提供的一种方式,用于将 SQL 操作封装为 Java 接口方法。每个方法对应一个 SQL 语句,在运行时,MyBatis 会为这些方法生成代理类,通过动态代理来执行实际的数据库操作。
在注解式开发中,@Select、@Insert 等注解用于直接定义 SQL 语句,而 MyBatis 会根据这些注解的内容来生成相应的 SQL 执行逻辑。
2. 动态代理的工作原理
MyBatis 使用 Java 的动态代理机制(java.lang.reflect.Proxy)为每个 Mapper 接口创建代理对象。当调用 mapper.selectUserById(1) 时,代理对象会拦截这个方法调用,解析方法名,并执行相应的 SQL。
这种代理机制的核心是 MapperProxy 类,它负责将方法调用转发给 SqlSession 来执行实际的数据库操作。
UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 动态代理生成
mapper.selectUserById(1); // 实际调用时被代理拦截
在执行过程中,MapperProxy 会根据方法的名称、参数以及注解中的 SQL 信息来确定要执行的 SQL 语句,并通过 SqlSession 来完成 SQL 执行。
3. 注解的工作机制
MyBatis 提供了多种注解来简化 SQL 的编写,最常用的有 @Select、@Insert、@Update 和 @Delete。这些注解会将 SQL 语句绑定到对应的接口方法上,并且 MyBatis 会在初始化时解析这些注解,确保每个方法能够正确执行相应的 SQL。
例如:
@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User selectUserById(@Param("id") int id);
}
在这个例子中,@Select 注解将 SQL 语句绑定到 selectUserById 方法,MyBatis 会自动生成对应的执行逻辑。调用 mapper.selectUserById(1) 时,MyBatis 会解析 SQL 并执行查询操作。
四、SqlSession 和 Mapper 的协作
-
Mapper通过SqlSession执行 SQL:在 MyBatis 中,Mapper接口的每个方法都通过SqlSession执行 SQL 查询或更新操作。 -
事务管理:
SqlSession提供了提交、回滚和关闭的方法,以确保事务的一致性。在注解式开发中,事务管理仍然由SqlSession负责。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.selectUserById(1); // 执行 SQL 查询sqlSession.commit(); // 提交事务
}
通过这种方式,SqlSession 确保了数据库操作的事务一致性和执行效率。
五、总结:MyBatis 注解式开发的优势
- 简化配置:注解式开发无需编写复杂的 XML 配置,SQL 直接写在 Java 方法上,减少了配置的复杂度。
- 高效开发:通过动态代理机制,MyBatis 可以自动为我们生成数据库操作的执行逻辑,简化了代码结构。
- 灵活性:虽然注解式开发适用于简单的 SQL 操作,但对于复杂的查询或多表关联,MyBatis 仍然推荐使用 XML 配置。
MyBatis 在注解式开发中的优势显而易见,它不仅提高了开发效率,还减少了 SQL 语句与 Java 代码的耦合度。通过理解
SqlSession和动态代理的机制,你将能够更好地利用 MyBatis 进行高效的数据库操作。
希望通过这篇文章,你能对 MyBatis 的注解式开发和动态代理原理有更深入的理解,并能够灵活运用它们来优化你的项目开发。
相关文章:
【MyBatis 核心工作机制】注解式开发与动态代理原理
有很多朋友可能已经在开发中熟练使用 MyBatis 或者刚开始学习 MyBatis,对于它的一些工作机制不太了解。“咦,怎么写几个注解,写几个配置文件,就能实现这些效果呢,好神奇呀!”当你看完这篇博客之后…...
深度学习在图像识别中的最新进展与实践案例
深度学习在图像识别中的最新进展与实践案例 在当今信息爆炸的时代,图像作为信息传递的重要载体,其处理与分析技术显得尤为重要。深度学习,作为人工智能领域的一个分支,凭借其强大的特征提取与模式识别能力,在图像识别…...
vue3中如何自定义插件
英译汉插件 i18n.ts export default {install: (app: any, options: any) > {// 注入一个全局可用的$translate()方法app.config.globalProperties.$translate (key: string) > {// 获取options对象的深层属性// 使用key作为索引return key.split(".").redu…...
【机器学习】回归
文章目录 1. 如何训练回归问题2. 泛化能力3. 误差来源4. 正则化5. 交叉验证 1. 如何训练回归问题 第一步:定义模型 线性模型: y ^ b ∑ j w j x j \hat{y} b \sum_{j} w_j x_j y^b∑jwjxj 其中,( w ) 是权重,( b )…...
Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方
在Java 的Maven项目中,可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe,但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe,比如: 因为不需要经常运行 OpenRewrite,所以不想在pom.xml 加入不常使用的插件…...
【翻译】Sora 系统卡-12月9日
Sora System ard | OpenAI 简介 Sora 概述 Sora 是 OpenAI 的视频生成模型,旨在接收文本、图像和视频输入并生成新视频作为输出。用户可以创建各种格式的分辨率高达 1080p(最长 20 秒)的视频,从文本生成新内容,或增强…...
如何在 Spring Boot 微服务中设置和管理多个数据库
在现代微服务架构中,通常需要与多个数据库交互的服务。这可能是由于各种原因,例如遗留系统集成、不同类型的数据存储需求,或者仅仅是为了优化性能。Spring Boot 具有灵活的配置和强大的数据访问库,可以轻松配置多个数据库。在本综…...
Ubuntu20.04安装Foxit Reader 福昕阅读器
Ubuntu20.04安装Foxit Reader 福昕阅读器 文章目录 Ubuntu20.04安装Foxit Reader 福昕阅读器 先更新一下源 sudo apt update sudo apt upgrade下载Foxit Reader的稳定版本 wget https://cdn01.foxitsoftware.com/pub/foxit/reader/desktop/linux/2.x/2.4/en_us/FoxitReader.e…...
学习threejs,THREE.CircleGeometry 二维平面圆形几何体
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.CircleGeometry 圆形…...
Tonghttpserver6.0.1.3 使用整理(by lqw)
文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装,启动和查看授权信息3.2一些常见的使用问题(单机控制台)3.3之前使用的是nginx,现在要配nginx.conf上的配置,在THS上如何配置3.4如何配置密码过…...
redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线
文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…...
OPPO Java面试题及参考答案
Java 语言的特点 Java 是一种面向对象的编程语言,它具有以下显著特点。 首先是简单性。Java 的语法相对简单,它摒弃了 C 和 C++ 语言中一些复杂的特性,比如指针操作。这使得程序员能够更专注于业务逻辑的实现,而不是陷入复杂的语法细节中。例如,Java 的内存管理是自动进行…...
Ubuntu 22.04 升级 24.04 问题记录
一台闲置笔记本使用的 ubuntu 还是 18.04,最近重新使用,发现版本过低,决定升级,于是完成了 18.04 -> 20.04 -> 22. 04 -> 24.04 的三连跳。 一、升级过程中黑屏 主要问题是在 22.04 升级到 24.04 过程中出现了黑屏仅剩…...
Java重要面试名词整理(五):Redis
文章目录 Redis高级命令Redis持久化RDB快照(snapshot)**AOF(append-only file)****Redis 4.0 混合持久化** 管道(Pipeline)**StringRedisTemplate与RedisTemplate详解**Redis集群方案gossip脑裂 Redis LuaR…...
单元测试中创建多个线程测试 ThreadLocal
单元测试中创建多个线程测试 ThreadLocal 在单元测试中,可以通过以下方式创建多个线程来测试 ThreadLocal 的行为。 目标 验证 ThreadLocal 在多线程环境下是否能正确隔离每个线程的数据。 实现步骤 定义需要测试的类 包含 ThreadLocal 对象的类,提供…...
iDP3复现代码数据预处理全流程(二)——vis_dataset.py
vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理 关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点: 1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相…...
容器化部署服务全流程
系列文章目录 文章目录 系列文章目录前言一、什么是容器?二、如何安装docker三、如何写dockerfile四、如何启动服务五、常见命令总结总结 前言 这篇文章,主要目的是通过容器化技术简化应用程序的部署、运行和管理,提高开发、测试和生产环境…...
Flutter DragTarget拖拽控件详解
文章目录 1. DragTarget 控件的构造函数主要参数: 2. DragTarget 的工作原理3. 常见用法示例 1:实现一个简单的拖拽目标解释:示例 2:与 Draggable 结合使用解释: 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…...
操作系统动态分区分配算法-首次适应算法c语言实现
目录 一、算法原理 二、算法特点 1.优先利用低址空闲分区: 2.查找开销: 3.内存碎片: 三、内存回收四种情况 1.回收区上面(或后面)的分区是空闲分区: 2.回收区下面(或前面)的…...
mybatis-plus自动填充时间的配置类实现
mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果