MyBatis源码解析【8】简单demo理解接口式编程
2017-07-27 21:48
465 查看
前言
这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客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源码解析【7】接口式编程
- mybatis源码解析 - 通过一个简单查询例子分析流程
- opencv源码解析之:CommandLineParser类的简单理解
- opencv源码解析之(5):CommandLineParser类的简单理解
- Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】
- opencv源码解析之(5):CommandLineParser类的简单理解
- MyBatis 源码解析:通过源码深入理解 SQL 的执行过程
- mybatis源码解析 - 通过一个简单查询例子分析流程
- opencv源码解析之(5):CommandLineParser类的简单理解
- MyBatis 源码解析:通过源码深入理解 SQL 的执行过程
- MyBatis的接口式编程Demo
- Mybatis 源码解析三、Mapper接口与mapper.xml文件绑定
- Volley用法解析四(从源码角度理解Volley)(转自郭霖大神的CSDN博客)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android ListView工作原理完全解析,带你从源码的角度彻底理解
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Mybatis源码学习(一)-整体框架理解
- 源码解析--深入理解 Looper、Handler、Message三者关系
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- java IO,伪异步IO以及NIO网络编程 简单实现源码以及区别