MyBatis源码解析【8】简单demo理解接口式编程
前言
这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客
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理解接口式编程的更多相关文章
- Mybatis源码解析-MapperRegistry代理注册mapper接口
知识储备 SqlsessionFactory-mybatis持久层操作数据的前提,具体的解析是通过SqlSessionFactoryBean生成的,可见>>>Spring mybat ...
- Mybatis源码解析(一) —— mybatis与Spring是如何整合的?
Mybatis源码解析(一) -- mybatis与Spring是如何整合的? 从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
- Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取
在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao ...
- Mybatis源码解析(二) —— 加载 Configuration
Mybatis源码解析(二) -- 加载 Configuration 正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...
- Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别
XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...
- mybatis源码-解析配置文件(三)之配置文件Configuration解析
目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...
- Mybatis源码解析,一步一步从浅入深(一):创建准备工程
Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...
- Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码
在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...
随机推荐
- 哪些人才适合转行学习UI设计?
最近有很多学员问,怎么才知道自己适不适合学习UI设计,在从事IT教育行业多年以来,也确实碰到好多人咨询这个问题,今天就和大家说下,哪些人才适合转行学习UI设计?(转行必看) 1 平面设计师.网页设计师 ...
- CDH 安装
CDH 安装 市场上免费大数据框架主要有三个版本,原生的 Apache 版本,Cloudera(https://www.cloudera.com/) 公司研发的(Cloudera Distributi ...
- Java的 volatile关键字的底层实现原理
我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用.本文详细解读一下volat ...
- 【Node.js】安装及使用
Node.js是在Chrome的V8 JavaScript引擎上构建的JavaScript运行时.Node.js使用事件驱动的非阻塞I / O模型,使其轻量且高效.Node.js的软件包生态系统npm ...
- merge and saveorupdate
首先 saveOrUpdate返回void 也就是什么都不返回 而merge会返回一个对象 merge 在执行session.merge(a)代码后,a对象仍然不是持久化状态,a对象仍然不会被关联到S ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第2周课上测试总结
20175316 2018-2019-2 <Java程序设计>第2周课上测试总结 上周考试题目总结 题目1 题目要求: 在Ubuntu中用自己的有位学号建一个文件,教材p29 Exampl ...
- Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)
目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...
- 05-使用jQuery操作input的value值
表单控件是我们的重中之重,因为一旦牵扯到数据交互,离不开form表单的使用,比如用户的注册登录功能等 那么通过上节知识点我们了解到,我们在使用jquery方法操作表单控件的方法: $(selector ...
- [solution] JZOJ-5458 质数
[solution] JZOJ-5458 质数 题面 Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X ...
- 11-22 ArrayList
自己定义一个类 public class Student{ public String name; //属性 public void fangfa(){ //方法 } } 在另一个java文件里可以调 ...