MyBatis-Plus:简化 CRUD 操作的艺术

news/2025/1/17 8:59:21/文章来源:https://www.cnblogs.com/ccdm/p/18516879

一、关于MyBatis-Plus

1.1 简介

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。

9e920e5e-2e5b-4031-b546-1088ec5fa2e3

image

关于Mybatis

简介

MyBatis 是一款流行的 Java 持久层框架,旨在简化 Java 应用程序与数据库之间的交互。与传统的 ORM(对象关系映射)框架不同,MyBatis 提供了更大的灵活性,允许开发者自定义 SQL 语句。

91619c90-d7c3-4bd6-964d-0303af8ff2da

发展

初始阶段 - iBatis

  • 2001年:iBatis 项目由 Clinton Begin 发起,最初是一个开源项目,主要用于密码软件的开发,后来演变成一个基于 Java 的持久层框架。
  • 2004年:Clinton Begin 将 iBatis 的名字和源代码捐赠给了 Apache 软件基金会(ASF),成为 Apache 孵化器中的一个项目。在此期间,iBatis 成为了一个成熟的框架,被广泛应用于各种 Java 应用程序中。

转型期 - 从 iBatis 到 MyBatis

  • 2010年6月:iBatis 项目的核心开发团队决定将项目从 ASF 迁移到 Google Code,并将项目名改为 MyBatis。这次迁移标志着 iBatis 项目的重生,并引入了一些新的特性和改进。
  • 2013年11月:随着 Google Code 的服务逐步关闭,MyBatis 项目迁移至 GitHub,继续其开发和维护。

现代化与持续发展

  • 自从迁移到 GitHub 后,MyBatis 社区继续活跃,项目得到了持续的更新和完善。MyBatis 通过提供更好的 API 设计、更丰富的功能以及更高的灵活性,成为了许多 Java 开发者的首选持久层解决方案。
  • MyBatis 的设计使其能够很好地与其他 Java 框架(如 Spring)集成,同时也支持多种数据库管理系统(DBMS),这使得它成为一个非常灵活的选择。

特点

  1. SQL 语句映射:MyBatis 允许开发者通过 XML 或注解方式定义 SQL 语句,并将这些 SQL 语句与 Java 方法进行映射。
  2. 灵活性:与 ORM 框架相比,MyBatis 提供了更高的 SQL 自定义能力,开发者可以手动编写复杂的 SQL 语句,以满足具体的业务需求。
  3. 支持多种数据库:MyBatis 支持多种关系型数据库,便于在不同的环境中使用。
  4. 对象关系映射:虽然 MyBatis 不像 Hibernate 那样全面支持 ORM,但它提供了基本的对象映射功能,可以将数据库表中的记录映射为 Java 对象。
  5. 动态 SQL:MyBatis 支持动态 SQL,可以根据条件生成不同的 SQL 语句,提高了查询的灵活性。
  6. 缓存机制:MyBatis 提供了一级和二级缓存,能够提高数据库访问的性能,减少重复的数据库操作。
  7. 事务管理:MyBatis 支持与 Spring 等框架集成,方便管理数据库事务。

1.2 发展

MyBatis-Plus(简称 MP)是在 MyBatis 的基础上进行功能增强和扩展的一个开源项目,旨在进一步简化基于 MyBatis 的数据访问层(DAO)开发。以下是 MyBatis-Plus 的主要发展历程:

  1. 2016 年初

    • MyBatis-Plus 项目初始创建,最初由 baomidou (苞米豆)团队发起,旨在解决 MyBatis 使用过程中的繁琐代码和重复性工作,提供更便捷的 CRUD 操作和通用的查询功能。MyBatis-Plus 的名称直接表明了它与 MyBatis 的关系,即在 MyBatis 的基础上做了增强,而不是替代或改变 MyBatis 的原有功能。
  2. 功能逐步扩展

    • 初始阶段,MyBatis-Plus 主要集中在通用 CRUD 方法的封装和简化,以及一些便捷的查询功能,比如条件构造器等。
  3. 2017 年

    • MyBatis-Plus 在社区的支持下,逐步增加了更多实用的功能模块,如代码生成器、分页插件、性能分析插件等,使得开发者能够更高效地进行开发工作。
  4. 2018 年

    • MyBatis-Plus 发布了一系列更新版本,加强了对 Lambda 表达式的支持,使得在条件构造时可以更加简洁和直观,同时提高了查询的类型安全性。
  5. 2019 年

    • MyBatis-Plus 继续扩展其功能,引入了更多的增强特性和插件,如全局拦截器、SQL 注入器等,进一步增强了其在复杂应用场景下的灵活性和扩展性。
  6. 2020 年以后

    • MyBatis-Plus 持续稳定更新,解决了社区反馈的 bug 和安全问题,同时继续优化和增强现有功能,保持与最新技术的兼容性和整合性。

