mybatis源码_mybatis源码初探【一】

本文介绍了MyBatis从JDBC时代到ORM时代的转变,重点解析了MyBatis的源码,包括SqlSessionFactory的创建、XMLConfigBuilder解析配置、Configuration的构建以及SqlSession和Executor的工作原理。通过对源码的分析,理解MyBatis的核心架构和执行流程。
摘要由CSDN通过智能技术生成

观前提示:为了给这个快要秃头的小编鼓励

麻烦大家把(zai)(kan)打开公屏上

demo源码已上传至github

地址: https://github.com/qaqRose/mybatis-learn

JDBC时代

在说mybatis之前,我们不妨回到还没有框架的时代

看看那时人们是如何处理问题的?

044b1891c6311ea6eb1c6f6339f11417.png

JDBC给我们提供访问数据库能力

通过提供一个数据库连接驱动接口Driver

让各大数据库厂商实现(适配)驱动接口Driver

这样Java便有连接各种数据库的能力

回到代码中,我们通过几个步骤实现与数据库数据的交互

 1// 1. 加载驱动
2// 实例化驱动类,并初始化
3// 并使用当前类的类加载器 加载 数据库驱动类
4Class.forName(DRIVER);
5
6//2. 获得数据库的连接
7// 通过账号密码跟地址获取数据库连接实例
8Connection connection = DriverManager.getConnection(URL, NAME, PASSWORD);
9
10//3. 创建一个 PreparedStatement
11// 使用预编译模式,可以有效防止sql注入
12PreparedStatement statement = connection.prepareStatement(QUERY_SQL);
13
14// 4. 设置参数
15statement.setString(1, "1");
16
17// 5. 执行sql语句
18ResultSet resultSet = statement.executeQuery();
19
20// 6. 从ResultSet获取结果
21System.out.println("id: " + resultSet.getInt("id"));

代码很简单,对新手也很友好

但是这样有几个痛点

  1. 首先直接对sql操作,参数硬编码,灵活性差,维护难度大

  2. 结果集的解析非常麻烦

  3. 扩展性很差(事务,缓存,连接管理等)

ORM时代

为了解决上面的痛点,ORM(Object Relational Mapping)对象映射框架应运而生

mybatis作为一款老牌企业级开源orm框架,在国内的占有率还是相当高的

几乎作为java web后端必学的框架

看看使用mybatis后,代码有什么变化

f77aad448dc675ffb637bdac0bc30fc9.png

乍一看,以为代码简化了很多

其实并没有

为了使用mybatis,我们需要额外的配置config/mybatis-config.xml, 映射接口BookMapper,和sql映射文件bookMapper.xml

相比jdbc要多出好几倍的代码

但是这样做的好处是扩展性和灵活性都提高了

事务、缓存、连接池化都可以通过配置搞定,也可以轻松与第三方框架(如spring)整合

复杂sql语句维护更加方便、一些复杂场景也可灵活应对

这就是mybatis存在的意义

源码面前,了无秘密

侯捷老师在《STL源码剖析》写过一句话,"源码面前,了无秘密"

这句话对我产生了不少影响,激励我无数次Ctrl + Click查看源码的终极来源

当然这本书对我影响还远不止如此,其中包括让我从想成为一名c++工程师直接变成想成为一名java工程师(逃

想要深入了解mybatis,肯定避免不了在源码里面走上一遭了

mybatis 结构

看源码之前, 我们需要对mybaits的整体架构有个大致的了解

首先看看代码结构

8d5c5f1cee80968dbeb9f93caf2bd496.png

统计各个包下的代码行数以及占比情况

统计mybatis的总代码量为22017行

mybatis版本为3.5.6-SNAPSHOT

包名 作用/描述 代码量 占比[%]
annotations 注解包, insert, select, param等常用注解 520 2%
binding mapper的绑定,注册机 557 3%
builder 基础构建器, 主要是xml的配置构建,还提供本地DTD校验和XSD校验 2755 13%
cache 缓存与各种缓存的实现(如持久化缓存, 事务缓存, 最近最少使用缓存等等) 910 4%
cursor 3.3后新增功能, 游标查询 158 1%
datasource 数据源工厂和几种数据源实现(非池化/池化/jndi) 984 4%
exceptions 几个基础异常(其他异常均在各自包下) 60 0%
executor 执行器接口和几个实现(一二级缓存,事务管理,sql操作均在此包下) 3864 18%
io 封装了一些io操作的类跟方法 778 4%
jdbc sql执行器,构建器,主要用于测试用例 1034 5%
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值