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,链接在文章末尾),并实现了一个查询功能 ...
随机推荐
- 49-2015年第6届蓝桥杯Java B组
1.三角形面积 如图1所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何多余内容或说明性文字. image.png 计算方法: 8 * ...
- Egret中使用P2物理引擎
游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...
- Eclipse Python 开发环境搭建 pydev 插件
已安装: python 3.6 JDK Eclispe 在 Eclipse 中安装 pydev Pydev 的下载网址 http://www.pydev.org/download.html 安装完成后 ...
- tomcat源码分析-初始化过程
digester 说明: https://www.cnblogs.com/devilwind/p/8192304.html
- cpp 区块链模拟示例(五) 序列化
有了区块和区块链的基本结构,有了工作量证明,我们已经可以开始挖矿了.剩下就是最核心的功能-交易,但是在开始实现交易这一重大功能之前,我们还要预先做一些铺垫,比如数据的序列化和启动命令解析. 根据< ...
- 设计模式之桥接模式 c++11
参考http://blog.csdn.net/calmreason/article/details/50909321 桥接模式 实现与抽象之间由指针关联 调用sample类 实际是调用sample类保 ...
- netty2 案例:数据通信
在实际的项目中应该如何使用netty去通信呢? 一般来说,会有以下三种情况, 1长连接 也就是服务器和客户端的通道一直不关闭,如果服务器性能非常好,并且在客户端数量不是很多的情况下,可以选择使用这种方 ...
- boost-字符文本处理
1.lexical_cast 一些常见的数值,字符互转函数: 整型int: itoa()._itoa_s atoi()._ttoi 无符号整型unsigned int: _ultoa_s()._ult ...
- array_flip()函数
array_flip() 函数用于反转/交换数组中所有的键名以及它们关联的键值. array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都 ...
- nginx的权限问题(13: Permission denied)解决办法
一个nginx带多个tomcat集群环境,老是报如下错误: 2012/03/07 15:30:39 /opt/nginx/proxy_temp/4/31/0000000314" fail ...