SpringCloud-持久层框架MyBatis Plus的使用与原理详解

news2024/10/17 21:29:19

在现代微服务架构中,SpringCloud 是一个非常流行的解决方案。而在数据库操作层面,MyBatis Plus 作为 MyBatis 的增强工具,能够简化开发,提升效率,特别是在开发企业级应用和分布式系统时尤为有用。本文将详细介绍 MyBatis Plus 的使用方法、原理及其与 MyBatis 的区别。

在这里插入图片描述


一、MyBatis Plus 简介

1. MyBatis 简介

MyBatis 是一个优秀的 ORM 框架,它通过 XML 或注解的方式将 Java 方法与 SQL 语句进行映射,并且可以灵活地控制 SQL 执行的各个细节,提供极高的自由度。它广泛应用于项目中,尤其是在对 SQL 语句要求比较严格的场景中。

2. MyBatis Plus 介绍

MyBatis Plus 是在 MyBatis 的基础上进行增强的持久层框架,专注于简化 MyBatis 的开发工作。它封装了常用的 CRUD 操作,极大地减少了开发者编写 SQL 的工作量。其目标是“更少的配置,更多的功能”,通过插件机制提供更强大的功能扩展。

3. MyBatis 与 MyBatis Plus 的对比

对比项MyBatisMyBatis Plus
核心理念手写 SQL,灵活但需要大量的 SQL 代码自动化 CRUD,大大减少手写 SQL
SQL 编写需要手动编写所有 SQL 语句提供默认 CRUD 接口,只需少量自定义 SQL
复杂查询需要手动编写复杂 SQL 语句提供条件构造器,简化复杂查询操作
分页需要手动编写分页逻辑内置分页插件,简化分页操作
性能优化自定义 SQL 性能优化较灵活提供多种插件支持性能优化,如 SQL 执行分析插件
代码生成不支持代码生成提供自动代码生成器,支持一键生成 Mapper、Service 等
扩展能力通过配置扩展内置多种插件机制,支持扩展,如乐观锁、审计等

通过这张对比表可以看出,MyBatis Plus 在开发效率和功能扩展上具有显著优势,尤其在企业级开发中,可以大大简化数据库操作的工作。


二、MyBatis Plus 的基本使用

1. 基础依赖和配置

要在 SpringCloud 中使用 MyBatis Plus,首先需要在项目的 pom.xml 中添加 MyBatis Plus 的依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.4</version>
</dependency>

