mapper是比较神奇的东西,通过一个接口,不写实现类,就可以完成sql语句的执行。

通过对jdk的动态代理进行学习,开始明白了其中的原理。

一个demo:

文件1:Subject.java 对应的就是XxMapper.java

public interface Subject {
void hello(String name);
}

文件2:SubjectProxy.java 对应的就是 MapperProxy.java

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class SubjectProxy implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("hello world " + args[0]);
// System.out.println(method.getDeclaringClass().getName()+"."+method.getName());
return null;
}
}

文件3:Client.java 对应的就是 平时使用XxMapper接口的地方

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
SubjectProxy proxy = new SubjectProxy();
Subject sub = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class}, proxy);
sub.hello("kitty");
}
}

执行结果:

---------------------------------------------------------------------
再SpringBoot中,Spring框架会自动生成Mapper的代理,是MapperProxy<T>的实例,
其中的invoke方法会拦截,对mapper.方法的调用。
然后会执行关键代码:
MapperMethod mapperMethod = this.cachedMapperMethod(method);
return mapperMethod.execute(this.sqlSession, args);

因为Mapper接口的包名,和XxMapper.xml的命名空间一致,
Mapper接口中的方法名称又和,XxMapper.xml中的sql的id一致,
在MapperProxy中,又会把调用mapper接口的参数也拿到;
于是在MapperMethod实例中,其实就是通过sqlSession对,数据库进行操作了。用到的是命令模式。

---------------------------------------------------------------------

大概也就是这个样子了,原来最终Mapper接口都没有实例。对动态代理也有一点点失望,失望来自于误解,
还以为会自动,的生成Mapper的实现,谁知只是张冠李戴。

最新文章

  1. ZeroMQ接口函数之 :zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据
  2. BIEE 10g 二次开发整理
  3. Face++ – 提供给你实时的脸部识别 API
  4. 设计模式总结篇系列:观察者模式(Observer)
  5. 【Ext.Net学习笔记】04:Ext.Net中使用数据、Ext.Net Store的用法、Ext.Net ComboBox用法
  6. python中如何将str转换成dict
  7. C++_Eigen函数库用法笔记——Block Operations
  8. DbUtils使用时抛出Cannot get a connection
  9. How to fix “The program can’t start because MSVCR110.dll is missing from your computer.” error on Windows
  10. Delphi笔记(GL_Scene安装及简单使用)
  11. .net的页面在大并发下偶尔出现503错误
  12. iptables 简单配置
  13. 【高德地图API】从零开始学高德JS API(六)——坐标转换
  14. VS2012编译LibZip库
  15. JS双击div编辑文本内容
  16. python之路--线程的其他方法
  17. Hyperledger Fabric密码模块系列之BCCSP(四)
  18. 后台返回xml格式转json
  19. 解决输入git branch 进入编辑状态,mac下出现END,无法返回
  20. Docker学习链接

热门文章

  1. C/C++网络编程9——多进程服务器端实现
  2. mysql事务隔离分析
  3. Myeclipse创建HTML文件中文显示乱码问题
  4. 七 Struts2访问Servlet的API方式二:原生方式
  5. C++结构体struct与C语⾔结构体和C++引⽤&amp;与传值的区别
  6. A*算法和K短路(A*)
  7. Python学习笔记011
  8. 大数据萌新的Python学习之路(一)
  9. myBatis 操作 mysql时,使用 like 关键进行模糊查询的方法
  10. ROS学习笔记4-创建一个ROS包