博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis源码阅读之二
阅读量:6281 次
发布时间:2019-06-22

本文共 3237 字,大约阅读时间需要 10 分钟。

hot3.png

    由之前的系列一,我们知道SqlSession是new SqlSessionTemplate(sqlSessionFactory),我们从SqlSessionTemplate分析起。

    List-1

public class SqlSessionTemplate implements SqlSession, DisposableBean {    private final SqlSessionFactory sqlSessionFactory;    private final ExecutorType executorType;    private final SqlSession sqlSessionProxy;    private final PersistenceExceptionTranslator exceptionTranslator;    public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {        this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());    }    public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) {        this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true));    }    public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {        Assert.notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");        Assert.notNull(executorType, "Property 'executorType' is required");        this.sqlSessionFactory = sqlSessionFactory;        this.executorType = executorType;        this.exceptionTranslator = exceptionTranslator;        this.sqlSessionProxy = (SqlSession)Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new SqlSessionTemplate.SqlSessionInterceptor());    }...

    如上面的List-1所示,是SqlSessionTemplate的构造方法,那个executorType默认是SIMPLE,这个后面会说。

    我们要获取Mapper,底层上返还的是什么呢,如下图1所示,返回的是JDK的动态代理MapperProxy,可以去看下这个类的源码,它实现了JDK的InvocationHandler。

       

                                                             图1

    当我们调用Mapper的方法时,调用的就是MapperProxy的invoke方法,如下,根据调用的方法,构造一个MapperMethod,并将其缓存起来,之后执行MapperMethod的execute方法:

    List-2

public class MapperProxy
implements InvocationHandler, Serializable { private static final long serialVersionUID = -6424540398559729838L; private final SqlSession sqlSession; private final Class
mapperInterface; private final Map
methodCache; public MapperProxy(SqlSession sqlSession, Class
mapperInterface, Map
methodCache) { this.sqlSession = sqlSession; this.mapperInterface = mapperInterface; this.methodCache = methodCache; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if (Object.class.equals(method.getDeclaringClass())) { return method.invoke(this, args); } else if (isDefaultMethod(method)) { return invokeDefaultMethod(proxy, method, args); } } catch (Throwable t) { throw ExceptionUtil.unwrapThrowable(t); } final MapperMethod mapperMethod = cachedMapperMethod(method); return mapperMethod.execute(sqlSession, args); } private MapperMethod cachedMapperMethod(Method method) { MapperMethod mapperMethod = methodCache.get(method); if (mapperMethod == null) { mapperMethod = new MapperMethod(mapperInterface, method, sqlSession.getConfiguration()); methodCache.put(method, mapperMethod); } return mapperMethod; }...

    MapperMethod的execute方法中传入的SqlSession是SqlSessionTemplate,execute方法里面有很多的内容,见后续的文章。

转载于:https://my.oschina.net/u/2518341/blog/3050614

你可能感兴趣的文章
磁盘空间满引起的mysql启动失败:ERROR! MySQL server PID file could not be found!
查看>>
点播转码相关常见问题及排查方式
查看>>
[arm驱动]linux设备地址映射到用户空间
查看>>
弗洛伊德算法
查看>>
【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
查看>>
精度 Precision
查看>>
Android——4.2 - 3G移植之路之 APN (五)
查看>>
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>