mybatis基本上都在用,我们来了解它的源码和实现
我看Mybatis源码的经验分享给大家,大家可以参考,
1,我们首先把源码下载,https://github.com/tuguangquan/mybatis
这个是他人做了中文注释的源码,下载到本地。
2,导入mybatis-parent模块,快速入口
3,pom中有个PDF的插件引用去掉,这样,mybatis源码环境就可以了
怎么看这些源码了:
网上找了一些资料:下面是mybaits的包结构和作用
1.兵马未动,日志先行
org.apache.ibatis.logging
org.apache.ibatis.logging.commons
org.apache.ibatis.logging.jdbc
org.apache.ibatis.logging.jdk14
org.apache.ibatis.logging.log4j
org.apache.ibatis.logging.log4j2
org.apache.ibatis.logging.nologging
org.apache.ibatis.logging.slf4j
org.apache.ibatis.logging.stdout
对象适配器设计模式
设计模式可参考http://www.cnblogs.com/liuling/archive/2013/04/12/adapter.html
2.异常
org.apache.ibatis.exceptions
3.缓存
org.apache.ibatis.cache
org.apache.ibatis.cache.decorators
org.apache.ibatis.cache.impl
4.解析
org.apache.ibatis.parsing
xml解析,${} 格式的字符串解析
源码分析可以参考http://www.cnblogs.com/sunzhenchao/p/3161093.html
5.类型处理器
org.apache.ibatis.type
实现java和jdbc中的类型之间转换
源码分析可以参考http://www.cnblogs.com/sunzhenchao/archive/2013/04/09/3009431.html
6.IO
org.apache.ibatis.io
通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类
7.反射
org.apache.ibatis.reflection
org.apache.ibatis.reflection.factory
org.apache.ibatis.reflection.invoker
org.apache.ibatis.reflection.property
org.apache.ibatis.reflection.wrapper
可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类
8.数据源
org.apache.ibatis.datasource
org.apache.ibatis.datasource.jndi
org.apache.ibatis.datasource.pooled
org.apache.ibatis.datasource.unpooled
9.事务
org.apache.ibatis.transaction
org.apache.ibatis.transaction.jdbc
org.apache.ibatis.transaction.managed
10.会话
org.apache.ibatis.session
org.apache.ibatis.session.defaults
11.jdbc单元测试工具
org.apache.ibatis.jdbc
12.构建
org.apache.ibatis.builder
org.apache.ibatis.builder.annotation
org.apache.ibatis.builder.xml
13.映射
org.apache.ibatis.mapping
14.脚本
org.apache.ibatis.scripting
org.apache.ibatis.scripting.defaults
org.apache.ibatis.scripting.xmltags
15.注解
org.apache.ibatis.annotations
16.绑定
org.apache.ibatis.binding
17.执行器
org.apache.ibatis.executor
org.apache.ibatis.executor.keygen
org.apache.ibatis.executor.loader
org.apache.ibatis.executor.loader.cglib
org.apache.ibatis.executor.loader.javassist
org.apache.ibatis.executor.parameter
org.apache.ibatis.executor.result
org.apache.ibatis.executor.resultset
org.apache.ibatis.executor.statement
18.插件
org.apache.ibatis.plugin
但是看这些去看代码,没有很深的功底很难看到。
其实网上很多的开源组件都有test包 ,这些都能很好的帮我们去读懂mybatis
通过跑这些测试用例,大概的mybaits的流程我觉得是这样
1,首先,我们启动应用,myatis的io包根据其配置信息,生成configuration配置类,
可以见org.apache.ibatis.binding.BindingTest类的setup方法,最后得到sqlSessioinFactory.
sqlSessioinFactory里就有mybatis的一些配置,po别名,po数据封装类,注意这里注册这些都是类名,
不是实例,对象,因为到时候我们真正通过这些来生成代理对象,来操作数据。
2,先将test下的log4j日记级别改成DEBUG. log4j.logger.org.apache.ibatis=DEBUG
调试org.apache.ibatis.binding.BindingTest类的shouldSelectBlogWithPostsUsingSubSelect方法
一步步调试,这样我们就能慢慢理解mybatis的整个设计思路和各个包的作用。
下面是我根据调试大概得到的mybatis的设计思路流程图