Mybatis框架中动态代理

绝对肝货,超全的 MyBatis 动态代理原理讲解。 MyBatis是一个ORM工具,封装了JDBC的操作,简化业务编程;Mybatis在web工程中,与Spring集成,提供业务读写数据库的能力。定义实体}接口定义}定义映射文件 阅读详情

在 MyBatis 中,动态代理 是一种用于实现接口的技术,MyBatis 通过 Java 动态代理(基于 java.lang.reflect.Proxy)来生成 Mapper 接口的实现类。MyBatis 在执行 SQL 时,使用动态代理机制来处理方法调用,将方法调用转化为数据库操作。

1. 动态代理的工作原理

MyBatis 使用动态代理生成 Mapper 接口的实现类,并且将接口方法的调用委托给 SqlSession 来执行相应的 SQL 查询。具体流程如下:

  • 在 MyBatis 配置文件中定义了一个 Mapper 接口(例如 UserMapper)。
  • 在运行时,MyBatis 通过 SqlSession 生成该接口的动态代理对象。
  • 当调用 Mapper 接口中的方法时,代理对象会将调用委托给 MyBatis 的 Executor,Executor 根据配置的 SQL 映射文件(XML 文件)或注解执行对应的 SQL 查询。

2. MyBatis 动态代理的示例

假设有一个简单的 MyBatis 配置和 Mapper 接口,我们可以演示如何通过 MyBatis 使用动态代理来执行数据库操作。

1.1. Mapper 接口

首先定义一个 Mapper 接口:

public interface UserMapper {
    User selectUserById(int id);
    List<User> selectAllUsers();
}

这个接口定义了两个方法:selectUserById 和 selectAllUsers,用于查询数据库中的用户数据。

1.2. MyBatis 配置文件 (mybatis-config.xml)

接下来,我们定义 MyBatis 的配置文件,指定 SQL 映射文件:

<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
1.3. SQL 映射文件 (UserMapper.xml)

SQL 映射文件用于定义 SQL 查询语句与方法的映射关系:

<mapper namespace="com.example.mapper.UserMapper">

    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="selectAllUsers" resultType="com.example.model.User">
        SELECT * FROM users
    </select>

</mapper>

在这个文件中,selectUserById 和 selectAllUsers 分别对应了接口方法和 SQL 查询。

1.4. 配置 SqlSessionFactory 和 SqlSession

在 Spring 或 MyBatis 的 Java 配置中,创建 SqlSessionFactory 和 SqlSession:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

当你调用 userMapper.selectUserById(1) 时,MyBatis 会通过动态代理机制将方法调用转化为相应的 SQL 查询。

1.6. 调用 Mapper 方法

现在,你可以调用 Mapper 方法,MyBatis 会自动执行相应的 SQL 查询:

User user = userMapper.selectUserById(1);
System.out.println(user);

MyBatis 会根据接口方法名(selectUserById)找到对应的 SQL 语句(在 UserMapper.xml 中),并执行查询操作。

3. 动态代理的工作机制

  1. 接口和映射文件的映射:MyBatis 会通过接口方法名与映射文件中 SQL 的 id 进行匹配,决定要执行的 SQL 查询。
  2. 生成代理对象:通过 SqlSession.getMapper(UserMapper.class),MyBatis 会使用 Java 的动态代理技术生成 UserMapper 接口的代理类。
  3. 方法调用和 SQL 执行:当调用接口方法时,代理对象会捕获方法调用,并根据方法签名查找对应的 SQL 映射,执行 SQL 查询,然后返回查询结果。

4. MyBatis 动态代理的实现

MyBatis 使用 JDK 动态代理来实现这一过程。SqlSession 在内部通过 JDK 动态代理生成接口的代理对象。MapperProxy 类就是 MyBatis 实现这一机制的核心。

4.1. MapperProxy

MapperProxy 实现了 InvocationHandler 接口,它会处理代理对象的方法调用。具体的实现如下:

  • 当你调用接口方法时,MapperProxy 会捕获方法调用,并根据方法名和方法签名找到对应的 SQL 映射。
  • 然后,MapperProxy 将会调用 SqlSession 的相关方法来执行 SQL,并返回结果。