1.3 特性

  1. 无侵入设计:MyBatis-Plus 对 MyBatis 的核心功能进行了增强,使用时不需要对原有的 MyBatis 代码做过多改动。
  2. CRUD 操作的简化:提供了通用 Mapper 和通用 Service,开发者只需继承相应的接口即可实现基本的 CRUD 操作,减少了重复代码。
  3. 条件构造器:MyBatis-Plus 提供了 Lambda 形式的条件构造器,便于进行复杂的查询条件构造,提高了代码的可读性和维护性。
  4. 分页插件:内置分页功能,开发者可以轻松实现数据的分页查询,无需手动编写 SQL。
  5. 性能分析:提供 SQL 性能分析功能,可以查看执行的 SQL 语句及其性能,便于优化。
  6. 代码生成器:内置代码生成器,可以根据数据库表自动生成对应的实体类、Mapper 接口等,进一步提高开发效率。
  7. 多种扩展功能:支持乐观锁、逻辑删除、代码生成、注解驱动等功能,增强了应用的灵活性。

1.4 支持数据库

image

二、架构原理

image

2.1 核心组件

  1. AutoMapper:这是 MyBatis-Plus 中一个重要的抽象,它负责自动生成 CRUD 操作的 SQL 语句。开发者可以通过继承 BaseMapper<T>​ 接口来实现自己的 Mapper 接口。
  2. ServiceImpl:这是 MyBatis-Plus 提供的服务实现类,它继承自 ServiceImpl<T, IId>​,为 Service 层提供了一系列常用的方法。
  3. Entity:这是 MyBatis-Plus 中用于表示数据库表的实体类,通常继承自 BaseEntity​,以便利用一些通用属性和方法。
  4. Configuration:配置 MyBatis-Plus 的各种行为,如分页、日志记录等。
  5. Interceptor:拦截器,可以用来拦截 SQL 语句,例如分页插件、性能分析插件等。

2.2 主要模块

  1. CRUD 操作:提供了诸如 insert()​, updateById()​, deleteById()​ 等方法,简化了 CRUD 操作。
  2. Lambda 表达式:允许使用 Java 8 的 Lambda 表达式来构建查询条件,提高了代码的可读性和安全性。
  3. 分页插件:内置的分页功能,通过简单的配置即可启用。
  4. 代码生成器:提供了一个命令行工具,可以快速生成基础的 Mapper、Model、Service、Controller 层代码。
  5. 全局拦截器:可以全局拦截 SQL 语句,进行一些额外的操作,比如记录日志、SQL 分析等。

2.3 工作原理

初始化阶段

  1. SqlSessionFactoryBuilder:MyBatis-Plus 使用 MyBatis 的 SqlSessionFactoryBuilder​ 来构建 SqlSessionFactory​,这是 MyBatis-Plus 应用程序启动的第一步。
  2. SqlSessionFactorySqlSessionFactory​ 创建 SqlSession​,SqlSession​ 负责执行 SQL 语句,并将结果映射到 Java 对象。
  3. Configuration:配置文件被解析,配置 MyBatis-Plus 的各种行为,如分页插件的配置等。

执行阶段

  1. Mapper 接口调用:开发者通过调用 Mapper 接口中定义的方法来触发 SQL 操作。
  2. SQL 语句生成:根据传入的参数,MyBatis-Plus 自动生成相应的 SQL 语句。例如,使用 lambdaQuery()​ 方法可以生成带有条件的 SQL。
  3. SQL 执行:SQL 语句通过 SqlSession​ 执行,结果被映射到对应的 Java 对象。
  4. 结果返回:执行结果被封装后返回给调用方。

特殊功能实现

  1. 分页功能:通过全局拦截器自动添加分页信息到 SQL 语句中,实现分页查询。
  2. 性能分析:同样通过全局拦截器记录 SQL 执行时间和慢查询,帮助优化数据库访问。
  3. Lambda 表达式支持:利用 Java 8 的 Lambda 表达式来构建查询条件,提高了代码的可读性和可维护性。