接下来,在 application.yml 中配置数据库连接:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database?useSSL=false
    username: root
    password: your_password
  mybatis-plus:
    mapper-locations: classpath:/mapper/*.xml

2. 实体类的定义

在 MyBatis Plus 中,实体类是映射数据库表的核心。在实体类中,常用 @TableName@TableId 注解来映射表和主键。

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

3. Mapper 接口的编写

Mapper 接口是 MyBatis Plus 提供的基础 CRUD 接口,继承 BaseMapper 就可以拥有常用的 CRUD 功能,无需额外编写 SQL。

public interface UserMapper extends BaseMapper<User> {
}

4. Service 层的实现

为了更好地管理业务逻辑,通常会在 Service 层中编写业务方法。可以通过注入 Mapper 来实现对数据库的操作。

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.selectList(null);
    }

    public void createUser(User user) {
        userMapper.insert(user);
    }
}

三、MyBatis Plus 的高级用法

1. 分页插件

分页是大多数系统必备的功能。MyBatis Plus 内置分页插件,可以通过简单的配置实现高效分页。

@Autowired
private UserMapper userMapper;

public IPage<User> getUsersPage(int pageNum, int pageSize) {
    Page<User> page = new Page<>(pageNum, pageSize);
    return userMapper.selectPage(page, null);
}

2. 乐观锁插件

MyBatis Plus 支持乐观锁,防止多个用户同时修改同一条数据时的并发问题。可以通过在实体类上添加 @Version 注解来启用乐观锁功能。

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @Version
    private Integer version; // 乐观锁版本字段
}

3. 多租户插件

MyBatis Plus 提供了多租户插件,支持在多租户架构中为每个租户分配独立的数据空间,避免数据泄露或冲突。

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 多租户插件配置
        TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor();
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
        return interceptor;
    }
}

4. 自动填充功能

MyBatis Plus 支持自动填充常见字段,如创建时间、更新时间等。可以通过 @TableField 注解配置字段的自动填充策略。

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime; // 自动填充创建时间

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime; // 自动填充更新时间
}

5. 逻辑删除功能

逻辑删除是一种不物理删除数据,而是通过标记删除状态的方式实现删除。MyBatis Plus 提供了逻辑删除支持,可以通过 @TableLogic 注解实现。

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableLogic
    private Integer deleted; // 逻辑删除字段
}

四、MyBatis Plus 原理详解

MyBatis Plus 的原理是基于 MyBatis 的核心功能进行增强,主要通过 插件机制代码生成机制 提供额外的功能支持。

1. 基于 MyBatis 核心的增强

MyBatis Plus 是对 MyBatis 的扩展和增强,在 MyBatis 的基础上引入了大量的插件和自定义功能。例如,通过扩展 BaseMapper,MyBatis Plus 为所有实体类提供了基础的 CRUD 功能,开发者无需编写重复的 SQL。

2. 插件机制

MyBatis Plus 的插件机制非常灵活,允许开发者自定义插件,扩展 MyBatis Plus 的功能。MyBatis Plus 通过 责任链模式 处理多个插件请求,插件之间通过 链式调用 实现功能的扩展。

常见的插件包括:

  • 分页插件:通过在 SQL 执行前后进行拦截,实现分页功能。
  • 多租户插件:通过在 SQL 中自动加入租户 ID 实现数据隔离。
  • 乐观锁插件:通过在 SQL 中自动加入版本号实现并发控制。

3. 条件构造器

MyBatis Plus 提供了 条件构造器,简化了复杂 SQL 的拼装过程。条件构造器基于 Lambda 表达式,能够灵活构建动态查询条件,极大地简化了 SQL 的编写工作。

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(User::getName, "Tom").ge(User::getAge, 18

);
List<User> users = userMapper.selectList(queryWrapper);

4. 自动代码生成器

MyBatis Plus 提供了自动代码生成器,支持通过数据库表结构自动生成实体类、Mapper、Service、Controller 等层的代码,大幅减少手工编写代码的工作量。这一特性非常适合大型项目和快速迭代开发的场景。

5. 动态 SQL 解析

MyBatis Plus 支持动态 SQL 解析,通过注解或 XML 方式在运行时解析 SQL,生成最终的 SQL 语句。这种方式使得 SQL 编写更加灵活,能够适应复杂的业务逻辑。


五、MyBatis Plus 的使用总结

MyBatis Plus 在简化 MyBatis 开发工作、提升开发效率和灵活性方面表现出色。它不仅保留了 MyBatis 的强大 SQL 自定义功能,还通过插件机制和自动化工具提供了更多的扩展功能。

MyBatis Plus 的核心优势:

优势说明
自动化 CRUD通过内置的 CRUD 接口,减少了开发者手动编写 SQL 的工作量。
分页和多租户支持MyBatis Plus 内置分页和多租户插件,能够轻松处理复杂的查询场景。
性能优化通过插件机制和缓存机制,MyBatis Plus 提供多种性能优化手段,保证高效的数据库操作。
代码生成器自动生成常用代码,提升开发效率,加快项目开发速度。

总之,MyBatis Plus 是 SpringCloud 项目中非常优秀的持久层框架。通过其丰富的功能和灵活的扩展机制,可以大幅提升开发效率,特别适用于大规模分布式系统的开发。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我们是不是有点神话了OPENAI和CHATGPT?OPENAI真的Open?

网上很多人大力推荐和神化OPENAI的CHATGPT等产品&#xff0c;好像这神器无所不能!也不知道是VPN代理商为了给自己做广告&#xff1f;还是CHATGPT注册代理推销产品?或者有可能是国外宣传CHATGPT文章直接翻译过来的?不可否认CHATGPT确实是一款伟大的产品&#xff0c;但有些情况…

HarmonyOS的DevEcoStudio安装以及初步认识

目录 1.DevEco下载 2.DevEco安装 3. 未开启Hyper-V 1--开启Hyper-v流程 4.编译错误 5.目录结构 1&#xff09;AppScope 2&#xff09;entry: 3&#xff09;build 4&#xff09;entry->src 5&#xff09;entry->src->main->etc 6&#xff09;entry->src->main…

Shell编程-if和else

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令&#xff0c;以及涉及到部分逻辑判断的问题。从简单来说&#xff0c;他就是Shell编程&#xff0c;…

一键快捷回复软件助力客服高效沟通

双十一临近&#xff0c;电商大战一触即发&#xff01;在这个购物狂欢的热潮中&#xff0c;客服团队的效率至关重要。今天我要和大家分享一个非常实用的快捷回复软件&#xff0c;特别是为电商客服小伙伴们准备的。这款软件能够极大地提高你的工作效率&#xff0c;让你在处理客户…

小程序开发设计-模板与配置:WXML模板语法⑨

上一篇文章导航&#xff1a; 小程序开发设计-协同工作和发布&#xff1a;协同工作⑧-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142455703?spm1001.2014.3001.5501 注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 目录 上一篇文章导航&…

OpenAI 公布了其新 o1 模型家族的元提示(meta-prompt)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

开发板资源介绍【STM32MP157 学习笔记】

引言 FS-MP1A 开发板是基于 ST&#xff08;意法半导体&#xff09;公司的 STM32MP1 系列微处理器设计的先进开发板。该系列处理器集成了 Arm Cortex-A7 和 Cortex-M4 两种内核的异构架构&#xff0c;在高性能和灵活性的基础上&#xff0c;保证了低功耗、实时控制和高度集成化。…

阿里 C++面试,算法题没做出来,,,

我本人是非科班学 C 后端和嵌入式的。在我面试的过程中&#xff0c;竟然得到了阿里​ C 研发工程师的面试机会。因为&#xff0c;阿里主要是用 Java 比较多&#xff0c;C 的岗位比较少​&#xff0c;所以感觉这个机会还是挺难得的。 阿里 C 研发工程师面试考了我一道类似于快速…

深度学习-22-基于keras的十大经典算法之深度神经网络DNN

文章目录 1 深度神经网络(DNN)1.1 DNN简介1.2 DNN基本结构2 模拟应用2.1 构建模型2.2 训练模型2.3 模型预测3 鸢尾花数据集3.1 加载数据3.2 构建模型3.3 训练模型3.4 模型预测4 问题及解决5 参考附录1 深度神经网络(DNN) 1.1 DNN简介 背景:深度神经网络(DNN)也叫多层感…

歌曲怎么去掉原唱只留伴奏?创作无界,轻松获取伴奏音轨

在音乐制作、翻唱或是卡拉OK等场合&#xff0c;我们经常需要歌曲的伴奏版本&#xff0c;即去掉原唱声音&#xff0c;只保留背景音乐的部分。然而&#xff0c;并非每首歌曲都会官方发布伴奏版本&#xff0c;这时我们就需要借助一些技术手段来实现这一目标。本文将介绍几种常见的…

linux线程 | 同步与互斥(上)

前言&#xff1a;本节内容主要是线程的同步与互斥。 本篇文章的主要内容都在讲解互斥的相关以及周边的知识。大体的讲解思路是通过数据不一致问题引出锁。 然后谈锁的使用以及申请锁释放锁的原子性问题。 那么&#xff0c; 废话不多说&#xff0c; 现在开始我们的学习吧&#x…

使用OpenCV实现基于EigenFaces的人脸识别

引言 人脸识别技术近年来得到了飞速的发展&#xff0c;它被广泛应用于安全监控、门禁系统、智能设备等领域。其中&#xff0c;基于特征脸&#xff08;EigenFaces&#xff09;的方法是最早期且较为经典的人脸识别算法之一。本文将介绍如何使用Python和OpenCV库实现一个简单的人…

【LeetCode】每日一题 2024_10_15 三角形的最大高度(枚举、模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;三角形的最大高度 代码与解题思路 久违的简单题 这道题读完题目其实不难想到有两条路可以走&#xff1a; 1、题目很明显只有两种情况&#xff0c;枚举是第一个球是红球还是蓝球这两种情…

导数的概念及在模型算法中的应用

一. 导数概念与计算 1. 导数的物理意义&#xff1a; 瞬时速率。一般的&#xff0c;函数yf(x)在x处的瞬时变化率是 2. 导数的几何意义&#xff1a; 曲线的切线&#xff0c;当点趋近于P时&#xff0c;直线 PT 与曲线相切。容易知道&#xff0c;割线的斜率是当点趋近于 P 时&…

UE5学习笔记25-游戏中时间同步

一、原因 1.由于网络问题会导致服务器上的时间和客户端上获得的时间不一致 二、解决方法 在程序启动时向服务器请求服务器的时间返回给客户端并获得客户端发送消息的往返的时间&#xff0c;在获得客户端上的时间&#xff0c;用服务器上获得的时间加上往返时间减去客户端上的时…

稳字诀! 洞见 强者的社交格局:从不恋战——早读(逆天打工人爬取热门微信文章解读)

都是文字 引言Python 代码第一篇 洞见 强者的社交格局&#xff1a;从不恋战第二篇 稳字诀结尾 引言 今天很奇怪 一直都挺烦造的 好像有很多事情忙 但是就是忙着找不定 不能定下心来 主要还是在股市 其他方面应该没啥 计划表还是不够给力 没办法把心在约定住 稳字诀 勤燃香,奋…

深入 IDEA 字节码世界:如何轻松查看 .class 文件?

前言&#xff1a; 作为一名 Java 开发者&#xff0c;理解字节码对于优化程序性能、调试错误以及深入了解 JVM 运行机制非常重要。IntelliJ IDEA 作为最流行的开发工具之一&#xff0c;为开发者提供了查看 .class 文件字节码的功能。在本文中&#xff0c;我将带你一步步探索如何…

在 Spring 中使用 @EhCache 注解作为缓存

文章目录 项目概况项目设置一个简单的 RESTful Web 服务Spring 整合 EhCache第 1 步&#xff1a;更新依赖项以使用 EhCache Spring 注解第 2 步&#xff1a;设置自定义缓存管理器第 3 步&#xff1a;配置 EhCache第 4 步&#xff1a;测试缓存 刷新缓存总结推荐阅读文章 EhCache…

AD报错failed to add class member\net

什么原因导致的我到现在还没弄懂&#xff0c;总之解决方法是在PCB端删除所有现有的并且可删除的nets与components。下次问题复现了再补充截图&#xff08;不想再遇到了球球了这种玄学问题&#xff09;。 网络截图&#xff1a; 解决步骤&#xff1a;设计->类 把可删除的网络…

【论文翻译】HTVGNN:一种用于交通流量预测的混合时间变化图神经网络

题目A Novel Hybrid Time-Varying Graph Neural Network For Traffic Flow Forecasting论文链接https://arxiv.org/pdf/2401.10155v4关键词交通流预测&#xff0c;图神经网络&#xff0c;Transformer&#xff0c;多头自注意力 摘要 实时且精确的交通流量预测对于智能交通系统的…