【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 并执行查询操作。


四、SqlSessionMapper 的协作

  1. Mapper 通过 SqlSession 执行 SQL:在 MyBatis 中,Mapper 接口的每个方法都通过 SqlSession 执行 SQL 查询或更新操作。

  2. 事务管理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 的注解式开发和动态代理原理有更深入的理解,并能够灵活运用它们来优化你的项目开发。

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

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

相关文章

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…

【小程序】wxss与rpx单位以及全局样式和局部样式

目录 WXSS 1. 什么是 WXSS 2. WXSS 和 CSS 的关系 rpx 1. 什么是 rpx 尺寸单位 2. rpx 的实现原理 3. rpx 与 px 之间的单位换算* 样式导入 1. 什么是样式导入 2. import 的语法格式 全局样式和局部样式 1. 全局样式 2. 局部样式 WXSS 1. 什么是 WXSS WXSS (We…

uniapp-vue3(下)

关联链接:uniapp-vue3(上) 文章目录 七、咸虾米壁纸项目实战7.1.咸虾米壁纸项目概述7.2.项目初始化公共目录和设计稿尺寸测量工具7.3.banner海报swiper轮播器7.4.使用swiper的纵向轮播做公告区域7.5.每日推荐滑动scroll-view布局7.6.组件具名…

大数据技术-Hadoop(一)Hadoop集群的安装与配置

目录 一、准备工作 1、安装jdk(每个节点都执行) 2、修改主机配置 (每个节点都执行) 3、配置ssh无密登录 (每个节点都执行) 二、安装Hadoop(每个节点都执行) 三、集群启动配置&a…

ipad如何直连主机(Moonlight Sunshine)

Windows 被连接主机(Windows) 要使用的话需要固定ip,不然ip会换来换去,固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下,其他一路点安装完成后会打开Sunshine的Web UI&#xff…

【我的 PWN 学习手札】IO_FILE 之 stdout任意地址读

上一篇文章学会了stdin任意地址写【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写-CSDN博客 本篇关注stdout利用手法,和上篇提及的手法有着异曲同工之妙 文章目录 前言 一、_IO_2_1_stdout_输出链,及利用思路 (一)_IO_2_1_std…

部署SenseVoice

依赖 Conda cuda pythor 查看GPU版本-CSDN博客 创建虚拟conda环境 conda create --name deeplearn python3.10 conda activate deeplearn git clone https://github.com/FunAudioLLM/SenseVoice.git cd SenseVoice pip install -r requirements.txt pip install gradio pyth…

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况,一般网页和桌面是可以正常编译的, 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

yolov4算法及其改进

yolov4算法及其改进 1、yolov4介绍2、mosaic与mish激活函数2.1、mosaic数据增强2.2、Mish激活函数 3、backbone网络框架的改进4、PAN-FPN的介绍5、样本匹配和损失函数5.1、样本匹配5.2、YOLOV4损失函数5.2.1、GIOU loss5.2.2、DIOU loss5.2.3、CIOU Loss 1、yolov4介绍 改进点&…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接,推广链接,网站导航,显示小组件,显示信息提要,背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

目标检测文献阅读-YOLO:统一的实时目标检测(12.23-12.29)

目录 摘要 Abstract 1 引言 2 统一的检测 3 网络设计 4 训练 5 YOLOv5训练猫狗识别模型 5.1 项目代码整体结构介绍 5.2 数据集和预训练权重的准备 5.3 训练猫狗识别模型 5.3.1 修改数据配置文件 5.3.2 修改模型配置文件 5.3.3 训练模型 5.3.4 启用tensorbord查看…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …

【模块系列】STM321.69TFT屏幕

前言 在翻翻自己的器件盒的时候,发现这块好久之前买的TFT屏了,想起还没有用STM32点亮过,手头上正好有立创的梁山派STM32F4,就试着按照网上的文章教程顺便移植个LVGL看看,然后就有了就本文。 代码工程命名的是LvglDemo&…

Unity中列表List使用出类似字典Dictionary的感觉

首先为什么会有这个标题? 因为字典很好用,只需要键就能拿到值,这种感觉是真的爽,新手最喜欢用了,遇事不决就字典,但是也有不好的地方,字典的内存开销比列表List要大,遍历也是List占…

Android中使用AIDL实现进程通信

前言 关于使用AIDL实现两个APP(跨进程)通信,我们通常把两个APP分别叫做服务端和客户端。本文不讲原理,只给最简易的案例。 一、服务端APP实现 1. 在src/main/aidl目录下新建一个.aidl文件,然后在.aidl文件中定义需要…

Mac安装多个版本node、java、python 等开发软件环境,安装、卸载、升级多个数据库

安装多个版本node、java、python 等开发软件环境 使用nvm(Node.js Version Manager)来管理多个Node.js版本。 使用jenv来管理多个Java版本。 使用pyenv来管理多个Python版本。 以下是安装和使用这些版本管理器的基本步骤: 1. 安装多个版本…

Ftrace: 深入探究Linux内核的追踪利器

文章目录 一、 前言二、Ftrace介绍2.1 Ftrace框架2.2 Ftrace的使用场景 三、Ftrace配置和控制接口四、Ftrace使用步骤1:配置内核2. 挂载debugfs3. 查看和配置Ftrace4. 开始追踪[可选]5. 查看追踪结果6. 保存追踪数据7. 清除追踪配置 五、实战演示5.1 function跟踪器…

人工智能基础软件-Jupyter Notebook

简介: Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直…

tesla openday数据驱动串讲

一、我写的目的 tesla的数据驱动全流程代表着现在(曾经)的sota,总结和沉淀他的方法总结后与自己现在的理念做一次对标,查漏补缺找到自己现在的主要问题,聚焦下一阶段的投入 二、主要方法 本文不讲解tesla的视觉技术…