MyBatis接口的简单实现原理

用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用?

那是因为MyBatis使用Java动态代理实现的接口。

这里仅仅举个简单例子来说明原理,不是完全针对MyBatis的,这种思想我们也可以应用在其他地方。

定义一个接口

public interface MethodInterface {String helloWorld();
}

实现动态代理接口

public class MethodProxy<T> implements InvocationHandler { private Class<T> methodInterface; public MethodProxy(Class<T> methodInterface) { this.methodInterface = methodInterface; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("========================="); System.out.println("方法名:" + method.getName()); //针对不同的方法进行不同的操作 return null; } }

这里针对invoke方法简单说说MyBatis的实现原理,在该方法中,我们通过Method能够获取接口和方法名,接口的全名相当于MyBatis XML中的namespace,方法名相当于具体一个方法中的id。也就是说通过动态代理后,可以通过SqlSession来通过namespace.id方式来调用相应的方法。使用接口更方便,但是是一种间接的方式。

动态代理工厂类

public class MethodProxyFactory {public static <T> T newInstance(Class<T> methodInterface) { final MethodProxy<T> methodProxy = new MethodProxy<T>(methodInterface); return (T) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), new Class[]{methodInterface}, methodProxy); } }

通过该工厂类可以生成任意接口的动态代理类。

测试

MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.class);
method.helloWorld();

可以看到MethodInterface没有实现类也可以执行。

总结

一般谈到动态代理我们通常的用法都是处理事务、日志或者记录方法执行效率等方面的应用。都是对实现类方法的前置或者后置的特殊处理。

通过本文,其实可以看到另一种应用方向,那就是不需要实现类,直接通过动态代理执行接口方法,MyBatis使用这种方式方便了我们调用方法,利用这种思路我们也许可以在别的方面做出一些更好的设计。

MyBatis接口的简单实现原理相关推荐

  1. 细说Mybatis一级缓存、二级缓存以及mybatis获取mapper的面向接口编程思想(Mapper接口动态代理实现原理)(二)

    上一章和大家分享了Mybatis一级缓存和二级缓存,本章将继续和大家分享Mapper接口动态代理实现原理,按照国际惯例,先看源码,然后结合原理,写一个自己的小demo,从理论到实战,真正掌握面向接口编 ...

  2. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  3. Java MyBatis的介绍及其执行原理

    写在前面 ??MyBatis学习 ??今天我们进行MyBatis框架的学习,认识MyBatis及其执行原理,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!! 如果觉得博主文章还不错,可 ...

  4. mybatis 的懒加载原理

    断断续续的阅读 mybatis 的源码有好几个月了,想把自己了解到的一些东西与大家分享.今天给大家分享一下 mybatis 的懒加载原理. mybatis 的懒加载过程挺复杂的,涉及到的东西有很多,包 ...

  5. (转)简单代码生成器原理剖析(二)

    原文地址:http://www.cnblogs.com/OceanEyes/archive/2012/03/08/codebuilder.html 上篇<简单代码生成器原理剖析(一)>分析 ...

  6. MyBatis接口代理

    MyBatis接口代理: 采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是目前的主流方式. Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由 ...

  7. MyBatis 接口绑定方案及多参数传递、动态 SQL、ThreadLocal、缓存

    一.MyBatis 接口绑定方案及多参数传递 作用:实现创建一个接口后把mapper.xml由mybatis 生成接口的实现 类,通过调用接口对象就可以获取 mapper.xml 中编写的 sql. ...

  8. 微信小程序+SpringBoot+mybatis+MySQL实现简单的登录

    微信小程序+SpringBoot+mybatis+MySQL实现简单的登录 当下微信小程序和springboot都是比较火的.今天我们来用springboot和微信小程序来实现简单的登录. 1.首先来 ...

  9. mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数

    mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...

最新文章

  1. 一篇文章让你了解智能合约以及和区块链的关系
  2. Sql2000命名中的’_’好象会引发问题
  3. vue 原型设计 拖拽_Vue 也能实现拖拽了 (vue-dragging)
  4. object picker 微信小程序_微信小程序 demo分享
  5. python快乐数字怎么表达_Python经典面试题:这些面试题你会了吗?
  6. Linux常用命令(1)
  7. [Node.js] mySQL数据库 -- 英雄英雄管理系统接口
  8. 别停特斯拉旁边!特斯拉车辆自燃全车烧毁 连旁边的奥迪都没放过...
  9. 现在为什么没有人再提“以厂为家”这样的词语啦?
  10. MySQL 常用工具sysbench/fio/tpcc等测试
  11. WinForm高级控件实例--职员信息登记
  12. .NET数据访问是否采用ORM(自译)
  13. cocos2dx截整屏、截部分屏
  14. 构建人人网社会化推荐引擎
  15. 怎么用计算机表示素数,在线质数(素数)计算器
  16. 亨嘉之会话数据行业未来 万字长文解码2021数据技术嘉年华
  17. cesium调整倾斜摄影位置(高度,平移,旋转,缩放)(cesium篇.17)
  18. Java环境配置 win10教程
  19. 冰羚 example-icedelivery-README.md翻译
  20. 2017年Gartner的数据防泄漏(DLP)魔力象限(Magic Quadrant)

热门文章

  1. 创建型模式--单例模式
  2. linux学习第三天 (Linux就该这么学)
  3. LeetCode 75. 颜色分类(Sort Colors)
  4. redhat6.4 添加yum本地源和安装virtualbox增强组件
  5. 《Linux内核分析》实验一
  6. 2-2 LU crout 分解
  7. WIN7下回收站不小心删除的文件怎么恢复,免费数据恢复软件下载
  8. sql 存储过程 分页
  9. C#线程系列(3):线程池和文件下载服务器
  10. 智能ABC拼音输入法的“秘密”