首页 > 其他分享 >mybatis的代理技术

mybatis的代理技术

时间:2024-09-19 17:46:34浏览次数:8  
标签:调用 对象 UserMapper 代理 技术 User SQL mybatis

在 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 语句执行的无缝集成。

标签:调用,对象,UserMapper,代理,技术,User,SQL,mybatis
From: https://www.cnblogs.com/zqlmianshi/p/18421063

相关文章

  • mybatis-plus 条件参数说明
     //条件构造器1@TestpublicvoidtestFindWrapper1(){//查询年龄小于25或年龄大于30的人QueryWrapper<Student>queryWrapper=newQueryWrapper<>();queryWrapper.lt("age",25).or().gt("age",30);List<Student>students=studentMapp......
  • 分布式存储技术如何强化企业数字化转型的可靠性与速度?附技术原理及特点
    在信息化、数字化和智能化快速发展的今天,数据已经成为推动经济社会发展的重要资源。随着5G、云计算、大数据、人工智能等技术的不断进步,数据量呈现爆炸式增长。与此同时,企业对数据的需求也日益增加,无论是用于业务分析、决策支持还是创新服务,数据都是不可或缺的。然而数据的快速增长......
  • Post Pretraing 技术解析
    一、问题描述在大模型训练中,后预训练技术(Post-pretraining)通常指的是在模型的初始预训练阶段和最终的微调阶段之间进行的一个额外训练步骤。这个步骤的目的是进一步调整模型,使其能够更好地适应特定领域或任务,同时保持或增强其从大规模预训练数据中学到的通用知识和特征表示。......
  • 解决 AI 算法开发和存储难题,华为云 DTSE 助力文华云技术架构升级
    本文分享自华为云社区《文华云全面技术架构升级,引领智慧教育新未来》,作者:HuaweiCloudDeveloper。本文介绍了华为云DTSE通过AI开发平台ModelArts助力四川文华云教育类应用系统改造上云的案例,DTSE帮助文华云完成了技术架构的全面优化升级,为其在智慧教育领域的数字化和智能化......
  • 阅信云CTO向永清:35岁不应该成为技术职业发展的瓶颈|OceanBase 《DB大咖说》
    本期嘉宾:向永清,2010年进入中国空间技术研究院总体部工作。他从DBA起步,不断成长,后来出来创业,现为阅信云CTO,负责阅信云产品研发和团队管理工作,成为公司的技术领军人物及数字化转型领域的专家。在向永清先生的职业生涯中,始终怀揣着对技术的好奇与热情,他所展现的技术情怀与使命感,为......
  • 对不实现接口的类进行动态代理,用cglib
    CGLIB(CodeGenerationLibrary)是一个强大的、高性能的代码生成库,它用于在运行时生成Java字节码。CGLIB主要用于创建动态代理对象,特别是那些不实现接口的类。与Java反射API提供的动态代理机制不同,CGLIB可以代理具体类,而不仅仅是接口。CGLIB动态代理的原理CGLIB通过继承......
  • 9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案
        面向服务的架构(ServiceOrientedArchitecture,SOA)实施需要复杂的基础技术作为支撑,伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署,将在未来一段时间内成为行业技术研究和市场布局的热点。    近年来,经纬恒润在国内深度开展整车SOA架构的......
  • cgroup技术概述
    cgroup全称是controlgroup,顾名思义,它是用来做“控制”的。控制什么东西呢?当然是资源的使用了。cgroup定义了下面的一系列子系统,每个子系统用于控制某一类资源。CPU子系统,主要限制进程的CPU使用率。cpuacct子系统,可以统计cgroup中的进程的CPU使用报告。cpuset子系统,可......
  • 易优eyoucms网站插入字段长度超过设定的长度,请联系技术处理。
    报错/core/library/think/db/Connection.php第466行左右插入字段长度超过设定的长度,请联系技术处理。[错误代码]SQLSTATE[22001]:Stringdata,righttruncated:1406Datatoolongforcolumn'extract_code'atrow1解决 SQLSTATE[22001]:Stringdata,righttrun......
  • mybatis 通过工厂模式将mapper接口的代理对象注入spring容器中
    MapperFactoryBean是MyBatis框架中用于创建Mapper对象的一个工厂类。getObject方法是该工厂类中的一个关键方法,用于返回实际的Mapper对象。具体来说,MapperFactoryBean通过getObject方法来创建和初始化Mapper接口的实现,从而可以在Spring容器中注入和使用这些Mappe......