只知道项目中使用了Mybatis,却不知道为什么
01、什么是框架
众所周知,mybatis是一个ORM框架。那么什么是框架呢
框架就是我们软件开发中的一套解决方案,不同的框架同来解决不同的问题
1.1 框架的作用
框架内部封装很多的细节,使开发者可以使用极简的方式来完成自己的功能,大大的提高了开发效率
02、什么是MyBatis
那什么是mybatis呢?
mybatis是一款优秀的ORM(持久层)框架,使用Java语言编写
前身是apache的一个开源项目iBatis,2010年迁移到google code并正式改名为mybatis
ORM持久层指的是:将业务数据存储到磁盘,也具备长期存储能力,只要磁盘不损坏,如果在断电情况下,重启系统仍然可以读取数据
2.1 mybatis为什么在国内流行
这里先在使用层面上说明一下。在mybatis出现之前,我们传统使用的是jdbc来与数据库做交互
除了需要自己提供SQL还要操作Connection、Statment、ResultSet以及不同字段的数据
这样的话会出现很多的重复性代码,这样对开发人员而言是非常繁琐并且枯燥的
有了mybatis之后,程序员只需要提供sql就足够了。剩下的比如建立连接、操作Statment等处理jdbc相关的异常,全部交由mybatis来处理
我们关心的重点在于SQL语句,以及增删改查这些操作上。使用mybatis时,它是支持XML和注解来配置以及映射原生数据的
另外mybatis框架并不封闭扩展,可以根据插件等方式来对sql操作进行拓展,相对比较灵活,可以根据需求定制化执行
03、jdbc操作数据库
使用jdbc与数据库操作在代码层面的表现就是
@Slf4j
public class JdbcTest {
@SneakyThrows
public static void main(String[] args) {
String driveName = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mybatis-study?serverTimezone=GMT%2B8";
String user = "root";
String pass = "root";
Connection con = null;
try {
// 装载Mysql驱动
Class.forName(driveName);
// 获取连接
con = DriverManager.getConnection(url, user, pass);
// 创建Statement
Statement state = con.createStatement();
// 构建SQL语句
String stuQuerySqlStr = "select * from student";
// 执行SQL返回结果
ResultSet result = state.executeQuery(stuQuerySqlStr);
// 对SQL返回结果解析
while (result.next()) {
log.info(" >>> 学生姓名 :: {}", result.getString("name"));
log.info(" >>> 学生年龄 :: {}", result.getInt("age"));
}
} finally {
if (!Objects.isNull(con)) {
// 释放连接
con.close();
}
}
}
}
如果想使用JDBC进行测试的话,注意 driveName,不用的mysql版本配置不同的驱动
04、使用了mybatis的变化
1. 数据库连接的创建、释放造成的系统资源浪费从而影响系统性能,使用了连接池解决
2. 将SQL语句写在Mapper.xml文件或持久层接口中,完成SQL语句与业务代码的隔离
3. 通过占位符以及动态条件的功能解决原生JDBC的SQL语句传参麻烦问题
4. 对结果集进行解析为JavaBean,定义了丰富的解析类型
5. 针对查询性能增加了缓存功能,包括会话级一级缓存以及应用级二级缓存
6. 等等...
05、mybatis vs hibernate
5.1 对象管理
之前一直认为mybatis是完整的ORM框架,理解的不是很正确
最近在网上以及书上找资料表示:mybatis只是一个半自动的ORM,这也和mybatis的理念相关,拥抱SQL而非是通过对象关系模型实现对数据库的操作。这也就导致了使用基本类型可以做到开发者无感知,只需要专注业务。但是在复杂对象的映射关系上仍然需要通过 手写SQL来实现和管理
5.2 开发速度
mybatis框架相对而言上手难度简单些,但相对而言较为简单
比起两者的开发速度,不要只考虑两者的执行性能,更需要考虑项目的实际需求
比如:项目中都是一些简单的CRUD操作,使用hibernate开发速度绝对会效率高一些,因为简单的一些SQL都已经封装好了,无需再编写(在Mybatis-Plus出现后,打破了开发效率这个局面)
如果说项目是一个动不动SQL就几十行上百行,再使用hibernate就不再合适了。因为mybatis的SQL语句编写都可以自己管理,相对比较方便
5.3 缓存
使用hibernate是很早之前的事情了,对于缓存当时也是一知半解,以及接下来的系列都是讲mybatis,所以就不在这里加以赘述了
mybatis缓存分为会话级缓存和应用级缓存,对应工作中常听说的一级、二级缓存,针对于缓存的使用、失效、装饰、生命周期及MyBatis的整体架构会在 MyBatis系列专栏 中详细说明
5.4 移植性
有没有这样一种可能,项目最初使用的是Oracle,后来决定拥抱开源使用了Mysql
如果使用的mybatis作为持久层框架,因为mybatis需要手写SQL,语法以及关键字都是强绑定数据库的
如果SQL不具备通用性而是使用了数据库的独有语法,那么移植性将会降低很多
hibernate就没有这种顾虑,Hibernate通过它强大的映射结构和HQL语言,大大降低了对象与数据库(oracle、mySQL等)的耦合性
5.5 整体来看
使用mybatis可以进行更为细致的SQL优化,可以减少查询字段,mybatis相对于hibernate更容易掌握,即学即用,提供了数据查询的自动对象绑定
hibernate的持久层开发比mybatis简单,mybatis还需要维护SQL和结果映射。hibernate功能更加强大,数据库无关性好,如果进行了适当的封装,整个项目的持久层会更加简单,需要写的代码很少,很好的提升开发速度
所以,没有规定ORM持久层这块一定要用哪一款框架,适合所开发项目的才是 “好框架”
06、mybatis spring 的集成
MyBatis只是一个单纯的ORM持久层框架,并不适合用来单独开发企业级项目
我们工作中的SSM就是mybatis和Spring集成的产物,贴出对应Pom.xml坐标
通过Maven引用得知,项目中不仅引入了mybatis的jar,同时还有和Spring集成的Jar
具体集成细节会有单独文章说明
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
07、阅读mybatis源码的前提
这篇文章是接下来源码分析专栏的一个引子。如果想阅读mybatis的源代码需要具备什么基础知识呢?
7.1 实际熟练运用
首先最重要的一个前提就是你必须要熟练使用mybatis
掌握mybatis在项目中的使用,编写xml文件与持久层接口的映射关系,SQL中使用的标签关系,以及一些基本语法,比如:<resultMap/><select/><insert/><update/>标签等
7.2 设计模式
了解设计模式,最好在项目中实际使用过。比如常用的代理、策略、适配、模板等模式
看了源码之后会发现,上面所说的设计模式充斥在框架的各个 “躯干” 中,如果不理解模式的含义,对于组件功能理解有一定难度
7.3 JDBC
了解JDBC相关流程,因为mybatis本质上是封装使用者对JDBC的操作
不具备上述条件不代表看不懂MyBatis的源码和设计理念,只是说具备了上述条件阅读会轻松许多
08、总结
工作也有几年时间了,一直停留在使用框架这个层面上。虽然之前也会考虑SSM框架是怎么把数据库查询返回字段封装成JavaBean的,但是一直没有机会去研究
借着写文章的机会,锤炼自己文笔的同时将知识进行深度拓展
在这次mybatis的系列专栏中,能够收获大部分mybatis组件原理。比如:缓存模块、配置解析、参数映射、SQL解析、SQL映射、结果集映射、插件
只有更好的理解框架的设计理念和实现细节,才能在模块设计时多一种解析思路,遇到问题时才不至于没有头绪
如果对mybatis框架有兴趣了解和研究,可以添加作者微信聊聊学习方式或关注公众号持续学习...
本文转载自微信公众号「龙台的技术笔记」