前言

这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客

http://www.cnblogs.com/linkstar/category/1027239.html

上一次我们经过源码的阅读已经对整个所有的MyBatis执行的流程全部走了一遍。

也对之前提出的一些问题做了解释。

这一次我们用最简单的几个类来简单的模拟一下整个过程。

让整个结构更加的清晰。

构建Demo

首先模拟数据访问层的基本逻辑,简化了SqlSessionFactory的建立

/**
* 模拟数据访问层代码
* @author LinkinStar
*
*/
public class Dao {

public static void main(String[] args) {
        //1、工厂建立:读取xml配置文件并加载
        //2、通过工厂获取产品sqlSession
        SqlSession sqlSession = new SqlSession();
        //3、通过getMapper创建代理类
        IDemo demo = sqlSession.getMapper(IDemo.class);
        //4、执行接口对应的方法,会直接走代理类的invoke方法
        ResultDemo result = demo.getResult(1);
        //5、打印返回结果
        System.out.println(result.getId());
        System.out.println(result.getValue());
    }

}

然后模拟出我们的调用的没有实现类的接口,以及我们的返回值

/**
* 模拟我们实际中Dao层的接口
* @author LinkinStar
*
*/
public interface IDemo {

public ResultDemo getResult(int id);
}

/**
* 模拟返回值
* @author LinkinStar
*
*/
public class ResultDemo {

private int id;
    private String value;
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the value
     */
    public String getValue() {
        return value;
    }
    /**
     * @param value the value to set
     */
    public void setValue(String value) {
        this.value = value;
    }
}

然后模拟出SqlSession调用newProxyInstance将代理类绑定,然后返回代理实例。其中简化了从代理工厂获取代理类的过程。

/**
* 模拟SqlSession
* @author LinkinStar
*
*/
public class SqlSession {
    @SuppressWarnings("unchecked")
    public <T> T getMapper(Class<T> type){
        //1、通过代理工厂,利用传入的类型获取对应的代理类(这边模拟时直接new MapperProxy())
        //2、通过代理类和传入的类型创建代理实例返回出去
        return (T) Proxy.newProxyInstance(type.getClassLoader(), new Class<?>[]{type}, new MapperProxy());
    }
}

最后模拟代理类执行最终的sql逻辑,并返回结果。其中简化了接口参数的获取,sql类型的判断和返回结果的判断。

/**
* 模拟代理类
* @author LinkinStar
*
*/
public class MapperProxy implements InvocationHandler{

@Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1、根据传入的接口信息,这里method的方法找到需要执行的sql语句(接口类全名 + 方法名 = 配置文件中的namespace + 执行sql的id)
        //2、获取对应sql执行的类型,以及获取sql返回参数的类型
        //3、调用sqlSession对应的增删改查方法 , 执行sql语句返回结果
        System.out.println("接口执行的对应方法是: " + method.getName());
        ResultDemo resultDemo = new ResultDemo();
        resultDemo.setId(101);
        resultDemo.setValue("测试返回结果");
        return resultDemo;
    }

}

最后直接运行Dao测试就能看见输出的结果了。

总结

这个例子已经把最精炼的地方都提取出来了,当你看懂这个例子了之后再去回头看一看源码,应该就能更好的理解源码里面是如何做的了。

还有一些细节上面的地方做了简化,你也可以慢慢的增加这些模拟的细节,最后能越来越接近源码的样子。

当你能随手写出这样的设计模式和代码的时候,那么相信读源码的意义也就达到了。

MyBatis源码解析【8】简单demo理解接口式编程的更多相关文章

  1. Mybatis源码解析-MapperRegistry代理注册mapper接口

    知识储备 SqlsessionFactory-mybatis持久层操作数据的前提,具体的解析是通过SqlSessionFactoryBean生成的,可见>>>Spring mybat ...

  2. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  3. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  4. Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取

    在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao ...

  5. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  6. Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别

    XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...

  7. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  8. Mybatis源码解析,一步一步从浅入深(一):创建准备工程

    Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...

  9. Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码

    在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...

随机推荐

  1. ubuntu桌面环境安装中文环境

    apt install language-pack-zh-hans* language-pack-gnome-zh-hans* language-pack-kde-zh-hans* apt insta ...

  2. spring mvc mybatis shiro构建cms系统ios android

    开发语言: java.ios.android 部署平台: linux.window jdk版本:JDK1.7以上版本 开发工具: eclipse.idea等 服务器中间件:Tomcat 6.7.Jbo ...

  3. Hadoop 系列(三)Java API

    Hadoop 系列(三)Java API <dependency> <groupId>org.apache.hadoop</groupId> <artifac ...

  4. hadoop 有那些发行版本

    hadoop发行版本 1. apache hadoop  http://hadoop.apache.org/ 2. cloudera hadoop(CDH) https://www.cloudera. ...

  5. s4 Docker 网络1

    网络基础 Docker Network 单机网络 Bridge Network Host Network None Network 多机网络:overlay Network 网络的分层 公有IP和私有 ...

  6. C++中的return和exit区别

    在main函数中,return和exit经常混用,两者的一个区别:return会执行statck unwinding,而exit不会.如果触发了信号,exit也同样不会做stack unwinding ...

  7. 向Word添加一段文本

    文档层次结构 [段落之后] 是一段连续文本,它定义具有一组常见属性的文本区域.一段连续文本由 r 元素表示,这样创建器便可组合换行.样式或格式设置属性,从而将相同信息应用于一段连续文本的所有部分. 正 ...

  8. day14_雷神_前端02

    # 前端day02 1. html标签 1. span标签设置宽高 设置宽高后,字体不会发生变化. 2. 盒模型 padding是border里面的距离: margin 是border边框外头的了属于 ...

  9. iOS 10 应用内跳转到系统设置

    在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...

  10. WCF双工通信单工通信

    1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...