MybatisPlus 扩展功能 代码生成 逻辑删除 通用枚举 字段类型处理器 配置加密

news2024/11/27 19:53:43

MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具_软工菜鸡的博客-CSDN博客

3.扩展功能

3.1.代码生成

在使用MybatisPlus以后,基础的MapperServicePO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成POMapperService等相关代码。只不过代码生成器同样要编码使用,也很麻烦。

这里推荐大家使用一款MybatisPlus的插件,它可以基于图形化界面完成MybatisPlus的代码生成,非常简单。

3.1.1.安装插件

Idea的plugins市场中搜索并安装MyBatisPlus插件:

然后重启你的Idea即可使用。

3.1.2.使用

刚好数据库中还有一张address表尚未生成对应的实体和mapper等基础代码。我们利用插件生成一下。

首先需要配置数据库地址,在Idea顶部菜单中,找到other,选择Config Database

在弹出的窗口中填写数据库连接的基本信息:

点击OK保存。

然后再次点击Idea顶部菜单中的other,然后选择Code Generator:

在弹出的表单中填写信息:

最终,代码自动生成到指定的位置了:

3.2.逻辑删除

对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:

  • 在表中添加一个字段标记数据是否被删除
  • 删除数据时把标记置为true
  • 查询时过滤掉标记为true的数据

一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。

注意,只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除

:::

例如,我们给address表添加一个逻辑删除字段:

alter table address
	add deleted bit default b'0' null comment '逻辑删除';

然后给Address实体添加deleted字段:

接下来,我们要在application.yml中配置逻辑删除字段:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

测试:

首先,我们执行一个删除操作:

@Test
void testDeleteByLogic() {
    // 删除方法与以前没有区别
    addressService.removeById(59L);
}

方法与普通删除一模一样,但是底层的SQL逻辑变了:

查询一下试试:

@Test
void testQuery() {
    List<Address> list = addressService.list();
    list.forEach(System.out::println);
}

会发现id为59的确实没有查询出来,而且SQL中也对逻辑删除字段做了判断:

综上, 开启了逻辑删除功能以后,我们就可以像普通删除一样做CRUD,基本不用考虑代码逻辑问题。还是非常方便的。

注意

逻辑删除本身也有自己的问题,比如:

  • 会导致数据库表垃圾数据越来越多,从而影响查询效率
  • SQL中全都需要对逻辑删除字段做判断,影响查询效率

因此,不太推荐用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。

3.3.通用枚举

User类中有一个用户状态字段:

像这种字段我们一般会定义一个枚举,做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型,对应的PO也是Integer。因此业务操作时必须手动把枚举Integer转换,非常麻烦。

因此,MybatisPlus提供了一个处理枚举的类型转换器,可以帮我们枚举类型与数据库类型自动转换

3.3.1.定义枚举

我们定义一个用户状态的枚举:

代码如下:

package com.itheima.mp.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结")
    ;
    private final int value;
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

然后把User类中的status字段改为UserStatus 类型:

要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值

MybatisPlus提供了@EnumValue注解来标记枚举属性

3.3.2.配置枚举处理器

在application.yaml文件中添加配置:

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

3.3.3.测试

@Test
void testService() {
    List<User> list = userService.list();
    list.forEach(System.out::println);
}

最终,查询出的User类的status字段会是枚举类型

3.4.字段类型处理器

数据库的user表中有一个info字段,是JSON类型:

格式像这样:

{"age": 20, "intro": "佛系青年", "gender": "male"}

而目前User实体类中却是String类型:

这样以来,我们要读取info中的属性时就非常不方便。如果要方便获取,info的类型最好是一个Map或者实体类。

而一旦我们info改为对象类型,就需要在写入数据库(Json类型)时手动转为String,再读取数据库时,手动转换为对象,这会非常麻烦。

因此MybatisPlus提供了很多特殊类型字段的类型处理器,解决特殊字段类型与数据库类型转换的问题。例如处理JSON就可以使用JacksonTypeHandler处理器。

选用Jackson的理由:他是JSON处理器最常用的对象

接下来,我们就来看看这个处理器该如何使用。

3.4.1.定义实体

