映射器代理工厂

我们在使用Mybatis时,只需要写Mapper和Dao接口就行,使用的时候只需要调用Dao中的方法就能完成数据的增删改查。那么Dao中的方法是谁实现的呢?难道Mybatis自动帮我们写了一个Dao的实现类吗?非也!而是使用了映射器代理工厂来实现的。

映射器代理工厂(Mapper Proxy Factory)在Mybatis框架中扮演着至关重要的角色。它是用来创建映射器接口的代理对象的工厂类,通过这个工厂类,可以实现对数据库操作的抽象和简化。映射器代理工厂在Mybatis中的作用是:根据映射器接口(Mapper Interface),动态生成该接口的代理对象。这个代理对象实现了接口中定义的所有方法,并且在方法被调用时,会执行相应的数据库操作。通过这种方式,Mybatis实现了接口与数据库操作之间的解耦,使得开发者只需要定义接口,而无需编写具体的实现类。

MapperProxy

public class MapperProxy<T> implements InvocationHandler {private final Class<T> mapperInterface;public MapperProxy(Class<T> mapperInterface) {this.mapperInterface = mapperInterface;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if("getUserNameById".equals(method.getName())){System.out.println("查询Id为"+args[0]+"的用户名...");return "周杰伦"; // 模拟从执行SQL从数据库中查询数据}if("deleteUserById".equals(method.getName())){System.out.println("删除Id为"+args[0]+"的用户...");System.out.println("成功删除User");}return null;}
}

MapperProxyFactory

public class MapperProxyFactory<T> {private final Class<T> mapperInterface;public MapperProxyFactory(Class<T> mapperInterface) {this.mapperInterface = mapperInterface;}public T newInstance() {final MapperProxy<T> mapperProxy = new MapperProxy<>(mapperInterface);return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy);}}

IUserDao

public interface IUserDao {String getUserNameById(String id);void deleteUserById(String id);
}

Test

public class MainTest {public static void main(String[] args) {MapperProxyFactory<IUserDao> factory = new MapperProxyFactory<>(IUserDao.class);IUserDao iUserDao = factory.newInstance();String name = iUserDao.getUserNameById("123");System.out.println(name);iUserDao.deleteUserById("123");}
}

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

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

相关文章

在 SwiftUI 中实战使用 MapKit API

文章目录 前言新 MapKit API 的引入控制初始地图位置相机位置的双向绑定总结 前言 SwiftUI 与 MapKit 的集成在今年发生了重大变化。在之前的 SwiftUI 版本中&#xff0c;我们将 MKMapView 的基本功能封装到名为 Map 的 SwiftUI 视图中。幸运的是&#xff0c;事情发生了变化&a…

ontape备份跨服务器还原的样例

1. 查看实例备份参数文件 [gbasedbtiZ2ze5s78e4tanwe5q2znxZ ~]$ onstat -g dis Your evaluation license will expire on 2025-05-26 00:00:00 On-Line -- Up 00:00:15 -- 266536 Kbytes There are 1 servers found Server : node1 Server Number : 1 Server Type :…

虚拟环境操作

1、对虚拟环境的操作 查看虚拟环境列表 conda env list 创建虚拟环境 conda create -n 虚拟环境名称 python3.x 激活虚拟环境 conda activate 虚拟环境名称 退出虚拟环境 conda deactivate 删除虚拟环境 conda remove -n 虚拟环境名称 all 2、对虚拟环境下的包的操作…

力扣题解(分割回文串II)

132. 分割回文串 II 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。 返回符合要求的 最少分割次数 思路&#xff1a; 规定dp[i]是以i位置为最后一个元素&#xff0c;&#xff08;0-i&#xff09;的最少分割次数&#xff0c;此…

硅谷并购中的牙刷测试

注&#xff1a;机翻&#xff0c;未校对。 In Silicon Valley, Mergers Must Meet the Toothbrush Test By David Gelles August 17, 2014 9:22 pm Credit Liz Grauman/The New York Times MOUNTAIN VIEW, Calif. — When deciding whether Google should spend millions or …

DP讨论——简单工厂模式

学而时习之&#xff0c;温故而知新。 敌人出招&#xff08;使用场景&#xff09; 不同的业务场景下要创建不同的对象&#xff0c;但是这些对象又有共同的特点。如何复用代码呢&#xff1f;你会想到&#xff0c;这些对象可以抽象出一个基类/抽象类就行了&#xff0c;那么随着业…

docker安装nginx并配置https

参考 docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com) 证书的生成 参见&#xff1a;SpringBoot项目配置HTTPS接口的安全访问&#xff08;openssl配置&#xff09;_配置接口访问-CSDN博客 步骤 1: 拉取Nginx镜像 docker pull nginx 好使的镜像如下&#x…

