type
status
date
slug
summary
tags
category
icon
password
AI summary
一、设计
思考:用户自定义的数据库接口,是怎么和配置的xml文件,数据库三者联合起来的,最简单的方法就是代理模式,生成代理对象执行数据库操作。设计图如下:
IUserDao:用户自定义的数据库接口
MapperProxyFactory:获取代理对象
MapperProxy:代理对象进行数据库的操作
二、实现
目前这个 Mybatis 框架的代理操作实现的还只是最核心的功能,相当于是光屁股的娃娃,还没有添加衣服。不过这样渐进式的实现可以让大家先了解到最核心的内容,后续我们在陆续的完善。
MapperProxy 负责实现 InvocationHandler 接口的 invoke 方法,最终所有的实际调用都会调用到这个方法包装的逻辑。
MapperProxyFactory 是对 MapperProxy 的包装,对外提供实例化对象的操作。当我们后面开始给每个操作数据库的接口映射器注册代理的时候,就需要使用到这个工厂类了。
2.1代码结构
2.2映射器类
通过实现 InvocationHandler#invoke 代理类接口,封装操作逻辑的方式,对外接口提供数据库操作对象。
目前我们这里只是简单的封装了一个 sqlSession 的 Map 对象,你可以想象成所有的数据库语句操作,都是通过接口名称+方法名称作为key,操作作为逻辑的方式进行使用的。那么在反射调用中则获取对应的操作直接执行并返回结果即可。当然这还只是最核心的简化流程,后续不断补充内容后,会看到对数据库的操作
另外这里要注意如果是 Object 提供的 toString、hashCode 等方法是不需要代理执行的,所以添加 Object.class.equals(method.getDeclaringClass()) 判断
2.3代理工厂类
使用jdk动态代理,生成代理对象
3.、测试
用户自定义的数据库接口
ApiTest
结果:
从结果来看,我们自定义的接口已经被代理成功了,代理对象替我们做后续数据库操作
4、总结
本章节我们初步对 Mybatis 框架中的数据库 DAO 操作接口和映射器通过代理类的方式进行链接,这一步也是 ORM 框架里非常核心的部分
- 作者:IT小舟
- 链接:https://codegym.top/article/%E3%80%90%E6%89%8B%E5%86%99Mybatis%E3%80%91step01%EF%BC%9A%E5%88%9B%E5%BB%BA%E7%AE%80%E5%8D%95%E7%9A%84%E4%BB%A3%E7%90%86%E5%B7%A5%E5%8E%82
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。