先抛出一个问题,用过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语句的效果。

初看Mybatis 源码 (二) Java动态代理类的更多相关文章

  1. Mybatis源码解析(三) —— Mapper代理类的生成

    Mybatis源码解析(三) -- Mapper代理类的生成   在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...

  2. 初看Mybatis 源码 (三) SQL是怎么执行的

    前面说到Java动态代理,Mybatis通过这种方式实现了我们通过getMapper方式得到的Dao接口,可以直接通过接口的没有实现的方法来执行sql. AuthUserDao mapper = se ...

  3. 从Mybatis源码理解jdk动态代理默认调用invoke方法

    一.背景最近在工作之余,把开mybatis的源码看了下,决定自己手写个简单版的.实现核心的功能即可.写完之后,执行了一下,正巧在mybatis对Mapper接口的动态代理这个核心代码这边发现一个问题. ...

  4. mybatis源码阅读(动态代理)

    这一篇文章主要是记录Mybatis的动态代理学习成果,如果对源码感兴趣,可以看一下上篇文章  https://www.cnblogs.com/ChoviWu/p/10118051.html 阅读本篇的 ...

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

    一.初识 1.介绍 int 是Java八大基本数据类型之一,占据 4 个字节,范围是 -2^31~2^31 - 1,即 -2147483648~2147483647.而 Integer 是 int 包 ...

  6. mybatis源码学习: 动态代理的应用(慢慢改)

    动态代理概述 在学spring的时候知道使用动态代理实现aop,入门的列子:需要计算所有方法的调用时间.可以每个方法开始和结束都获取当前时间咋办呢.类似这样: long current=system. ...

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

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

  8. 初看Mybatis 源码 (一)

    Mybatis 的使用,首先需要构建一个SqlSessionFactory 实例.而该实例可以通过SqlSessionFactoryBuilder来创建. String resource = &quo ...

  9. Mybatis-简单基于源码了解获取动态代理对象

    这是我们要测试的代码 OderDao就是我们要需要获取的对象. 首先我们根据传入的参数,进入SqlSessionFactoryBuilder 中的对应的build 方法,第一步创键XMLConfigB ...

随机推荐

  1. IDEA 中 使用 git(Git)

    GitLab GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.安装方法是参考GitLab在GitHub上的Wiki页面. Git Git( ...

  2. Qt 学习之路 2(24):Qt 绘制系统简介

    Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于Q ...

  3. P3613 睡觉困难综合征(码力)

    Luogu3613 实现细节较多,详见代码 #include<cstdio> #include<iostream> #include<cstring> #inclu ...

  4. poj2001 Shortest Prefixes(字典树)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21642   Accepted: 926 ...

  5. js最后深入总结

    js常用事件: click  #点击事件 hover #鼠标漂浮事件,,鼠标移到上面就触发事件 blur  #失去焦点就触发事件,多用于文本框操作 focus  #获得焦点就触发事件, change ...

  6. XtraFinder

    About System Integrity Protection in OS X 10.11 Apple's article . System Integrity Protection blocks ...

  7. 7.Hibernate 检索

    1.Hibernate检索方式 检索方式简介: 导航对象图检索方式:根据已经加载的对象,导航到其他对象.OID检索方式:按照对象的OID来检索对象.Session 的 get() 和 load() 方 ...

  8. vue(5)联动+tab页

    来自:https://juejin.im/post/5a0c191f6fb9a04514639419 1.联动 新增 <input v-model="msg" /> & ...

  9. Android 中实现分享和第三方登陆---以新浪微博为例

    第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不 ...

  10. 使用require.js

    requirejs使用入门 什么是requirejs? RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代码,但其主要 ...