第一节课:整体认识mybatis与源码分析
第二节课:Mybatis源码分析二
第三节课:Mybatis源码分析三
第四节课:Mybatis与Spring整合与徒手实现
学完之后可以get到:
Mybatis在开发中作用与工作原理
Mybatis源码的精髓与设计模式
Orm框架的核心思想与设计能力
一、传统JDBC弊端
总结:
1、jdbc底层没有用连接池、操作数据库需要频繁的创建和关联链接。消耗很大的资源
2、写原生的jdbc代码在java中,一旦我们要修改sql的话,java需要整体编译,不利于系统维护
3、使用PreparedStatement预编译的话对变量进行设置123数字,这样的序号不利于维护
4、返回result结果集也需要硬编码。
二、ORM框架Mybatis介绍
MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
源码下载:
https://github.com/mybatis/mybatis-3
三、Mybatis快速开始&配置详解
https://mybatis.org/mybatis-3/index.html
四、源码整体分析
为什么看源码
1、 提升技术功底 java基础
2、深度掌握技术框架
3、 快速定位线上问题
4、 面试必问
5、 技术追求
原则
1、定焦原则: 抓主线(抓住一个核心流程去分析,不要漫无目的的去看源代码)
2、宏观原则: 站在上帝视角,先脉络后枝叶 (切忌试图搞清楚每一行代码)
方法
- 先会使用,了解框架的设计思想和功能架构
- 抓主线,多尝试静态看代码
- 在源码中写注释&画流程图
- 整合总结
技巧
宏观》微观》图解
- 断点(观察调用栈,利用条件断点,表达式)
- 反调 (Find Usages)
- 根据接口方法找到具体实现 AoP AopProxyFactory
- 猜测类名方法名(比如doGetBean,doCreateBean)
- 看控制台日志
心态
1、克服对源码的恐惧心理
2、 静下心读源码
获取数据库源过程:
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
》org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
》org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
》org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement
》org.apache.ibatis.builder.xml.XMLConfigBuilder.dataSourceElement
》org.apache.ibatis.session.Configuration.setEnvironment#######
获取执行语句源码过程:
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
》org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
》org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
》org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement
》org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement
》org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode
>org.apache.ibatis.session.Configuration.addMappedStatement######
执行操作源码过程:
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()
》org.apache.ibatis.session.Configuration.newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
》org.apache.ibatis.executor.SimpleExecutor
》org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
》org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object)
》org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)
》org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
》org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
》org.apache.ibatis.executor.SimpleExecutor.doQuery
》org.apache.ibatis.executor.statement.PreparedStatementHandler.query
》org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets
加载mppers文件有四种
五、Annotaion注解的方式
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
>org.apache.ibatis.builder.xml.XMLConfigBuilder
org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement
org.apache.ibatis.session.Configuration.addMapper
org.apache.ibatis.binding.MapperRegistry.addMapper
org.apache.ibatis.binding.MapperRegistry.addMapper
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.getSqlSourceFromAnnotations
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.buildSqlSourceFromStrings
org.apache.ibatis.builder.SqlSourceBuilder.parse
六、Mybatis xml和annotation|优缺点
Annotaion方式:
1、不适合比较复杂的sql 比如关联查询
2、不方便(收集)管理sql
Xml方法:
1、xml繁琐、麻烦
2、条件不确定的查询
3、容易出错写错,特殊字符转义
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#getSqlSourceFromAnnotations
七、Mybatis源码分析之SelectOne和自定义方法区别:
图片放大