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

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

一个demo:

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

  1. public interface Subject {
  2. void hello(String name);
  3. }

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

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3.  
  4. public class SubjectProxy implements InvocationHandler {
  5. @Override
  6. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  7. System.out.println("hello world " + args[0]);
  8. // System.out.println(method.getDeclaringClass().getName()+"."+method.getName());
  9. return null;
  10. }
  11. }

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

  1. import java.lang.reflect.Proxy;
  2.  
  3. public class Client {
  4. public static void main(String[] args) {
  5. SubjectProxy proxy = new SubjectProxy();
  6. Subject sub = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class}, proxy);
  7. sub.hello("kitty");
  8. }
  9. }

执行结果:

---------------------------------------------------------------------
再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的实现,谁知只是张冠李戴。

mybatis#mapper原理的更多相关文章

  1. Mybatis的原理分析1(@Mapper是如何生效的)

    接着我们上次说的SpringBoot自动加载原理.我们大概明白了在maven中引入mybatis后,这个模块是如下加载的. 可能会有人问了,一般我们的dao层都是通过Mapper接口+Mapper.x ...

  2. MyBatis工作原理

    Mybatis工作原理: 我们的应用程序通过mybatis提供的api,增删改查方法来访问数据库,api底层调用了jdbc ,只不过mybatis对jdbc的封装是不完全封装,里面的sql语句需要我们 ...

  3. Mybatis Mapper接口是如何找到实现类的-源码分析

    KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Map ...

  4. Mybatis的原理与JVM内存结构(面试题)

    Mybatis的原理 1.Mapper 接口在初始SQL SessionFactory注册的 2.Mapper 接口注册在名为MapperRegistry类的 HasMap中 key=Mapper c ...

  5. 面试官:你分析过mybatis工作原理吗?

    Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...

  6. 【转】MaBatis学习---源码分析MyBatis缓存原理

    [原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...

  7. 深入理解MyBatis的原理:整个体系

    前言:工作中虽然用到了 MyBatis,可完全不知道为什么,再不学习就晚了,这里将记录我的学习笔记,整个 MyBatis 的体系. 一.简介 1.传统的JDBC JDBC 是一种典型的桥接模式. 使用 ...

  8. 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解

    深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...

  9. SpringBoot集成MyBatis底层原理及简易实现

    MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理.完整代码可移步Github. 如何使用MyBatis 一般情况下,我们在Sp ...

随机推荐

  1. ios APP进程杀死之后和APP在后台接收到推送点击跳转到任意界面处理

    https://www.jianshu.com/p/ce0dc53eb627 https://www.cnblogs.com/er-dai-ma-nong/p/5584724.html github: ...

  2. asp.net core配置下载文件

    asp.net core的wwwroot文件夹下默认时保存静态文件的地方,外面可以直接访问,但是如果是一些无法识别的后缀文件,如(.apk),会报错404 如果想要实现下载这些文件,在配置静态文件中间 ...

  3. IDEA中使用Lombok插件简化实体类的编写

    版本:IDEA Community 2019.2.2 流程:安装lombok插件并安装,重启=>在pom文件中加入 <dependency> <groupId>org.p ...

  4. Linux centosVMware 告警系统主脚本、告警系统配置文件、告警系统负载脚本、告警系统502日志脚本、告警系统disk监控脚本、告警系统邮件引擎

    一.告警系统主脚本 要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件. 程序架构 ...

  5. 莫烦 - Pytorch学习笔记 [ 一 ]

    1. Numpy VS Torch #相互转换 np_data = torch_data.numpy() torch_data = torch.from_numpy(np_data) #abs dat ...

  6. ImagePullBackOff 错误处理

    kubectl create -f nginx-deployment.yaml 执行之后,kubectl get pods 一致出现 ImagePullBackOff,一直无法执行成功. yaml文件 ...

  7. 在Windows中实现Java调用DLL(转载)

    本文提供调用本地 C 代码的 Java 代码示例,包括传递和返回某些常用的数据类型.本地方法包含在特定于平台的可执行文件中.就本文中的示例而言,本地方法包含在 Windows 32 位动态链接库 (D ...

  8. iOS项目Info.plist中关键字汇总

    1. Application does not run in background (键名:UIApplicationExistsOnSuspend) 自从iOS4.0之后,当你在应用程序执行的时候按 ...

  9. 洛谷 P6046 [CTSC2000]快乐的蜜月

    先讲解一下如何处理这道题的毒瘤输入.\(m\) 和 \(d\) 之间的"/"和" TO "都可以用 getchar() 强行吃掉,日期的转换可以用公式 \(s_ ...

  10. 配置<welcome-file>为自定义路径

    welcome-file是web.xml中的一个配置,其作用是配置启动项目时默认跳转的欢迎页面,一般我们会将其指定为一个静态页面. 那如果我们要将自定义的请求路径作为欢迎页面该怎么做呢? 1.配置we ...