mybatis的代理技术

news/2024/9/19 17:50:21/文章来源:https://www.cnblogs.com/zqlmianshi/p/18421063

在 MyBatis 中,代理对象是通过动态代理技术生成的对象,用于拦截对接口方法的调用并将这些调用转发给相应的 SQL 映射文件中的 SQL 语句执行。具体来说,代理对象是一个实现了某个接口的类实例,但这个实例的实际行为是在运行时动态生成的,而不是在编译时固定的。

### 动态代理

在 Java 中,动态代理通常通过 `java.lang.reflect.Proxy` 类和 `InvocationHandler` 接口来实现。MyBatis 使用了这种机制来生成 Mapper 接口的代理对象。

### 代理对象的工作原理

1. **接口定义**:
定义一个 Mapper 接口,如 `UserMapper`。

```java
public interface UserMapper {
User getUserById(int id);
}
```

2. **MapperFactoryBean 创建代理对象**:
当 MyBatis 初始化时,`MapperFactoryBean` 会为每个 Mapper 接口创建一个代理对象。这个代理对象实现了 `UserMapper` 接口。

3. **代理对象拦截方法调用**:
当你通过代理对象调用 `getUserById` 方法时,实际的调用会被代理对象拦截。

4. **调用转换**:
代理对象会将拦截到的方法调用转换为对相应 SQL 映射文件中的 SQL 语句的调用。具体步骤包括:
- 查找与方法名匹配的 SQL 语句(如 XML 配置文件中的 `<select>` 语句)。
- 将方法参数传递给 SQL 语句。
- 执行 SQL 语句。
- 将 SQL 执行结果映射为方法的返回类型(如 `User` 对象)。

### 代理对象的示例

以下是一个使用动态代理的简单示例,以帮助理解代理对象的概念。

```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 定义接口
interface UserMapper {
User getUserById(int id);
}

// 模拟 User 对象
class User {
private int id;
private String name;

// getters and setters
}

// 实现 InvocationHandler
class MapperInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 这里可以添加对方法调用的拦截逻辑
System.out.println("Method " + method.getName() + " is called with args " + args[0]);

// 模拟返回结果
User user = new User();
user.setId((int) args[0]);
user.setName("John Doe");
return user;
}
}

public class Main {
public static void main(String[] args) {
// 创建代理对象
UserMapper userMapper = (UserMapper) Proxy.newProxyInstance(
UserMapper.class.getClassLoader(),
new Class[]{UserMapper.class},
new MapperInvocationHandler()
);

// 调用代理对象的方法
User user = userMapper.getUserById(1);
System.out.println("User: " + user.getName());
}
}
```

在这个示例中:

- `UserMapper` 是一个接口。
- `MapperInvocationHandler` 实现了 `InvocationHandler` 接口,定义了如何处理方法调用。
- 使用 `Proxy.newProxyInstance` 创建了一个 `UserMapper` 接口的代理对象。
- 当调用 `userMapper.getUserById` 方法时,实际的调用被 `MapperInvocationHandler` 拦截并处理。

在 MyBatis 中,类似的机制被用来拦截对 Mapper 接口方法的调用,并将这些调用转换为对 SQL 映射文件的操作。通过这种方式,MyBatis 实现了将 Java 方法调用与 SQL 语句执行的无缝集成。

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

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

相关文章

springcloud组件openfeign超时时间设置

