只知道项目中使用了Mybatis,却不知道为什么

apei_02
发布于 2022-4-16 18:48
浏览
0收藏

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框架有兴趣了解和研究,可以添加作者微信聊聊学习方式或关注公众号持续学习...

本文转载自微信公众号「龙台的技术笔记」

分类
收藏
回复
举报
回复
    相关推荐