mybatisplus介绍以及使用(下)

embedded/2024/9/24 21:16:34/

目录

mybatisplus%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD-toc" style="margin-left:0px;">一、mybatisplus扩展功能

1、代码生成

1.1 安装插件

1.2 使用

 2、逻辑删除

二、插件功能

1、分页插件

2、示例


写在前面:

        在上篇的mybatisplus中介绍到了其概念,其中包括了什么是mybatisplus以及已经有了mybatis但是我们为什么使用它,介绍到了他给我们带来的便利之处(本篇会继续讲解mybatisplus的功能),还介绍到了安装以及一些常用的注解和条件构造器(很重要),那就继续开启新篇章吧!上篇文章入口。

mybatisplus%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD">一、mybatisplus扩展功能

1、代码生成

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

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

1.1 安装插件

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

 然后重启你的idea即可使用

1.2 使用

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

  • 在表中添加一个字段标记数据是否被删除

  • 当删除数据时把标记置为true

  • 查询时过滤掉标记为true的数据

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

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

首先要准备一张数据库的表(注意:需要是一个没有编写三层架构的表不然就不能体现到这款插件的魅力了),然后在菜单栏找到此处

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

 

点击OK保存。

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

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

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

 2、逻辑删除

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

  • 在表中添加一个字段标记数据是否被删除

  • 当删除数据时把标记置为true

  • 查询时过滤掉标记为true的数据

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

要实现逻辑删除其实也很简单,首先需要在数据库表中新增一个逻辑删除的字段,接着要在其对应的实体类中新增逻辑删除的字段对应的属性,接着需要在yaml文件中做如下配置

mybatis-plus:

  global-config:

     db-config:

       ogic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)

       logic-delete-value: 1 # 逻辑已删除值(默认为 1)

       logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

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

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

注意

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

  • 会导致数据库表垃圾数据越来越多,从而影响查询效率

  • SQL中全都需要对逻辑删除字段做判断,影响查询效率

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

二、插件功能

1、分页插件

MybatisPlus提供了很多的插件功能,进一步拓展其功能。目前已有的插件有:

  • PaginationInnerInterceptor:自动分页

  • TenantLineInnerInterceptor:多租户

  • DynamicTableNameInnerInterceptor:动态表名

  • OptimisticLockerInnerInterceptor:乐观锁

  • IllegalSQLInnerInterceptor:sql 性能规范

  • BlockAttackInnerInterceptor:防止全表更新与删除

注意:

使用多个分页插件的时候需要注意插件定义顺序,建议使用顺序如下:

  • 多租户,动态表名

  • 分页,乐观锁

  • sql 性能规范,防止全表更新与删除

这里我们以分页插件为里来学习插件的用法。如果想要了解其他插件请前往官网自行了解。

在未引入分页插件的情况下,MybatisPlus是不支持分页功能的,IServiceBaseMapper中的分页方法都无法正常起效。

所以,我们必须配置分页插件。

首先在项目中新建一个配置类:

 其代码如下:

java">package com.itheima.mp.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 初始化核心插件MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

配置完成之后就可以使用mybatisplus中提供的分页功能了

2、示例

编写一个分页查询的测试:

java">@Test
void testPageQuery() {// 1.分页查询,new Page()的两个参数分别是:页码、每页大小Page<User> p = userService.page(new Page<>(2, 2));// 2.总条数System.out.println("total = " + p.getTotal());// 3.总页数System.out.println("pages = " + p.getPages());// 4.数据List<User> records = p.getRecords();records.forEach(System.out::println);
}

使用提供的分页插件功能之前需要先提供一个page对象,其中封装的有当前页码,每页大小,还有分页结果的排序条件,全部封装完之后调用mybatisplus提供的分页方法然后将分页对象传入进去即可,此处直接在参数部分new了一个page对象未指定排序字段以及排序规则。

运行结果如下:

 从运行结果中的sql语句中可以看出mybaitsplus帮我们拼接了limit分页条件

如果想要指定排序方法以及指定字段可以参考以下方法

java">int pageNo = 1, pageSize = 5;
// 分页参数
Page<User> page = Page.of(pageNo, pageSize);
// 排序参数, 通过OrderItem来指定
page.addOrder(new OrderItem("balance", false));
userService.page(page);

orderItem即是封装排序字段以及指定升序还是降序的对象、此处指定排序字段为balance且为降序排列。


http://www.ppmy.cn/embedded/116265.html

相关文章

Java基础知识扫盲

目录 Arrays.sort的底层实现 BigDecimal(double)和BigDecimal(String)有什么区别 Char可以存储一个汉字吗 Java中的Timer定时调度任务是咋实现的 Java中的序列化机制是咋实现的 Java中的注解是干嘛的 Arrays.sort的底层实现 Arrays.sort是Java中提供的对数组进行排序的…

uniapp|微信小程序 实现输入四位数 空格隔开

<template><page-meta :page-style"cssVar"></page-meta><view class"container"><u-navbartitle"优惠券兑换"placeholderbgColor"#fff":autoBack"true":titleStyle"{fontFamily: SourceHa…

nginx基础篇(一)

文章目录 学习链接概图一、Nginx简介1.1 背景介绍名词解释 1.2 常见服务器对比IISTomcatApacheLighttpd其他的服务器 1.3 Nginx的优点(1)速度更快、并发更高(2)配置简单&#xff0c;扩展性强(3)高可靠性(4)热部署(5)成本低、BSD许可证 1.4 Nginx的功能特性及常用功能基本HTTP服…

Kotlin while 和 for 循环(九)

导读大纲 1.1 while 和 for 循环1.1.1 while 循环1.1.2 范围和级数&#xff1a;for循环 1.1 while 和 for 循环 Kotlin 中的迭代与 Java、C# 或其他语言中的迭代非常相似 while 循环与其他语言中的传统形式相同, 只需简单了解一下即可还会发现 for 循环,其写法为 for ( in ) 是…

【图像匹配】基于SIFT算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于SIFT算法的图像匹配&#xff0c;用matlab实现。 一、案例背景和算法介绍 本…

频率色散效应及其与时间选择性衰落信道的联系

频率色散效应&#xff08;Frequency Dispersion Effect&#xff09;是在无线通信中&#xff0c;由于信道中的多普勒效应引起的现象&#xff0c;它会导致接收信号频谱的扩展和频率上的变化。该效应与信道的时间变化有关&#xff0c;是时间选择性衰落信道&#xff08;time-select…

新峰商城之分类三级联动实现

新峰商城是一个开源电子商务网站&#xff08;SpringBoot项目&#xff09;&#xff0c;本文主要简述它的商品分类中三级联动功能的实现。 一、多层级联动效果的常见场景 二、三级联动或者更多层级的数据联动是常见交互方式&#xff0c;它可以提升用户体验&#xff0c;限制用户随…

自学前端的正确姿势是...

师傅带进门&#xff0c;修行在个人。 在前端自学成才的道路上&#xff0c;有些人走的很快&#xff0c;有些人却举步维艰。 为什么会这样子呢&#xff1f;因为他们没有掌握自学前端的正确姿势。 在介绍应该要怎样自学前端之前&#xff0c;首先来看下&#xff0c;自学前端容易…