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

 

微信搜索【源码兴趣圈】,关注龙台,回复【资料】领取涵盖 GO、Netty、SpringCLoud Alibaba、Seata、开发规范、面试宝典、数据结构等电子书 or 视频学习资料!
 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: fluent-mybatis是一个对MyBatis进行封装的库,使其使用起来更简单、更符合领域驱动设计(DDD)的理念。因此,fluent-mybatis通常被用于开发各种类型的项目的数据访问层。我不知道是否有任何特别大的项目使用fluent-mybatis作为数据访问层的框架,如果有的话,我不能确定。 ### 回答2: Fluent-Mybatis是一个基于MybatisORM框架,它提供了一种方便、灵活的方式来操作数据库。它的设计目标是简化数据库操作的流程,提升开发效率,并且能够应对大型项目的需求。 在大型项目,数据量通常很大,操作复杂,所以需要一个高效的ORM框架来处理数据库。Fluent-Mybatis提供了灵活的查询方式,支持动态SQL,通过自动生成SQL语句,将复杂的数据库操作简化为简洁易懂的代码。同时,它还支持多种数据库,如MySQL、Oracle、SQL Server等,可以根据项目需要灵活选择。 在大型项目,数据更新频繁,且可能涉及到多个表之间的关联操作。Fluent-Mybatis提供了事务支持和乐观锁机制,保证数据的一致性和并发操作的正确性。通过使用Fluent-Mybatis,开发人员可以方便地管理事务,实现数据的原子性操作,提高系统的稳定性和安全性。 此外,Fluent-Mybatis还提供了一些扩展功能,如分页查询、多条件查询、缓存支持等。这些功能在大型项目尤其重要,能够提升系统的性能和用户体验。 总之,Fluent-Mybatis适用于各种大型项目,无论是电子商务、金融、物流等领域的系统,都可以通过使用它来简化数据库操作,提高开发效率,保证系统的稳定性和性能。 ### 回答3: Fluent-Mybatis是一个简化MyBatis开发的框架,它提供了一种更流畅、更便捷的方式来进行数据库操作。对于大型项目而言,Fluent-Mybatis具有以下优势和适用场景。 首先,Fluent-Mybatis具有简化SQL编写的功能。在大型项目,通常需要编写大量的SQL语句来进行数据库操作,包括查询、插入、更新和删除等。Fluent-Mybatis可以通过提供一种更直观的API来简化SQL的编写,使得开发人员可以更快速地完成数据库操作。 其次,Fluent-Mybatis支持动态SQL的构建。在大型项目,经常需要根据不同的条件来构建各种不同的SQL语句,以满足复杂的业务需求。Fluent-Mybatis提供了动态SQL的支持,可以根据不同的条件来动态构建SQL语句,从而提高了开发的灵活性和效率。 另外,Fluent-Mybatis还支持多种数据库的操作。在大型项目,可能需要同时操作多个不同类型的数据库,如MySQL、Oracle、SQL Server等。Fluent-Mybatis提供了对多种数据库的支持,可以方便地进行数据库的切换和操作。 此外,Fluent-Mybatis还提供了缓存和性能优化的功能。在大型项目,性能往往是一个非常关键的因素。Fluent-Mybatis支持对查询结果进行缓存,从而提高了查询的性能。同时,Fluent-Mybatis还提供了一些性能优化的策略和设置,帮助开发人员更好地优化数据库操作的性能。 总之,Fluent-Mybatis是一个适用于大型项目的框架,它通过简化SQL编写、支持动态SQL构建、多数据库操作和性能优化等功能,提高了开发人员在大型项目的开发效率和数据库操作的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值