整体认识mybatis与源码分析

第一节课:整体认识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

 

四、源码整体分析

image.png

image.png

为什么看源码

 

1、 提升技术功底   java基础

2、深度掌握技术框架

3、 快速定位线上问题

4、 面试必问

5、 技术追求

 

原则

 

1、定焦原则: 抓主线(抓住一个核心流程去分析,不要漫无目的的去看源代码)

2、宏观原则: 站在上帝视角,先脉络后枝叶 (切忌试图搞清楚每一行代码)

 

方法

 

  1. 先会使用,了解框架的设计思想和功能架构
  2. 抓主线,多尝试静态看代码
  3. 在源码中写注释&画流程图
  4. 整合总结

 

技巧

 

宏观》微观》图解

 

  1. 断点(观察调用栈,利用条件断点,表达式)
  2. 反调 (Find Usages)
  3. 根据接口方法找到具体实现          AoP     AopProxyFactory
  4. 猜测类名方法名(比如doGetBean,doCreateBean)
  5. 看控制台日志

 

心态

 

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######

image.png

image.png

image.png

 

执行操作源码过程:

 

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和自定义方法区别:

图片放大

image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值