【AI】目标检测算法【R-CNN:Regions with CNN features】

1. 常用目标检测算法介绍 目标检测是计算机视觉领域的一个重要分支&#xff0c;它旨在识别并定位图像中的各种对象。以下是一些流行的目标检测算法&#xff1a; 1.1 二阶段目标检测算法 R-CNN (Regions with CNN features): 通过选择性搜索算法选取候选区域&#xff0c;然后…

vue3-vite-pinia模板

模板说明 下载 git clone https://github.com/AIxiaoHanBao/vue-template.gitmodule参数 node版本 16 UI组件库 element-plus 持久化 pinia 网络请求 axios 路由 vue-router 使用说明 权限管理目录access资源目录assets组件目录components页面目录pages网络请求目录re…

【AI原理解析】—对抗学习(AL)原理

目录 一、基本原理 二、核心模型 三、对抗性损失函数 四、训练过程 五、对抗学习的优势 六、对抗学习的挑战与解决方案 七、对抗学习的应用 八、未来展望 一、基本原理 对抗学习的核心思想是通过两个模型的相互对抗&#xff0c;使得生成模型&#xff08;Generator&…

AI agents 印象

1、flowise ai 拖拉方式用llm创建AI agents Flowise - Low code LLM Apps Builder GitHub - FlowiseAI/Flowise: Drag & drop UI to build your customized LLM flow 2、coze 也是用拖拉方式&#xff0c;还可以多Agents 引入GPT4,Claude&#xff0c;Gemin最好的模型 3、…

【数学建模】——数学规划模型

目录 一、线性规划&#xff08;Linear Programming&#xff09; 1.1 线性规划的基本概念 1.2 线性规划的图解法 模型建立&#xff1a; 二、整数规划&#xff08;Integer Programming&#xff09; 2.1 整数规划的基本概念 2.2 整数规划的求解方法 三、非线性规划&#x…

LeetCode刷题笔记第3011题:判断一个数组是否可以变为有序

LeetCode刷题笔记第3011题&#xff1a;判断一个数组是否可以变为有序 题目&#xff1a; 想法&#xff1a; 使用冒泡排序进行排序&#xff0c;在判断大小条件时加入判断二进制下数位为1的数目是否相同&#xff0c;相同则可以进行互换。最后遍历数组&#xff0c;相邻两两之间是…

Java中实现一维数组逆序交换的完整解决方案

引言 ❤❤点个关注吧~~编程梦想家&#xff08;大学生版&#xff09;-CSDN博客 在日常编程中&#xff0c;处理数组时经常会遇到需要逆序交换数组元素的情况。逆序交换即是将数组的第一个元素与最后一个元素交换&#xff0c;第二个元素与倒数第二个元素交换&#xff0c;依此类推…

浏览器出现 502 Bad Gateway的原理分析以及解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 此类问题主要作为疑难杂症 1. 问题所示 2. 原理分析 502 Bad Gateway 错误表示服务器作为网关或代理时&#xff0c;从上游服务器收到了无效的响应 通常出现在充当代理或网关的网络服务器上&#xff0c;例如 Nginx、Apache…

【LeetCode】有效的括号

目录 一、题目二、解法完整代码 一、题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 …

聚观早报 | 网宿科技推出边缘AI网关;AMD再收购AI公司

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月12日消息 网宿科技推出边缘AI网关 AMD再收购AI公司 谷歌Pixel 9系列将配超声波指纹 三星Galaxy Z Fold6亮相 …

.Net Core 视图文件编译成DLL

在.NET Core中&#xff0c;视图文件&#xff08;如Razor视图&#xff09;并不直接编译成DLL&#xff08;动态链接库&#xff09;文件&#xff0c;但它们确实会被预编译或编译成中间形式&#xff0c;以便在应用程序运行时能够高效地执行。 对于ASP.NET Core MVC或Razor Pages应…

【HTML入门】第十二课 - iframe框架

在早期没有出现Vue和React之前呢&#xff0c;做管理系统&#xff0c;iframe是非常普遍的技术。比如管理系统左侧有非常多的菜单&#xff0c;然后点击菜单后&#xff0c;右边就要展现不同的页面。 又或者呢&#xff0c;我们看一些网站&#xff0c;他们侧边展示着五彩绚烂的广告&…

Linux C++ 051-设计模式之中介者模式

Linux C 051-设计模式之中介者模式 本节关键字&#xff1a;Linux、C、设计模式、中介者模式 相关库函数&#xff1a; 概念 中介者模式&#xff08;Mediator&#xff09;&#xff0c;又叫调停者模式&#xff0c; 用一个中介对象来封装一系列的对象交互。中介者 使各对象不需要…