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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
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框架有兴趣了解和研究,可以添加作者微信聊聊学习方式或关注公众号持续学习...

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
295 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
43 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
3月前
|
Java 数据库连接 mybatis
成功解决: Invalid bound statement (not found) 在已经使用mybatis的项目里引入mybatis-plus,结果不能共存的解决
这篇文章讨论了在已使用MyBatis的项目中引入MyBatis-Plus后出现的"Invalid bound statement (not found)"错误,并提供了解决方法,主要是通过修改yml配置文件来解决MyBatis和MyBatis-Plus共存时的冲突问题。
成功解决: Invalid bound statement (not found) 在已经使用mybatis的项目里引入mybatis-plus,结果不能共存的解决
|
3月前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。
|
3月前
|
SQL Java 数据库连接
springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
这篇文章介绍了在Spring Boot + MyBatis + Shiro项目中,如何使用Shiro框架实现登录用户的权限验证,包括用户、角色和权限表的设计,以及通过多个表查询来收集和验证用户权限的方法和代码实现。
springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
|
4月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
93 4
|
5月前
|
Java 数据库连接 数据库
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
|
3月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
333 0
|
4月前
|
Java 数据库连接 Maven
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
|
4月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法