先抛出一个问题,用过Mybatis的都知道,我们只需要定义一个Dao的接口,在里面写上一些CRUD相关操作,然后配置一下sql映射文件,就可以达到调用接口中的方法,然后执行sql语句的效果,为什么呢?我们并没有具体的CRUD操作的实现类啊?

前面说到得到SqlSessionFactory对象,得到SqlSessionFactory是为了得到sqlSession,。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。你可以用SqlSession实例来直接执行已映射的SQL语句。

String configure = "com/mybatis/test/mybatis-configure.xml";
InputStream res = SqlSessionTest.class.getClassLoader().getResourceAsStream(configure);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(res);
SqlSession session = ssf.openSession();
 
AuthUserDao mapper = session.getMapper(AuthUserDao.class);
AuthUser authUser = mapper.selectAuthUserByName("root");

我们通过SqlSession session = ssf.openSession(); 得到SqlSession之后,就可以用来执行配置在映射文件的sql了。

上面的代码中通过 session.getMapper(AuthUserDao.class)  来加载sql映射文件中的sql语句。并且执行这些sql语句。往里面看代码,开头的答案揭晓了,这就是Java动态代理类。

先介绍一下java提供一种动态代理类。可以实现类似于AOP之类的思想,就是在我们执行某个接口之前,同时执行我们相关的代码。一个简单的例子就是我们在执行某个接口之前,打印日志。下面是写的一个简单的例子。

DynaProxyHandler.java:

/**
 *
 * @author yinzi.zhu_C
 */
public class DynaProxyHandler implements InvocationHandler{
 
    private Object target;
 
    public DynaProxyHandler(Object target) {
        this.target = target;
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("模拟打印日志");
        return method.invoke(target, args);
    }
 
}

ProxyFactory.java

public static Object getProxy(Object target){
    return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new DynaProxyHandler(target));
}

IPerson、 personImpl分别为接口和实现类。只有一个speak(String msg)方法。

ProxyTest.java

public class ProxyTest {
    public static void main(String[] args) {
        DynaProxyHandler handler = new DynaProxyHandler(new PersonImpl());
        IPerson person = (IPerson) ProxyFactory.getProxy(new PersonImpl());
        person.speak("Hello world");
    }
}

运行结果为:

模拟打印日志!
person speak: Hello world

看,这就是Java当中的动态代理类,我们只需要实现InvocationHandler接口。然后当我们执行目标类的方法时,掺杂上我们要做的事情。实现类似AOP的效果。

回到Mybatis,其实Mybatis也是通过代理类来实现我们只执行接口当中的方法,就达到执行sql映射文件中的sql语句的效果。

转载于:https://www.cnblogs.com/atio/p/3384623.html

初看Mybatis 源码 (二) Java动态代理类相关推荐

  1. JDK1.8源码(二)——java.lang.Integer 类

    上一篇博客我们介绍了 java.lang 包下的 Object 类,那么本篇博客接着介绍该包下的另一个类 Integer.在前面 浅谈 Integer 类 博客中我们主要介绍了 Integer 类 和 ...

  2. 面试有没有看过spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天...

    原标题:如何看Spring源码.Java每日六道面试分享,打卡第二天 想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框 ...

  3. Retrofit2 源码解析之动态代理

    基于 Retrofit 2.3.0 & Android 8.1 分析 Java 动态代理在 Android 上的实现 未经允许不得转载 Retrofit 使用示例 public interfa ...

  4. Java动态代理类使用

    Java动态代理类使用 Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: 一.Interface InvocationHandler:该接口中仅定义了一个方法O ...

  5. Spring AOP源码解析——AOP动态代理原理和实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...

  6. JDK1.8源码(三)——java.lang.String 类

    String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...

  7. java.util 1.8_JDK1.8源码(四)——java.util.Arrays 类

    java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList public static ...

  8. JDK1.8源码(六)——java.util.LinkedList 类

    上一篇博客我们介绍了List集合的一种典型实现 ArrayList,我们知道 ArrayList 是由数组构成的,本篇博客我们介绍 List 集合的另一种典型实现 LinkedList,这是一个由链表 ...

  9. spring事务源码分析结合mybatis源码(二)

    让我们继续上篇,分析下如果有第二个调用进入的过程. 代码部分主要是下面这个: if (isExistingTransaction(transaction)) {return handleExistin ...

最新文章

  1. CondaHTTPError: HTTP 404 NOT FOUND for url https://pypi.tuna.tsinghua.edu.cn/simple/ 错误
  2. CVPR 2013 录用论文(目标跟踪部分)
  3. android 勿扰模式代码,android Lollipop勿扰模式
  4. jupyter 方框 汉字,jupyter画图中文显示乱码问题解决办法
  5. 2021 年 CNCF 和开源速度的年终报告
  6. mysql 去重复屈居_mysql去重复关键字distinct的用法
  7. 蔚来汽车股票一日成交额达274亿美元 居美股榜首
  8. EasyUi-1 拖放
  9. pickerView的简单使用
  10. 巨头不想再将“命脉”交给微信、支付宝
  11. 自适应滤波器(二)NLMS自适应滤波器
  12. 第3章 IP地址规划技术
  13. JavaScript --------WebS APIs学习之网页特效(offset系列)
  14. Windows编程 Windows程序的生与死(上)
  15. 八、python爬虫伪装 [免费伪装ip伪装请求头]
  16. 解决Android SDK Manager无法更新下载 - 猪悟能 - 博客园 (cnblogs.com)
  17. Threejs实现宇宙中地球动态展示和卫星绕地运动
  18. VC获取系统空闲时间
  19. 工厂模式在iOS开发中的实际应用
  20. 华为PIM-SM 动态RP实验配置

热门文章

  1. 网络营销——网络营销专员如何做好网站外链优化工作?
  2. 网站建设前的准备工作你了解多少?
  3. apache 查看本地页面_GeoSever的页面实现
  4. dell台式机进入安全模式_华为发布首款商用台式机,商用PC市场再掀变革?
  5. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解
  6. 简单的PHP和MYSQL做投票系统_php mysql简单投票系统
  7. centos 如何登陆mysql_[CentOS 0010] CentOS 配置mysql允许远程登录
  8. mac os10.11上使用proxychains
  9. 5G信令(就是用户身份信息)——手机开机后,先从USIM中读取之前运营商分配的临时身份信息GUTI/TMSI,发送携带该身份信息的信令给基站,请求接入运营商网络。...
  10. Greenplum——升级的分布式PostgresSQL