MyBatis-Plus 通过一系列的设计模式和插件机制,极大地简化了基于 MyBatis 的应用程序开发。它通过自动化的 CRUD 操作、Lambda 表达式支持、内置分页插件等功能,降低了开发者的负担,并提高了开发效率。同时,它还提供了代码生成器,进一步加快了开发速度。这些特性使得 MyBatis-Plus 成为一个非常受欢迎的 MyBatis 扩展工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824450.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis持久化机制与位图api

持久化机制 将我们的内存数据 通过数据持久化写入磁盘中实现持化、 Redis官方提供了两种不同的持久化方法来将内存的数据存储到硬盘里面分别是:RDB持久化,快照(Snapshot)【默认】 AOF (Append Only File) 只追加日志文件【默认不开启】1.快照(snapshot)(关机慢开机快) redis…

js基础必看系列--2024-10-30总结

好的书写习惯最好不要省略分号,尤其对新手来说 确保 “use strict” 出现在最顶部"use strict"; 代码以现代模式工作【ES5 规范增加了新的语言特性并且修改了一些已经存在的特性。为了保证旧的功能能够使用,大部分的修改是默认不生效的。你需要一个特殊的指令 ——…

数据结构 - 散列表,三探之代码实现

本文介绍散列表代码实现,使用取模方式构建散列函数,实现链式法和开放寻址法(线性探测)解决碰撞,包含初始化、插入、删除、查找等功能,并实现了再散列方法,代码已上传至代码库。书接上回,我们继续来聊散列表的代码实现。相信通过前面两章对散列表的学习,大家应该已经掌…

yolo --- 名词解释

MAP 综合衡量检测结果(所有置信度阈值对应的精度、召回率的平均,即下图红线面积,面积越大,效果越好;理想效果是任何召回率下精度都是1) 置信度:判断为目标的概率(0~1)精度和召回率 TP:正确的判断出目标(目标判断为目标) FP:错误的判断为目标(非目标判断为目标) …

GPT释放的意图识别想象力

一、ChatGPT与GPTChatGPT是一个聊天应用。一个输入框,输入你想问他的任何问题,他会给你一个答案,并且这个答案看起来是经过思考、讲究语法并且正确的。他理解你的语言,并能用你的语言给你答案。 而这背后,就是GPT这个大模型在发挥作用(Generative Pre-trained Transforme…

ONM-OncoImmunology

OncoImmunology涉及对癌症的自然或治疗诱导的识别,以及肿瘤发生、炎症和免疫监测之间复杂的相互作用。@目录一、征稿简介二、重要信息三、服务简述四、投稿须知 一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述 肿瘤及肿瘤免疫相关的研究 OncoImmunol…

一维差分模板

一维差分模板 题目描述: 输入一个长度为 n的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。 请你输出进行完所有操作后的序列。 输入格式: 第一行包含两个整数 n 和 m。 第二行包含 n 个整数,表示整数序列。 接下来 m …

计量经济学(十五)的理论基础——时间序列分解定理

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 时间序列分析是数据科学中的一个重要分支,旨在探索和理解随着时间变化的数据背后的模式和结构。无论是在金融市场预测、经济政策分析、环境监测还是医学研究…

程序员必备单品:超级常用的linux指令+实际操作案例

Linux常用命令 在Linux系统中,有许多常用的命令可以帮助用户进行文件管理、系统监控、网络配置等操作。以下是一些常见的Linux命令及其具体使用案例: ls:列出目录内容基本用法:ls [选项] [目录]常见参数:-a:显示所有文件,包括以.开头的隐藏文件。 -l:使用长列表格式显示…

数据采集第三次作业

代码链接:第三次数据采集实践作业码云链接 1 作业1 1.1 作业要求指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后…

学习笔记(十五):ArkUi-切换按钮 (Toggle)

概述: 提供状态按钮样式、勾选框样式和开关样式,一般用于两种状态之间的切换 一、创建单选框 接口形式如下: type为类型,支持三种 1、Switch 不包含子组件Toggle({type:ToggleType.Switch,isOn:true}) 2、Checkbox 不包含子组件Toggle({type:ToggleType.Checkbox,isOn:tru…