MapperProxy 主要负责将接口方法的调用转化为数据库操作,它会根据接口方法签名从映射文件中查找对应的 SQL 语句,并调用 Executor 来执行。

4.2. SqlSession 和 MapperProxy 的配合

在 SqlSession 内部,MyBatis 会使用 MapperProxyFactory 来创建 Mapper 接口的代理类。具体实现如下:

public <T> T getMapper(Class<T> type) {
    // 获取代理对象
    return (T) Proxy.newProxyInstance(
        type.getClassLoader(),
        new Class[]{type},
        new MapperProxy(this, type));
}

在这段代码中,Proxy.newProxyInstance 会创建一个动态代理对象,MapperProxy 会处理所有接口方法的调用。

5. MyBatis 动态代理的优势

  • 灵活性:通过动态代理,MyBatis 可以自动为 Mapper 接口生成实现类,不需要手动编写实现类。这样可以减少冗余代码,使得开发过程更加简洁。
  • 解耦:业务逻辑代码与 SQL 映射解耦,接口方法与 SQL 语句的绑定由 MyBatis 自动完成,简化了开发工作。
  • 透明性:动态代理让开发人员只需要关注接口和 SQL 映射文件的编写,底层的数据库操作由 MyBatis 自动处理。

6. 总结

在 MyBatis 中,动态代理 是实现 Mapper 接口功能的核心技术。MyBatis 通过 Java 的动态代理技术自动为 Mapper 接口生成实现类,将接口方法调用转化为数据库操作。通过这种方式,开发者只需定义接口和 SQL 映射文件,MyBatis 会自动处理接口方法与 SQL 执行之间的映射关系,减少了手动编写 DAO 层的工作量,提高了代码的可维护性和可扩展性。

mybatis框架入门之dao层动态代理实现---详细介绍 mybatis框架入门之dao层动态代理实现—详细介绍 一、mybatis框架介绍 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。它可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,即普通的Java对象)映射成数据库中的记录。 1. 优点 (1)简单易学:mybatis没有任何第三方依赖,只需要安装两个jar包和配置几个映射文件即可。 (2)使用灵活:mybatis不会对应用程 阅读详情

相关推荐

Cosmos Transfer2.5多模态AI模型部署与优化实战

多模态AI技术通过融合文本、图像、代码等不同模态数据,实现跨模态理解与生成。其核心原理基于Transformer架构的注意力机制,结合对比学习实现模态对齐。这类技术在智能内容创作、跨模态搜索等领域具有重要价值,尤其适合电商营销图文生成、UI设计转代码等场景。Cosmos Transfer2.5作为先进的多模态模型,支持8192 tokens长文本窗口和混合模态输入,实测推理速度达17.5 samples/s(T4显卡)。部署时需注意FlashAttention优化可提升3倍长文本处理效率,8-bit量化则能

weixin_29038303的博客 283

MyBatis之【动态代理】

一、代理模式 1、什么是代理模式 (1)目标对象不可访问,通过代理对象增强功能访问。 2、代理模式的作用 (1)控制目标对象的访问 (2)增强功能 3、代理模式的分类 (1)静态代理 (2)动态代理: ①JDK动态代理 ②CGLib动态代理 4、代理的实现方式 (1)静态代理实现 (2)动态代理的实现分为JDK动态代理和CGLib动态代理 二、静态代理 1、静态代理的特点 (1)目标对象和代理对象实现同一个业务接口 (2)目标对象必须实现接口 (3)代理对象在程序运行前就

weixin_48485216的博客 1583

别再只玩积木了!用乐高EV3和官方软件,手把手教你做个能巡线的小车(附完整代码)

本文详细介绍了如何利用乐高EV3套件和官方软件制作智能巡线机器人,从硬件组装到软件编程全面覆盖。通过传感器原理讲解、控制算法调试等工程化细节,帮助读者掌握机器人开发的核心理念,特别适合STEAM教育和硬件编程爱好者实践。

weixin_30776273的博客 454

Mybatis框架基础入门(二)--架构简介

mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂 由会话工厂创建sq...

Aaron 738

给MATLAB安装runtime插件

