观前提示:为了给这个快要秃头的小编鼓励
麻烦大家把朕(zai)已(kan)阅打开公屏上
demo源码已上传至github
地址: https://github.com/qaqRose/mybatis-learn
JDBC时代
在说mybatis之前,我们不妨回到还没有框架的时代
看看那时人们是如何处理问题的?
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"));
代码很简单,对新手也很友好
但是这样有几个痛点
首先直接对
sql
操作,参数硬编码,灵活性差,维护难度大结果集的解析非常麻烦
扩展性很差(事务,缓存,连接管理等)
ORM时代
为了解决上面的痛点,ORM(Object Relational Mapping)
对象映射框架应运而生
mybatis
作为一款老牌企业级开源orm
框架,在国内的占有率还是相当高的
几乎作为java web
后端必学的框架
看看使用mybatis
后,代码有什么变化
乍一看,以为代码简化了很多
其实并没有
为了使用mybatis
,我们需要额外的配置config/mybatis-config.xml
, 映射接口BookMapper
,和sql映射文件bookMapper.xml
相比jdbc
要多出好几倍的代码
但是这样做的好处是扩展性和灵活性都提高了
事务、缓存、连接池化都可以通过配置搞定,也可以轻松与第三方框架(如spring
)整合
复杂sql语句维护更加方便、一些复杂场景也可灵活应对
这就是mybatis
存在的意义
源码面前,了无秘密
侯捷老师在《STL源码剖析》
写过一句话,"源码面前,了无秘密"
这句话对我产生了不少影响,激励我无数次Ctrl + Click
查看源码的终极来源
当然这本书对我影响还远不止如此,其中包括让我从想成为一名c++
工程师直接变成想成为一名java
工程师(逃
想要深入了解mybatis
,肯定避免不了在源码里面走上一遭了
mybatis 结构
看源码之前, 我们需要对mybaits的整体架构有个大致的了解
首先看看代码结构
统计各个包下的代码行数以及占比情况
统计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% |