openfeign超时时间设置有两种方式 1、通过配置类;2、通过配置文件 1、使用配置类代码如下:@Configuration public class FeignConfig {@Beanpublic Request.Options options(){//第一个参数是连接超时时间,第二个参数是处理超时时间return new Request.Options(5000,3000);}…

python虚拟环境venv

创建目录 mkdir pyenv 进入 cd pyenv 初始化环境 python3 -m venv .进入bin目录 jihan@jihandeMacBook-Pro pyenv % cd bin jihan@jihandeMacBook-Pro bin % ls Activate.ps1 activate activate.csh activate.fish pip pip3 pip3.12 python python3 python3.12 jihan@jiha…

进行网站监控有必要吗?

在当今数字化高速发展的时代,网站已经成为了企业、组织乃至个人展示自身形象、提供服务、进行交流互动的重要平台。那么,进行网站监控有必要吗?答案无疑是肯定的。 进行网站监控,首先是保障用户体验的关键。对于访问网站的用户来说,他们期望能够快速、稳定地获取所需信息或…

Typora+picgo+jsDelivr实现免费图床

Typora+picgo+github+jsDelivr实现免费图床 需求 typora中写markdown图片是保存在本地的,为了简化写博客时繁琐的插入图片步骤,直接使用typora+picgo将图片上传到云端,这样发博客就只要复制markdown即可 步骤 前期准备:github中创建一个仓库用于保存图片 名字随便填就行1.下…

线上间歇性卡顿问题

事情起因 最近一段时间我们公司有个项目是做视力筛查的,平时都是正常的,但是最近这两天突然会时不时地卡顿一下,一卡就是几分钟。排查过程 1.查看日志 卡顿首先是排查日志,日志报的是feign调用学生服务超时,进到学生服务查看时,看到日志报的是事务超时2.继续排查,既然是…

关于springcloud中openfeign中服务调用日志输出

在使用openfeign进行服务调用的时候,我们可以通过一些配置,获取到服务调用的日志输出,可以从消费端看到日志 有两种方法:一、使用配置类;二、使用配置文件配置 日志输出级别有四种: NONE:不输出(默认) BASIC:只输出请求方式、url、请求成功与否 HEADERS:输出请求头的…

《现代操作系统》第10章——实例研究1:UNIX、Linux和Android

《现代操作系统》第 10 章——实例研究 1:UNIX、Linux 和 Android 10.1 UNIX 与 Linux 的历史 第一次使 UNIX 的两种流派一致的严肃尝试来源于 IEEE(它是一个得到高度尊重的中立组织)标准委员会的赞助。有上百名来自业界、学界以及政府的人员参加了此项工作。他们共同决定将…

linux使用yum命令报错Cannot find a valid baseurl for repo: base/7/x86_64

【问题】 在VMware上安装搭建centOS 7虚拟机,配置好网络后,尝试通过yum命令进行安装docker容器。执行命令报错: 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile  Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea…

研发工程师的「第一性原理」思维

回顾复盘五年来的研发经历,愈发认同身边同事强调的“第一性原理”思维,仅做浅浅记录和分享一、定义与理论介绍第一性原理(First Principles),又称基本原理,是指从最基本的假设和定义出发,通过逻辑推理和演绎得出结论的一种思维方法。它强调对事物的本质和根源进行深入的…

Meta Llama3 论文研读

一、 引言概述(Intro & Overview) Llama3是一系列基于Transformer结构的大型多语言模型,通过优化数据质量、训练规模和模型架构,旨在提升模型在各种语言理解任务中的表现。通过引入更优质的数据和更高效的训练方法,Llama3展示了在自然语言处理领域的巨大潜力。其创新点…

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

本次研讨会经纬恒润将结合业务团队多年来在SOA架构开发和工具实施领域的项目实践经验,分享探讨SOA趋势下先进的整车EE架构开发模式,聚焦在SOA开发难点分析、开发阶段划分、开发工具链的适配与应用等内容。9月26日,我们在直播间期待您的参与! 面向服务的架构(Service…

服务的UUID

1. UUID 广播数据中,一般会包含一个UUID列表,用以展示自己支持的服务。但是GAP和GATT服务的UUID不能加到广播中。广播包中可以根据自身情况包含一部分服务的UUID或者包含所有服务的UUID。部分服务的UUID列表和完整的UUID列表只能包含一个。 什么情况下包含部分UUID?广播数据…