手写mybatis之创建简单的映射器代理工厂

news/2024/12/22 9:05:50/

前言


我们使用 JDBC 的时候,需要手动建立数据库链接、编码 SQL 语句、执行数据库操作、自己封装返回结果等。但在使用 ORM 框架后,只需要通过简单配置即可对定义的 DAO 接口进行数据库的操作了。
我们就来解决 ORM 框架第一个关联对象接口和映射类的问题,把 DAO 接口使用代理类,包装映射操作。
设计一个 ORM 框架的过程中,首先要考虑怎么把用户定义的数据库操作接口、xml配置的SQL语句、数据库三者联系起来。其实最适合的操作就是使用代理的方式进行处理,因为代理可以封装一个复杂的流程为接口对象的实现类
在这里插入图片描述
以下是实战部分

public class MapperProxy<T> implements InvocationHandler, Serializable {private Map<String, String> sqlSession;private final Class<T> mapperInterface;public MapperProxy(Map<String, String> sqlSession, Class<T> mapperInterface) {this.sqlSession = sqlSession;this.mapperInterface = mapperInterface;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (Object.class.equals(method.getDeclaringClass())) {return method.invoke(this, args);} else {return "你的被代理了!" + sqlSession.get(mapperInterface.getName() + "." + method.getName());}}
}

注意上述
要注意如果是 Object 提供的 toString、hashCode 等方法是不需要代理执行的,所以添加 Object.class.equals(method.getDeclaringClass()) 判断。
代理类工厂


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

工厂操作相当于把代理的创建给封装起来了,如果不做这层封装,那么每一个创建代理类的操作,都需要自己使用 Proxy.newProxyInstance 进行处理,那么这样的操作方式就显得比较麻烦了。
测试

public interface IUserDao {String queryUserName(String uId);Integer queryUserAge(String uId);}

首先提供一个 DAO 接口,并定义2个接口方法。
编写测试类

public class TestApi {private Logger logger = LoggerFactory.getLogger(TestApi.class);@Testpublic void test01() {MapperProxyFactory<IUserDao> factory = new MapperProxyFactory<>(IUserDao.class);Map<String, String> sqlSession = new HashMap<String, String>();sqlSession.put("com.lm.test.dao.IUserDao.queryUserName", "模拟执行 Mapper.xml 中 SQL 语句的操作:查询用户姓名");sqlSession.put("com.lm.test.dao.IUserDao.queryUserAge", "模拟执行 Mapper.xml 中 SQL 语句的操作:查询用户年龄");IUserDao iUserDao = factory.newInstance(sqlSession);String res = iUserDao.queryUserName("10001");logger.info("测试结果:{}", res);}
}

在这里插入图片描述

好了到这里就结束了手写mybatis之创建简单的映射器代理工厂的学习,大家一定要跟着动手操作起来。需要的源码的 可si我获取;


http://www.ppmy.cn/news/1534876.html

相关文章

MATLAB算法实战应用案例精讲-【数模应用】Kaplan Meier(附MATLAB和R语言代码实现)

目录 几个相关概念 生存分析 (survival analysis) 事件 (event) 生存时间 (survival time) 删失(censoring) 生存函数 (survival function) 算法原理 什么是Kaplan Meier 生存曲线解读 SPSSAU SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案…

R 语言 data.table 大规模数据处理利器

前言 最近从一个 python 下的 anndata 中提取一个特殊处理过的单细胞矩阵&#xff0c;想读入R用来画图&#xff08;个人比较喜欢用R可视化 &#xff09;&#xff0c;保存之后&#xff0c;大概几个G的CSV文件&#xff0c;如果常规方法读入R&#xff0c;花费的时间比较久&#x…

第T2周:TensorFlow实现彩色图片分类(CIFAR10数据集),并实现自己的真实图片分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 加载CIFAR-10数据集进行训练&#xff0c;然后能够对彩色图片进行分类 具体实现&#xff1a; &#xff08;一&#xff09;环境&#xff1a; 语…

Carsim安装记录

打开Carsim的dataBase被自己删掉了&#xff0c;导致车辆类型啥的都不全&#xff0c;没有完整的数据库&#xff0c;遂重装&#xff0c;记录一下安装后的过程 跟着B站UP安装的&#xff0c;安装教程https://www.bilibili.com/video/BV1P54y1274L/?vd_source4fe7704e89d3e1f677aa3…

小程序用户截屏事件

原生小程序&#xff1a; wx.setScreenBrightness({value: 0.5 }); 参数值&#xff1a; value屏幕亮度值&#xff0c;范围 0~1&#xff0c;0 最暗&#xff0c;1 最亮 uniapp&#xff1a; uni.setScreenBrightness({value: 0.5 }); 参数值&#xff1a; value屏幕亮度值&a…

音频驱动视频人物说话的技术路线

音频驱动视频人物说话的技术路线和步骤&#xff1a; 音频驱动视频人物说话的技术路线和步骤 音频驱动视频人物说话是一种涉及多学科交叉的技术&#xff0c;主要用于生成看起来像是视频中人物在说话的合成视频。该技术广泛应用于娱乐、教育、虚拟现实等领域。以下是实现这一技术…

Hive数仓操作(一)

Hive 介绍 Hive 是一个基于 Hadoop 的数据仓库工具&#xff0c;旨在简化大规模数据集的管理和分析。它将结构化数据文件映射为表&#xff0c;并提供类似 SQL 的查询功能。Hive 的数据存储在 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;中&#xff0c;使用 Hive 查询语…

无人化焦炉四大车系统 武汉正向科技 工业机车无人远程控制系统

焦炉四大车无人化系统介绍 采用格雷母线光编码尺双冗余定位技术&#xff0c;炉门视觉定位自学习技术&#xff0c;wifi5G无线通讯技术&#xff0c;激光雷达安全识别技术&#xff0c;焦化智慧调度&#xff0c;手机APP监控功能。 焦炉四大车无人化系统功能 该系统能自动生成生产…