首先,我们定义一个单独实体类来与info字段的属性匹配:

代码如下:

package com.itheima.mp.domain.po;

import lombok.Data;

@Data
public class UserInfo {
    private Integer age;
    private String intro;
    private String gender;
}

3.4.2.使用类型处理器

接下来,将User类的info字段修改为UserInfo类型,并声明类型处理器:

第一次测试info没查出来,是因为对象嵌套没配resultMap,要加autoResultMap

第二次测试可以发现,所有数据都正确封装到UserInfo当中了:

3.5.配置加密

目前我们配置文件中的很多参数都是明文,如果开发人员发生流动,很容易导致敏感信息的泄露。所以MybatisPlus支持配置文件的加密和解密功能。

我们以数据库的用户名和密码为例。

3.5.1.生成秘钥

首先,我们利用AES工具生成一个随机秘钥,然后对用户名、密码加密:

package com.itheima.mp;

import com.baomidou.mybatisplus.core.toolkit.AES;
import org.junit.jupiter.api.Test;

class MpDemoApplicationTests {
    @Test
    void contextLoads() {
        // 生成 16 位随机 AES 密钥
        String randomKey = AES.generateRandomKey();
        System.out.println("randomKey = " + randomKey);

        // 利用密钥对用户名加密
        String username = AES.encrypt("root", randomKey);
        System.out.println("username = " + username);

        // 利用密钥对用户名加密
        String password = AES.encrypt("MySQL123", randomKey);
        System.out.println("password = " + password);

    }
}

打印结果如下:

randomKey = 6234633a66fb399f
username = px2bAbnUfiY8K/IgsKvscg==
password = FGvCSEaOuga3ulDAsxw68Q==

3.5.2.修改配置

修改application.yaml文件,把jdbc的用户名、密码修改为刚刚加密生成的密文

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: mpw:QWWVnk1Oal3258x5rVhaeQ== # 密文要以 mpw:开头
    password: mpw:EUFmeH3cNAzdRGdOQcabWg== # 密文要以 mpw:开头

3.5.3.测试

在启动项目的时候,需要把刚才生成的秘钥添加到启动参数中,像这样:

--mpw.key=6234633a66fb399f

单元测试的时候不能添加启动参数,所以要在测试类的注解上配置

然后随意运行一个单元测试,可以发现数据库查询正常。

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

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

相关文章

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译&#xff0c;先设置LD_LIBRARY_PATH&#xff0c;再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

高德Android高性能高稳定性代码覆盖率技术实践

前言 代码覆盖率(Code coverage)是软件测试中的一种度量方式&#xff0c;用于反映代码被测试的比例和程度。 在软件迭代过程中&#xff0c;除了应该关注测试过程中的代码覆盖率&#xff0c;用户使用过程中的代码覆盖率也是一个非常有价值的指标&#xff0c;同样不可忽视。因为…

Spring 6.0和SpringBoot 3.0新特性

目录 主要更新内容是以下几个&#xff1a; AOT编译 Spring Native GraalVM SpringBoot3生成二进制可执行文件底层流程 主要更新内容是以下几个&#xff1a; A Java 17 baselineSupport for Jakarta EE 10 with an EE 9 baselineSupport for generating native images with…

录音转写和AI质检的区别和使用场景

区别&#xff1a; 录音转写是将语音或录音转化为文本形式的过程。它通常涉及使用自然语言处理技术和语音识别算法来将音频文件中的语音转换为可读的文本格式。 AI质检是一种利用人工智能技术对客户服务、销售和其他电话中心交互进行自动化评估的过程。通过分析和评估客户和代…

【C++】STL案例2-员工分组

#include <iostream> using namespace std;#include<vector> #include<map>#define CHEHUA 0 //策划部门 #define MEISHU 1 //美术部门 #define YANFA 2 //研发部门class Worker { public:string m_Name;int m_Salary; };void createWorker(vector<…

flask使用Flask-Mail实现邮件发送

Flask-Mail可以实现邮件的发送&#xff0c;并且可以和 Flask 集成&#xff0c;让我们更方便地实现此功能。 1、安装 使用pip安装&#xff1a; $ pip install Flask-Mail或下载源码安装&#xff1a; $ git clone https://github.com/mattupstate/flask-mail.git $ cd flask-…

