• 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测试就能看见输出的结果了。

    总结

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

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

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

  • 相关阅读:
    如何提高Java并行程序性能??
    《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了
    看JVM就推荐这本书
    【Java】实战Java虚拟机之五“开启JIT编译”
    实战Java虚拟机之四:提升性能,禁用System.gc() ?
    实战Java虚拟机之三“G1的新生代GC”
    实战Java虚拟机之二“虚拟机的工作模式”
    实战Java虚拟机之一“堆溢出处理”
    实战java虚拟机的学习计划图(看懂java虚拟机)
    aspose.cells 复制单元格
  • 原文地址:https://www.cnblogs.com/linkstar/p/7247578.html
Copyright © 2020-2023  润新知