MP的使用

1、MP简介

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生

官网:MyBatis-Plus 🚀 为简化开发而生

参考教程:https://baomidou.com

2、关键特性和优势

自动填充:MyBatis-Plus提供了自动填充功能,可以自动填充创建时间、最后修改时间等字段

乐观锁:支持乐观锁,可以避免并发更新时的数据冲突 

逻辑删除:支持逻辑删除,通过特定的字段来标记数据是否被删除,而不是真正从数据库中删除数据

自动构建insertupdate语句:通过MyBatis-Plus的API,可以自动构建插入和更新操作的SQL语句,简化代码编写

自动驼峰命名规则:支持数据库表字段与Java对象属性之间的自动驼峰命名规则映射,减少开发者编写映射语句的工作量

自动处理join查询:简化了多表关联查询的复杂性,自动处理join查询的SQL构建。

自动分页:提供了自动分页功能,可以很容易地实现数据的分页查询

3、MP引入步骤

3.1、添加依赖

 <!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!--lombok用来简化实体类--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

3.2、创建实体类并添加注解

mapper层实现BaseMapper接口并指明实体类名称

表示该接口可以对该实体类对应的数据库表进行操作

service层service接口要继承Iservice并指明实体类

serviceimpl实体类要继承serviceimpl指明Mapper层接口和实体类,并实现service接口

3.3、常见注解

用在实体类中

@TableID:标识主键字段

@TableId注解支持两个属性:value,type

type支持的类型:Auto(自增),ASSIGN_ID(雪花唯一算法)

@TableName:标注表名这也是注解的默认属性

@TableField:标明表中字段

属性:value(字段名),exist(是否存在) ,fill(自动填充)
@JsonIgnore:不将该字段返回

@TableLogic:标明该字段是逻辑删除字段isDelete

如果不用注解则要在配置文件中标明

3.4、常见配置

全局id类型


mybatis-plus:type-aliases-package: com.itheima.mp.domain.poglobal-config:db-config:id-type: auto # 全局id类型为自增长

 MP也是支持XML文件自定义SQL的,配置如下

mybatis-plus:mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,当前这个是默认值。

可以看到默认值是classpath*:/mapper/**/*.xml,也就是说我们只要把mapper.xml文件放置这个目录下就一定会被加载

3.5、条件构造器

除了新增以外,修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外,还支持更加复杂的where条件。、

Service接口

MybatisPlus不仅提供了BaseMapper,还提供了通用的Service接口及默认实现,封装了一些常用的service模板方法。 通用接口为IService,默认实现为ServiceImpl

自定义service接口继承Iservice

定义serviceimpl继承Iservice实现service接口并在泛型中标明Mapper层和实体类

package com.itheima.mp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.po.service.IUserService;
import com.itheima.mp.mapper.UserMapper;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements IUserService {
}

我们无需自己通过new的方式来创建Wrapper,而是直接调用lambdaQuerylambdaUpdate方法

也可以避免了条件的直接写死,可以动态的获取实体类属性,代码更加优雅,健硕性更强

@GetMapping("/list")
@ApiOperation("根据id集合查询用户")
public List<UserVO> queryUsers(UserQuery query){// 1.组织条件String username = query.getName();Integer status = query.getStatus();Integer minBalance = query.getMinBalance();Integer maxBalance = query.getMaxBalance();// 2.查询用户List<User> users = userService.lambdaQuery().like(username != null, User::getUsername, username).eq(status != null, User::getStatus, status).ge(minBalance != null, User::getBalance, minBalance).le(maxBalance != null, User::getBalance, maxBalance).list();// 3.处理voreturn BeanUtil.copyToList(users, UserVO.class);
}

可以发现lambdaQuery方法中除了可以构建条件,还需要在链式编程的最后添加一个list(),这是在告诉MP我们的调用结果需要是一个list集合。这里不仅可以用list(),可选的方法有:

  • .one():最多1个结果

  • .list():返回集合结果

  • .count():返回计数结果

 MybatisPlus会根据链式编程的最后一个方法来判断最终的返回结果

3.6、静态工具

有的时候Service之间也会相互调用,为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与IService中方法签名基本一致,也可以帮助我们实现CRUD功能

4、MP个别特性的体现

4.1、数据转换

要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值。 MybatisPlus提供了@EnumValue注解来标记枚举属性

被注解标注的字段是以实例的方式进行传值的,且只能传递在枚举类中定义好的实例

能够实现任意数据类型和枚举之间的转换

对一些长的信息字段可以用注解@JsonValue注解来标注,达到将数据以JSon格式来进行传输

字段类型不在是基本数据类型是自己定义的实体类,需使用@TableField注解并添加参数

typefield=JacksonTypeHandler.class处理器

在UserStatus枚举中通过@JsonValue注解标记JSON序列化时展示的字段

实现多个数据转换成序列化为JSON格式,接收时采用Map,实体类来接收数据

4.2、分页插件

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;}
}

 4.3、实体类继承通用实体类

就是将每个表的通用字段抽取出来形成一个实体类,

别的实体类都去继承该类,达到字段的冗余处理

也方便后续对公共字段进行修改

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

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

相关文章

土地规划中的环境影响评估:守护绿水青山的科学指南

