
MyBatis源码通
以作者自身的学习经历,整理出一套看MyBatis源码的思路,不能说覆盖所有的情况,但至少能保证你在看源码时,能理清思路。以自己的角度,读源码不一定边边角角都要理解,初次看时先把主线理解清楚才最重要,不然会进入“睡着的境界”~
一只打杂的码农
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Mybatis源码导读
Mybatis源码导读一、架构划分Mybatis架构可分为三层:接口层、核心处理层、基础支持层。如下图所示:接口层:开发者与Mybatis的交互入口,开启配置初始化逻辑、构建会话Session等。核心处理层:各种配置文件初始化详细逻辑、SQL执行逻辑、结果解析等。基础支持层:缓存定义、公共工具包、事务管理、数据源等。二、源码阅读主线首次读源码,最好结合自身的使用经验来看,理清主线,...原创 2019-05-18 20:56:46 · 582 阅读 · 0 评论 -
为什么不再使用原生JDBC,而选择MyBatis之类的框架?
JDBC 中三种执行SQL的APIStatement:用于通用查询PreparedStatement:继承至Statement接口,用于执行参数化查询CallableStatement:继承至PreparedStatement接口,用于存储过程1、问题:Statement与PreparedStatement的区别以及如何避免SQL注入?Statement属于语句硬编码的方式来执行S...原创 2019-05-18 20:58:37 · 3316 阅读 · 2 评论 -
MyBatis源码通~Config配置文件解析主线
Config文件解析涉及的主要类:BaseBuilderXMLConfigBuilderInterceptorObjectFactoryObjectWrapperFactoryReflectorFactoryTransactionFactoryDataSourceFactoryDataSourceEnvironmentXMLMapperBuilderCac...原创 2019-05-18 21:06:35 · 548 阅读 · 0 评论 -
MyBatis源码通~映射文件解析
Mapper映射文件解析关联类:XMLMapperBuilderXMLStatementBuilderMappedStatement0、入口:XMLConfigBuilder.mapperElement(…)1、 XMLMapperBuilder两种配置方式:配置package,会遍历该包下所有的类指定mapper文件的路径resource/url/class解...原创 2019-05-20 00:05:39 · 536 阅读 · 0 评论 -
MyBatis源码通~SQL节点解析
XMLStatementBuilder解析SQL节点,将定义的SQL节点信息构建成MappedStatement对象。1、MappedStatement记录SQL节点信息,包含了很多属性,平时常见的属性有: private String id; private List<ResultMap> resultMaps; private boolean useCache;...原创 2019-05-18 21:23:53 · 1338 阅读 · 0 评论 -
MyBatis源码通~SqlSource
SqlSource构建动态SQL//XMLStatementBuilder.parseStatementNode()SqlSource sqlSource = langDriver.createSqlSource(configuration, context, parameterTypeClass);涉及类LanguageDriverRegistry+LanguageDriverX...原创 2019-05-18 21:20:25 · 1972 阅读 · 0 评论 -
MyBatis源码通~SqlNode
SqlNode每个 XML Node 会解析成对应的 SQL Node 对象。public interface SqlNode { //将各Sql片段合并到DynamicContext中,拼接称为完整的SQL boolean apply(DynamicContext context);}apply方法会根据传入的参数context,参数解析该SqlNode所记录的SQL片段,并调...原创 2019-05-21 23:47:22 · 1930 阅读 · 0 评论 -
MyBatis源码通~SqlSourceBuilder
SqlSourceBuilder两个作用:将"#{xxx}“替换为占位符”?"将占位符"?"对应的属性信息一起构建成到ParameterMapping中,以便在后续ParameterHandler真正地参数赋值。源码解析先分析从SqlNode 上下文中得到完成的originalSql,将其中的"#{xxx}“替换为占位符”?"同时为每个"#{xxx}"对应的属性构建对应的Para...原创 2019-05-21 23:44:52 · 1073 阅读 · 0 评论 -
MyBatis源码通~OGNL的应用
OGNL表达式(Object Graphic Navigation Language)一、原生OGNL表达式1、表达式ONGL表达式执行的所有操作都是根据表达式解析得到的。例如:“对象名.方法名”表示调用指定对象的指定方法;“@[类的完全限定名]@[静态方法或者静态字段]”表示调用指定类的静态方法或访问静态字段;OGNL表达式还可以完成变量赋值、操作集合等操作。2、 root对...原创 2019-05-21 23:59:39 · 1508 阅读 · 2 评论 -
MyBatis源码通~Mapper注册
Mapper接口注册/mapper节点解析完成后,通过命名空间绑定 mapper 接口,这样才能将映射文件中的 SQL 语句和 mapper 接口中的方法绑定在一起(记录在Configuration的MapperRegistry mapperRegistry),后续即可通过调用 mapper 接口方法执行与之对应的 SQL 语句。1、入口XMLMapperBuilder.bindMapper...原创 2019-05-18 21:28:25 · 370 阅读 · 0 评论 -
MyBatis源码通~SQL语句执行
SQL语句执行SQL执行过程包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延迟加载等。1、涉及技术点为 Mapper 接口生成实现类(其实对应的就是代理类)根据配置信息生成 SQL,并将运行时参数设置到 SQL 中一二级缓存的实现插件机制数据库连接的获取与管理查询结果的处理,以及延迟加载等2、主要涉及类或...原创 2019-05-18 21:37:01 · 2222 阅读 · 0 评论 -
MyBatis源码通~Executor
SQL语句执行之Executor在SqlSession(DefaultSqlSession)中持有一个Executor,用于真正发起sql执行。Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler完成。1、Executor接口方法读和写操作相关的方法事务相关的方法缓存相关的方法设置延迟加载的方...原创 2019-05-18 21:41:40 · 549 阅读 · 1 评论 -
MyBatis源码通~缓存Cache
Cache缓存原理Mybatis提供一级缓存和二级缓存,一级缓存即缓存在内存中的,二级缓存则是利用第三方缓存工具来缓存数据。对应类包括BaseExecutor、CachingExecutor、Cache接口实现类。1、缓存实现类 implement CacheMybatis提供了非常多的缓存实现类,有最基本的PerpetualCache实现类、实现LRU策略的LruCache、可保证线程...原创 2019-05-18 21:44:57 · 548 阅读 · 0 评论 -
MyBatis源码通~StatementHandler&ParameterHandler
StatementHandler&ParameterHandlerStatementHandler是连接Mybatis和JDBC之间的桥梁。在执行SQL之前,StatementHandler需要创建合适的 Statement 对象,然后通过ParameterHandler将参数值填充到 Statement 对象中,最后通过 Statement.execute()执行 SQL。SQL ...原创 2019-05-18 21:40:03 · 1188 阅读 · 0 评论 -
MyBatis源码通~MyBatis-plus
Mybatis-plus核心类1、MybatisSqlSessionFactoryBean初始化Configuration(实际为MybatisConfiguration)MybatisXMLConfigBuilder:内部会调动Mybatis的XMLConfigBuilder初始化继承BaseMapper 的Mapper接口中的所有方法和对应的SqlSource(其中包含着执行...原创 2019-05-22 00:03:17 · 933 阅读 · 0 评论 -
MyBatis源码通~插件Plugin原理
插件Interceptor拦截器实现:实现Interceptor接口,完成拦截器功能。被拦截对象标记:@Intercepts+@Signature注解定义被拦截对象以及对应需要拦截的方法。(用在拦截器上)拦截器链绑定:InterceptorChain封装了所有拦截器,并为被拦截对象创建代理或者其他处理逻辑。拦截:代理对象Plugin.invoke拦截,调用拦截器的intercept方法...原创 2019-05-20 20:24:55 · 447 阅读 · 0 评论