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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 只知道项目中使用了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();
        }
    }
}

}

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

具体集成细节会有单独文章说明

<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>


<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>


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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
前端开发 Java 关系型数据库
SpringBoot+MyBatis 天猫商城项目
SpringBoot+MyBatis 天猫商城项目
63 1
|
4天前
|
NoSQL Java 数据库连接
SpringBoot-搭建Mybatis项目
通过本文的学习,读者将了解如何使用IntelliJ IDEA快速搭建一个基于SpringBoot和Mybatis的Java Web应用程序,提高开发效率。
61 0
|
4天前
|
Web App开发 前端开发 JavaScript
Spring Boot整合 mybatisplus(后端) Vue+echarts+Element UI+axios(前端)---前后端项目实例demo
Spring Boot整合 mybatisplus(后端) Vue+echarts+Element UI+axios(前端)---前后端项目实例demo
34 1
|
4天前
|
XML Java 数据库连接
Mybatis-Plus学习小项目及详细教程
Mybatis-Plus学习小项目及详细教程
|
4天前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
9月前
|
Java 数据库连接 Maven
idea简单实现mybatis(详解),使用maven项目
idea简单实现mybatis(详解),使用maven项目
80 0
|
4天前
|
前端开发 Java 数据库连接
基于SpringBoot+Thymeleaf+Mybatis实现大学生创新创业管理系统(源码+数据库+项目运行指导文档)
基于SpringBoot+Thymeleaf+Mybatis实现大学生创新创业管理系统(源码+数据库+项目运行指导文档)
|
4天前
|
SQL Java 数据库连接
SpringBoot项目中Mybatis不打印日志怎么办?
SpringBoot项目中Mybatis不打印日志怎么办?
218 0
|
4天前
|
消息中间件 NoSQL Java
47K Star 的SpringBoot+MyBatis+docker电商项目,附超详细的文档
该项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。
|
8月前
|
消息中间件 前端开发 Java
GitHub标星30k!基于Spring MVC Mybatis分布式开发系统-zheng项目
zheng项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE企业级开发解决方案。