土地规划&#xff0c;作为指导区域开发与保护的蓝图&#xff0c;其决策不仅关乎经济发展&#xff0c;更与生态环境息息相关。环境影响评估&#xff08;EIA&#xff09;作为土地规划不可或缺的一环&#xff0c;旨在预测、评估规划项目对自然环境和社会环境的潜在影响&#xff0c…

英语科技写作 希拉里·格拉斯曼-蒂(英文版)pdf下载

下载链接&#xff1a; 链接1&#xff1a;https://pan.baidu.com 链接2&#xff1a;/s/1fxRUGnlJrKEzQVF6k1GmBA 提取码&#xff1a;b69t 由于是英文版&#xff0c;可能有些看着不太方便&#xff0c;可以在网页版使用以下软件中英文对照着看&#xff0c;看着更舒服&#xff0c;…

【echarts区域地图】

背景&#xff1a;我们在制作大屏的时候&#xff0c;经常会使用到echarts制作各种图表&#xff0c;饼图&#xff0c;柱状图&#xff0c;折线图。有时候也会用到地图的交互&#xff0c;使大屏效果看起来更加高级。 我们要完成上面的效果需要准备什么呢&#xff1f; 首先是需要我…

Gson的基本使用:解析Json格式数据 序列化与反序列化

目录 一&#xff0c;Gson和Json 1&#xff0c;Gson 2&#xff0c;Json 3&#xff0c;Gson处理对象的几个重要点 4&#xff0c;序列化和反序列化 二&#xff0c;Gson的使用 1&#xff0c;Gson的创建 2&#xff0c;简单对象序列化 3&#xff0c;对象序列化&#xff0c;格…

基于ansible进行运维自动化的研究以及相关的属性

一、ansible-简介 介绍 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c; 实现了批量系统配置、批量程序部署、批量运行命令等功能。 无客户端。 …

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

音频处理过程

1、音频 &#xff08;1&#xff09;打开设备 &#xff08;2&#xff09;从音频设备中读取数据 &#xff08;3&#xff09;将音频设备中读取的数据写入文件夹中 &#xff08;4&#xff09; 通过界面控制开始录制和结束录制&#xff08;使用多线程和状态码控制&#xff09; &…

C++与C中,由函数形参test(int *a)引出的问题

文章参考来源&#xff1a; 1.c函数中形参为引用的情况&#xff1b;C中a和&a的区别 描述&#xff1a; 最近在看循环单链表时&#xff0c;看到有篇文章中&#xff0c;链表初始化函数为图下&#xff0c;我在想&#xff0c;这个函数形参(类似 "int * & a"一样)到…

【C# WInForm】将TextBox从输入框设置为文本框

1.需求情形&#xff1a; textbox作为最常用的控件之一&#xff0c;通常是用来输入文本信息或者显示文字&#xff0c;但是如果要在界面中显示大段文本&#xff0c;一个带有边框、可选中的文本样式似乎不合适。像这样&#xff1a; 我需要的是这段文字不仅能跨行&#xff0c;而且…

Geoserver介绍与安装

Geoserver简介 概览 GeoServer是一个使用Java编写的&#xff0c;允许用户分享、编辑地理空间数据的开源软件。它在设计时就考虑了互操作性&#xff0c;其支持使用开放标准发布多数主流格式的空间数据。 作为一个社区驱动的项目&#xff0c;GeoServer由来自世界各地的个人和组…

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼&#xff0c;这里我惯用的就是寻找可进站的思路。这个思路分为两种&#xff0c;一是弱口令进站测试&#xff0c;二是可注册进站测试。依照这个思路&#xff0c;我依旧是用鹰图进行了一波资产的搜集&#xff…

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性&#xff1a; const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

怎么把mac文件拷贝到移动硬盘 Mac拷贝之后Win电脑里看不到 mac拷贝windows文件时出错

Mac文件拷贝到移动硬盘怎么做&#xff1f;文件拷贝实际上是将文件写入磁盘中&#xff0c;因此&#xff0c;Mac系统需要具备写入磁盘的功能与权限&#xff0c;否则无法进行操作。如果出现Mac拷贝之后Win电脑里看不到的问题&#xff0c;很可能是写入功能受限导致的。本文会给大家…

昇思25天学习打卡营第3天 | 张量

张量是现代机器学习框架中的核心数据结构&#xff0c;理解张量的工作方式是深入掌握深度学习和神经网络的基础。 张量的基本概念 张量是一个多维数组&#xff0c;它是标量、向量和矩阵的高维推广。在MindSpore和其他深度学习框架中&#xff0c;张量是存储和操作数据的主要形式…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

【Linux】通过分配虚拟内存的方式来解决因内存不够而导致部署的项目自动挂掉

多个 jar 包项目部署在同一台服务器上&#xff0c;当服务器配置低&#xff0c;内存不足时&#xff0c;有可能出现 nohup java -jar 启动的进程就莫名其妙挂掉的问题。 解决方式&#xff1a; 第一种方法&#xff1a;进行JVM调优可以改善这种情况&#xff0c;但是项目太多&…

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技&#xff1a;Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下&#xff0c;将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…

网闸(Network Gatekeeper或Security Gateway)

本心、输入输出、结果 文章目录 网闸(Network Gatekeeper或Security Gateway)前言网闸主要功能网闸工作原理网闸使用场景网闸网闸(Network Gatekeeper或Security Gateway) 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助…