博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析mybatis源码(三)Mapper
阅读量:7218 次
发布时间:2019-06-29

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

hot3.png

这篇主要看下mybatis的Mapper,Mapper可以说是mybatis的入口。这里仅讨论注解的方式。

回顾下第一篇中mybatis是如何使用的。

sqlSession = SqlSessionFactoryUtil.getSqlSession();productMapper = sqlSession.getMapper(ProductMapper.class);Product product = productMapper.detail(1);

可以看到获取Session后(第二篇讲到了,本质就是获取到一个数据库连接),获取productMapper,ProductMapper是我们定义的一个接口,detail是我们定义的一个抽象方法。 接口并没有实现方法,因此可以猜想到mybatis帮我们生成了一个实现了ProductMapper接口的类。

思路

那可以试想下,让我们自己实现这个类,是怎样的流程呢?

首先,getMapper有个入参是ProductMapper.class。也就是我们有ProductMapper这个接口,接口上每个方法中的注解上都定义了该如何执行sql。通过反射能够拿到这些sql信息生成类则可以使用动态代理,因为ProductMapper是接口,我们可以用jdk动态代理。

mybatis生成productMapper流程

mybatis生成productMapper是分两步的,第一步是在初始化的时候addMapper,第二步则是在使用的时候getMapper。为什么要这样做呢,因为解析注解、生成工厂类等都是重复的工作。可以在初始化前计算好。使用的时候拿来用就行了。

getMapper流程

public 
T getMapper(Class
type, SqlSession sqlSession) { final MapperProxyFactory
mapperProxyFactory = (MapperProxyFactory
) knownMappers.get(type); if (mapperProxyFactory == null) { throw new BindingException("Type " + type + " is not known to the MapperRegistry."); } try { return mapperProxyFactory.newInstance(sqlSession); } catch (Exception e) { throw new BindingException("Error getting mapper instance. Cause: " + e, e); } }

getMapper的流程比较简单,就是通过Mapper在knownMappers(addMapper中会讲)中取到对应的Mapper代理工厂。然后通过工厂构建Mapper代理。

addMapper流程

可以看到最终一共生成了三份重要数据,类型分别为Mapper代理工厂类,ResultMap,MappedStatement类。都保存在了Map结构中。
knowMappers保存在了configuration.mapperRegistry中。键是Mapper.class,值是对应的Mapper代理工厂。
resultMaps保存在了configuration中。键是个字符串,这样拼接的"${Mapper包路径}.${Mapper类名}.${执行方法名}.${方法返回类型}",值是这个方法对应的结果处理配置。
mappedStatments保存在了configuration中。键是个字符串,这样拼接的"${Mapper包路径}.${Mapper类名}.${执行方法名}",值是这个方法对应的sql执行配置。
那这些数据什么时候使用呢?
在getMapper的时候,便可以取出来Mapper工厂来生成Mapper类。
当执行Mapper中某个方法时,便可以从MappedStatement中找到执行的sql数据,得到结果后,可以从ResultMap中找到定义的结果类型,将结果转为定义的类型
后面三篇文章会分别从这三个类出发来进行讨论。

转载于:https://my.oschina.net/u/3361610/blog/3012573

你可能感兴趣的文章
rn.ShowDialog() == DialogResult.OK
查看>>
20160519
查看>>
SCU 3132(博弈)
查看>>
正则表达式
查看>>
delete archivelog all 无法彻底删除归档日志?
查看>>
Redis五大数据类型
查看>>
大型分布式网站架构技术总结
查看>>
矩阵求导与投影梯度相关问题
查看>>
SVN
查看>>
C语言编程写的一个http下载程序(王德仙)2012-04-08
查看>>
CCF201409-3 字符串匹配(100分)
查看>>
UVALive2203 UVa10042 Smith Numbers【质因数分解+素数判定+数位之和】
查看>>
Project Euler Problem 9: Special Pythagorean triplet
查看>>
HDU5701 中位数计数【中位数】
查看>>
Python 深浅拷贝 (Shallow copy and Deep copy in Python)
查看>>
Axure
查看>>
屏幕截取工具
查看>>
C语言第七次作业---要死了----
查看>>
Jquery事件绑定冲突
查看>>
偶现bug如何处理?
查看>>