Java线程与锁常考知识点

Java线程与锁常考知识点 基础篇1. 创建线程的几种方式2. 线程池创建的方式3. 线程池提交任务的流程4. 线程池有哪些状态 进阶篇1. 说说对线程安全的理解2. 对守护线程的理解3. ThreadLocal的底层原理4. 并发、并⾏、串⾏之间的区别5. Java死锁如何避免&#xff1f;6. 线程池的底…

滑动窗口实例8(最小覆盖子串)

题目&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t…

C/C++中FILE指针的使用总结

在C中&#xff0c;FILE指针是一个用于文件操作的指针类型。它是C语言标准库中的一部分&#xff0c;也被C所继承。通过使用FILE指针&#xff0c;我们可以打开、读取、写入和关闭文件。 在C中&#xff0c;FILE指针通常与标准库中的文件操作函数一起使用&#xff0c;例如fopen(),…

通俗易懂玩QT:QStackedWidget 学习

QStackedWidget 学习 一、介绍 业务需求&#xff0c;用到了 QStackWidget 这个类&#xff0c;然后程序存在很严重的内存泄露问题&#xff0c;所以特意研究了一下 QStackWidget 类&#xff0c;QStackWidget 类的功能是窗体切换&#xff0c;它比 QTabWidget 使用起来更为灵活&a…

【高等数学基础知识篇】——不定积分

文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…

架构设计基础设施保障IaaS计算

目录 1 IaaS概述2 服务部署演进历程3 云虚拟机4 云虚拟机如何选型5 云虚拟机的创建操作6 服务部署访问 1 IaaS概述 云计算并不是一种单一类型的产品&#xff0c;而是为满足企业各种IT需求而提供的多种服务。 通过云计算提供的一类这样的服务是基础设施即服务&#xff08;IaaS&a…

蓝桥杯备赛(Day5)——二叉树

二叉树存储 普通做法&#xff0c;二叉树一个节点包括结点的数值以及指向左右子节点的指针 在class Node中 def __init__(self,s,lNone,rNone):self.valNoneself.llself.rr 在竞赛中&#xff0c;我们往往使用静态数组实现二叉树&#xff0c;定义一个大小为N的静态结构体数组…

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代&#xff0c;跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具&#xff0c;可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

英诺森供应链一体化平台解析

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK&#xff0c;并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目&#xff0c;编写代码Go 代码示例&#xff1a;项目目录结构展示&#xff1a; 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK&#xff0c;并开源…

记一次以太网连接失败修复

症状: 很久没用这个电脑了&#xff0c;开机以后&#xff0c;发现连不上校园网。 遂检查网线&#xff0c;发现网线连在自己笔记本是可以用的&#xff0c;说明网线没问题。 但是网线连在主机是红灯常亮黄灯闪烁&#xff0c;怀疑是网卡有问题&#xff08;后证明不是&#xff0c…

成都车展:比亚迪“豹力美学”杀入硬派SUV市场

在熙熙攘攘人头攒动的2023成都国际车展上&#xff0c;如果要评选一家人气最旺的车企展台&#xff0c;那必然非比亚迪莫属。 在比亚迪现场展示的多款车型中&#xff0c;作为比亚迪旗下方程豹品牌的首款车型&#xff0c;以“超级混动硬派SUV”著称的方程豹5&#xff0c;自然吸引了…

nuxt中extendRoutes添加多个扩展路由

文档中https://www.nuxtjs.cn/api/configuration-router有写使用extendRoutes添加多个路由 添加多个路由&#xff0c;数组拼接只能使用push&#xff0c;其实均不管用

【王道】操作系统笔记 第一章 操作系统概述

1.1.1 操作系统的概念和功能 我们熟悉的操作系统有哪些&#xff1f; 从计算机系统的层次结构上看操作系统&#xff1a; 以一台电脑的诞生为例&#xff1a; 第一步&#xff0c;厂家组装一台裸机 第二步&#xff0c;出售前安装操作系统 第三步&#xff0c;用户安装应用程序 第四…