输入你刚刚下载压缩包的位置(小白提示:在 此电脑 中找到压缩包位置,右键属性复制位置)(!设置好以后然后填写下面输出exe文件的信息,包括文件的名字、作者、Email、公司、概述、描述,下面还可以选择额外的安装选项,exe文件运行需要的其他文件(图像、子程序等)、提供给用户的文件(readme.txt等)(很多方法是官网下载,但在官网下载还是会版本不对应,所以直接在你所用的MATLAB里搜索安装链接最靠谱)(!5.可以打包程序了(你发送文件的人电脑里没有MATLAB也可以查看运行你的程序了)

Pei_hua100的专栏 1万+

中国主要湖泊水库面状矢量边界图层ArcGIS应用实战:从数据获取到专题图制作

本文详细介绍了中国主要湖泊水库面状矢量边界图层在ArcGIS中的实战应用,从数据获取到专题图制作的全流程。涵盖官方数据源、科研机构共享数据及商业平台的选择,以及ArcGIS中的数据处理、拓扑错误修正和专题图设计技巧,帮助用户高效完成湖泊水库的空间分析与可视化。

weixin_33672400的博客 256

深入探索MyBatis的动态代理模式

动态代理是一种设计模式,它在运行时创建代理对象,以控制对某个对象的访问。MyBatis的动态代理模式允许开发者定义一个Mapper接口,而无需提供实现类。MyBatis会在运行时自动创建这个接口的代理对象,代理对象会拦截接口方法的调用,并执行相应的数据库操作。// 更多数据库操作方法...

m0_71752625的博客 1787

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

Mybatis源码解析(二) -- 动态代理与池化技术

在mybatis中通过动态代理的方式,实例化Mapper接口,请求Mapper接口方法时,可直接与该方法对应的xml标签中的sql语句并执行,接下来我们来梳理一下请求的流程。

weixin_43796428的博客 957

指纹浏览器降维打击(下):Cloudflare Turnstile 与 hCaptcha 的底层交互逻辑

本文将深度拆解:Turnstile 与 hCaptcha 的 Iframe 沙箱通信机制,动态混淆 JS 与 PoW(工作量证明)的物理破解法则,以及如何通过 C++ 底层事件合成与环境基因强绑定,实现验证码的“无感过验”。

数据知道的博客 424

matlab计算图像信噪比SNR

【代码】matlab计算图像信噪比SNR。

baidu_34971492的博客 1399

MyBatis学习:MyBatis动态代理的说明和使用要求及初步使用

本篇博客说明一下MyBatis动态代理和使用动态代理的要求以及初步使用一下动态代理生成的实现类。

weixin_46281472的博客 3057

FineReport FCP模拟题五

新建决策报表,设置 移动端 格式,采用绝对布局。数据来源:FRDemo中的订单表/雇员表。

Davina_yu的博客 725

【MyBatis框架】动态代理-MyBatis框架的代理模式

MyBatis框架的代理模式 通过前面的了解,我们大致知道了MyBatis框架的基本使用方式。但是,我们可能会有一个疑问,为什么Mapper接口没有实现类却能被正常调用呢?其实这是因为MyBatis在Mapper接口上使用了动态代理的一种非常规的用法。在了解这种用法之前,我们先来看看原生方法的使用。 原生方法的调用方式 以查询操作为例,原生方法的调用会直接通过sqlSession会话调用相应的方法来达到查询的目的。代码如下: 接口文件: public interface StudentMappe

Sampson_S的博客 2811

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Mybatis框架-----Mapper 动态代理

睡前小文章,助眠有奇效

qq_48788523的博客 495

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

自己动手实现mybatis的底层框架(不用动态代理直接用执行器、用动态代理自己实现。图文分析!)

我们从mybatis的jar包中看到其中有个Executor执行器的包,里面封装了很多操作数据库的方法 CachingExecutor类实现了Executor接口:很多关于DB的原生方法都在此类进行一个实现:比如query / select / update / delete 方法等引用老韩博主的图 @1: 首先我们不通过代理对象操作DB的方法。而是直接通过执行器去操作DB我们首先会自定义核心配置文件(XML文件):1.这里面包括数据库的连接 ,我们会用一个snConfigration配置类,去读取prop

m0_74301606的博客 1206

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Mybatis框架--动态代理源码分析

标题

weixin_42262357的博客 232

MyBatis框架(03)——Mapper动态代理

MyBatis框架版权声明一、实现原理二、具体实现 版权声明 本文原创作者:清风不渡 博客地址:https://blog.youkuaiyun.com/WXKKang 一、实现原理   Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法 Mapper接口开发需要遵循以下规范: ...

清风不渡 322

MyBatis框架动态代理及其参数的传入

文章目录三、MyBatis框架Dao代理3.1 动态代理3.2 parameterType属性3.3 传入一个简单类型的参数3.4 传入多个参数3.4.1 使用@Param命名参数(掌握)3.4.2 使用对象参数(掌握)3.4.3 按位置传参(了解)3.4.4 Map传参(了解) 三、MyBatis框架Dao代理 3.1 动态代理 动态代理其实前面就已经用过了,就是直接使用SqlSession对象的getMapper(Dao接口.class)方法获取dao接口对象。 然后使用直接用这个dao的方法来调用我们

越努力越幸运的博客 709

mybatis框架——Mapper动态代理方式

1、Mybatis框架的介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处...

GechangLiu的博客 563

Mybatis框架-----Mapper 动态代理原理

来看看呗,Mapper动态代理原理

qq_48788523的博客 563

mybatis 返回string_Mybatis框架和插件将动态代理玩出了新境界

静态代理 又是一年毕业季,很多小伙伴开始去大城市打拼。来大城市第一件事就是租房,免不了和中介打交道,因为很多房东很忙,你根本找不到他。从这个场景中就可以抽象出来代理模式ISubject:被访问者资源的抽象SubjectImpl:被访问者具体实现类(房东)SubjectProxy:被访问者的代理实现类(中介)UML图如下举个例子来理解一下这个设计模式老板让记录一下用户服务的响应时间,用代理...

weixin_39659837的博客 101

Mybatis学习笔记一:Mybatis框架安装与搭建,Mybatis配置,Mybatis与Jdbc,Hibernate区别,Mybatis动态代理开发

文章目录1. Mybatis学习笔记一:1.1. jdbc缺点1.2. Mybatis安装1.3. Mabatis框架搭建1.4. Mybatis实现增删查改操作1.4.1. Mybatis实现通过ID名查找1.4.2. Mybatis的Mapper.xml参数配置1.5. Mybatis中#{}和${}的区别Mybatis配置模糊查询Mybatis配置添加Mybatis配置更新Mybatis配置...

公子&小白的博客 1207

Java中动态代理与MyBatis框架的底层简单实现

博主大二计科学生一枚,正在学习MyBatis框架,在动态代理用Java动态代理机制简单实现MyBatis框架底层时遇到小困难,回去复习Java动态代理机制后,结合自己的理解和ai辅助,写下了这篇笔记方便大家复习后端开发技术,祝大家都能拿高薪、进大厂!本篇笔记重点Java动态代理机制的详细讲解,已经Github上上传了用Java动态代理机制简单实现MyBatis框架底层文中的图一、图三引用自黑马程序员的网课,图二引用彩虹糖广告图,如有侵权,本人立即删除。

2301_82328064的博客 1220

Mybatis框架——mapper动态代理接口

Mybatis框架——mapper动态代理接口 之前我们需要使用接口调用实现类,实现类再调用mapper.xml,在实现类中使用mybatis的方式非常类似,xml中sql statement硬编码到Java代码中,那么能否只写接口和mapper.xml,不写实现类就能实现呢?答案是肯定的! mapper.xml的namespace要和接口的全路径一致 mapper.xml里的增删改查的标签的id(statementId)要和接口中的方法名一致(接口中的方法见上一篇文章) mapper.xml里的par

qq_45838562的博客 304

【学习】从spring-mybatis看如何自定义基于动态代理的结合spring的框架

从spring-mybatis看如何自定义基于动态代理的结合spring的框架 写在前面 最近同事做了一个mybatis分享,涉及到很多东西,对其中mybatis-spring比较感兴趣,所以深入了解下, 这对以后其他任何基于接口动态代理的功能模块能够更加快速的了解和学习。 入口 入口是在xml中配置的org.mybatis.spring.mapper.MapperScannerConfigure...

zhuojl的博客 276
上一篇: Mybatis一级缓存和二级缓存
下一篇: Mybatis源码分析——MappedStatement(1)
yang_xinkun
博客等级 码龄10年 108粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值