当前位置: 首页 > news >正文

MybatisPlus概述

MybatisPlus概述

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

特点

  1. 无侵入

  2. BaseMapper(条件构造器)

  3. 内置分页

  4. 全局拦截插件

快速入门

1. 创建数据库

DROP TABLE IF EXISTS `user`;CREATE TABLE `user`
(id BIGINT NOT NULL COMMENT '主键ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT NULL DEFAULT NULL COMMENT '年龄',email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (id)
);
INSERT INTO `user` (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

2. 初始化springboot项目

<!--连接数据库-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
<!--mybatisPlus-->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

3. 配置数据库连接对象

spring:datasource:url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driverpassword: rootusername: root

4. 创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {private Long id;private String name;private int age;private String email;
}

5. 编写接口

@Repository
@Mapper
public interface UserMapper extends BaseMapper<User> {}

6. test测试

@SpringBootTest
class MybatisplusApplicationTests {@Autowiredprivate UserMapper userMapper;@Testvoid contextLoads() {List<User> userList = userMapper.selectList(null);userList.forEach(System.out::println);}}

配置日志

我们所有的sql现在不可见,需要到日志功能

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

CRUD拓展

插入操作

插入

@Test
public void testInsert(){User user = new User();user.setName("张三");user.setAge(18);user.setEmail("123123@qq.com");int res = userMapper.insert(user);System.out.println(res);//受影响行数System.out.println(user);//id会自动回填
}

 数据库插入的id的默认值为:全局唯一的id

主键生成策略

默认 ASSIGN_ID

分布式系统唯一id生成策略:分布式系统唯一ID生成方案汇总 - nick hao - 博客园 (cnblogs.com)

雪花算法:

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0,可以保证全球唯一。

主键自增

  1. 实体类字段上增加@TableId(type = IdType.AUTO)

  2. 数据库字段是自增的

  3. 再次测试插入

 其余源码解释

AUTO(0),//自增
NONE(1),//未设置主键
INPUT(2),//手动输入
ASSIGN_ID(3),//默认的全局id
ASSIGN_UUID(4);//全局唯一id  uuid

 更新操作

    public void testUpdate(){User user = new User();user.setId(6L);user.setName("李四");int res = userMapper.updateById(user);//虽然此时是byid,但传入的是一个对象}

 

 所有的sql都会自动动态给你配置

自动填充策略

创建时间,修改时间,这些操作都是自动完成的,我们不希望手动更新

阿里开发手册:所有的数据库表:gmt_create,gmt_modified几乎所有的表都具备,而且需要自动化。

数据库级别

1. 在表中新建字段create_time,update_time

2. 与实体类同步

代码级别

1. 删除数据库默认值

2.实体类的字段上增加注解

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

 3. 编写处理器处理注解

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");//MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);}
}

 乐观锁

乐观锁:无论出现什么问题都不会去上锁,如果出现问题就在测试加锁处理,再次更新值测试

悲观锁:无论干什么都会上锁

  • 取出记录时,获取当前 version

  • 更新时,带上这个 version

  • 执行更新时, set version = newVersion where version = oldVersion

  • 如果 version 不对,就更新失败

测试:

1. 数据库字段中增加version字段为1

2. 同步实体类

@Version
private Integer version;

3.  注册乐观锁组件

@EnableTransactionManagement
@Configuration
@MapperScan("com.sfy.mybatisplus.dao")
public class MybatisPlusConfig {//注册乐观锁插件@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}

4. 测试:

成功案例:

@Test
public void TestOptimisticLocker(){User user = userMapper.selectById(6l);user.setName("王五");userMapper.updateById(user);
}

 

失败案例:

 此时可以使用自旋锁进行操作

@Test
public void TestOptimisticLocker2(){User user = userMapper.selectById(6l);user.setName("王五1");//模拟另一个线程插队User user1 = userMapper.selectById(6l);user1.setName("王五2");userMapper.updateById(user1);userMapper.updateById(user);//如果没有乐观锁就会覆盖插队线程}

查询操作

1. 单次查询

User user = userMapper.selectById(1l);

2.  批量查询

List<User> users = userMapper.selectBatchIds(Arrays.asList(1l, 2l, 3l));

3.  条件查询

HashMap<String,Object> map = new HashMap<>();
map.put("name","张三");
List<User> users1 = userMapper.selectByMap(map);
users1.forEach(System.out::println);

 

会自动进行sql拼接

分页查询

  1. 使用limit语句

  2. 使用pageHelper

  3. MP中内置分页插件

1. 导入插件

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor2() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;
}

2. 直接使用即可

 在分页查询之间会进行一次查询总数

删除操作

1. 单条删除

userMapper.deleteById(1l);

2.  批量删除

userMapper.deleteBatchIds(Arrays.asList(1l, 2l, 3l));

3. 条件删除

HashMap<String, Object> map = new HashMap<>();
map.put("name","张三");
userMapper.selectByMap(map);

逻辑删除

物理删除:数据库字段被删除

逻辑删除:数据库字段并没有被删除,而是通过变量使他失效

管理员可以查看被删除得记录,防止数据得丢失,类似于回收站

1. 数据库中添加deleted字段,默认值为0;

2. 同步字段

@TableLogic
private Integer deleted;

 3. 配置yml文件

global-config:db-config:logic-delete-value: 1logic-not-delete-value: 0

4. 测试

实际上是进行了一次更新操作

条件构造器Wrapper

可以进行复杂得条件查询

allEq:条件进行拼接

eq:等于

ne:不等于

gt:大于

ge:大于等于

lt:小于

Ie:小于等于

between:范围查询

like:模糊查询

isNull:为空

in:设置条件得范围

相关文章:

MybatisPlus概述

MybatisPlus概述 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象操作强大的 CRUD 操作&#xff1a;内置通用 Mapper、通…...

C++之枚举与宏定义

1 枚举enum C的枚举类型可以用来表示一组有限且固定的值。比如在如下代码中&#xff1a; enum Color { RED, GREEN, BLUE };定义了Color的枚举类型&#xff0c;分别对应三种不同的颜色。C编译器会为枚举类型的常量分配整数值&#xff0c;从0开始递增。因此&#xff0c;在这个…...

DAPP开发【09】NFT交易市场开发(hardhat测试)

测试文件下新建market.js文件 扁平化&#xff0c;将所有依赖放在tmp.sol&#xff0c;可以去给他人使用 npx hardhat flatten > tmp.sol 测试文件 const {expect} require(chai); const {ethers} require(hardhat);describe(Market,async function(){//定义三个合约&a…...

【Spring Boot】如何通过RestTemplate获取另一个服务的接口返回信息

背景 在查询订单信息的时候&#xff0c;需要获取用户的信息&#xff0c;同时订单和用户分属于不同的服务中&#xff0c;并且服务的数据库的数据分开的&#xff0c;其直接连接数据库并操作数据库是不可以的。那我们可以通过RestTemplate对象请求另一个服务的API接口获取相关的响…...

文字识别(OCR)专题——基于NCNN轻量级PaddleOCRv4模型C++推理

前言 PaddleOCR 提供了基于深度学习的文本检测、识别和方向检测等功能。其主要推荐的 PP-OCR 算法在国内外的企业开发者中得到广泛应用。在短短的几年时间里&#xff0c;PP-OCR 的累计 Star 数已经超过了32.2k&#xff0c;常常出现在 GitHub Trending 和 Paperswithcode 的日榜…...

❀My学习Linux命令小记录(14)❀

目录 ❀My学习Linux命令小记录&#xff08;14&#xff09;❀ 56.man指令 57.whatis指令 58.info指令 59.--help指令 60.uname指令 ❀My学习Linux命令小记录&#xff08;14&#xff09;❀ 56.man指令 功能说明&#xff1a;查看Linux中的指令帮助。 &#xff08;ps.man命…...

SqlServer存储过程中使用in

第一步&#xff1a;创建测试存储过程&#xff1a; CREATE PROCEDURE [dbo].[test] deptCode varchar(MAX)AS BEGINSELECT * from DEPT_INFO_A where DEPT_CODE in (deptCode)END 此存储过程只是一个简单的查询 第二步测试&#xff1a; 传入的 deptCode为&#xff1a;101200…...

Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(二)

1 代码框架 整体项目结构如图&#xff1a; Common&#xff1a;公共库 Logs&#xff1a; 日志目录 Page&#xff1a; 页面元素 Report&#xff1a;测试报告 TestCase&#xff1a;测试用例 TestData&#xff1a; 测试数据 2 单模块运行 直接上代码&#xff1a; # -*- coding…...

Kotlin Lambda使用

Kotlin Lambda使用 fun main() /*: Unit*/ {// Lambda会慢慢的难度升级// Kotlin Unit Java void// TODO 下面全部都是函数声明&#xff0c; 既然是函数声明&#xff0c;就不能调用// 函数的声明 用lambda去描述函数的声明val method1 : () -> Unitval method2 : (Int, In…...

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏&#xff0c;通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块&#xff08;也称为车块&#xff09;和其他大小相同的方块&#xff08;也称为障碍块&#xff09;。游戏的目标是将车块从木板的一个端点移动到另一个…...

测试---UI自动化测试介绍

1、什么是自动化测试 概念&#xff1a;由程序代替人工进行系统校验的过程。--------计算机自己执行&#xff0c;好比手机上安装一个软件软件微信&#xff0c;抖音&#xff0c;微博之类的&#xff0c;在应用商城里面&#xff0c;下载对应app后&#xff0c;手机系统程序会自动安…...

DHCP Host Name

文章目录 前言DHCP OptionOption (12) Host Namednsmasq 前言 打开路由器页面&#xff0c;看到下面连接的设备&#xff0c;有的显示设备名称 Tmall-Genie、ESP-C37CE8&#xff0c;而有的直接显示 MAC 地址 D2:B0:XX:XX:XX:XX。 这个名称是哪里来的呢&#xff1f; 这就是我们今…...

uniapp到底用什么ui框架最合适-关于uni-app的ui库、ui框架、ui组件

文章目录 直接看答案关于uni-app的ui库、ui框架、ui组件组件的概念扩展组件的选择uni ui如何使用uni ui 综上&#xff0c;官方对组件的使用建议是&#xff1a;附录&#xff1a;其他全端兼容ui库参考文章&#xff1a; 直接看答案 如果想自己纯手写&#xff0c;直接用内置组件。…...

Flask 最佳实践(二)

Flask是一个轻量级而灵活的Web框架&#xff0c;提供了足够的自由度让开发者根据项目的需求进行定制。然而&#xff0c;为了在大型项目中保持代码的可维护性和可扩展性&#xff0c;建议采用以下一些建议的最佳实践。 在上一篇博客中&#xff0c;讲述了项目结构、蓝图相关的最佳实…...

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 白鲸优化算法&#xff08;BWO&#xff09; 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括&#xff1a; 1. 搜索食物&#xff08;全局搜索&#xff09;&#xff1a;算法模仿白鲸寻找食物的行为。…...

nodejs微信小程序+python+PHP在线购票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

卷积神经网络训练情感分析

文章目录 1 CNN在自然语言的典型应用2 代码解释3 建议 1 CNN在自然语言的典型应用 卷积的作用在于利用文字的局部特征&#xff0c;一个词的前后几个词必然和这个词本身相关&#xff0c;这组成该词所代表的词群词群进而会对段落文字的意思进行影响&#xff0c;决定这个段落到底…...

github新建项目

参考链接&#xff1a;Github上建立新项目超详细方法过程 在这里新建一个repositories 接下来就选择相关的信息&#xff1a; 然后create a new就行了 接下来需要创建文件&#xff1a;&#xff08;同时通过upload上传文件&#xff09; 每次最多上传100个文件&#xff0c;然后保…...

CRC(循环冗余校验)直接计算和查表法

文章目录 CRC概述CRC名词解释宽度 (WIDTH)多项式 &#xff08;POLY&#xff09;初始值 &#xff08;INIT&#xff09;结果异或值 &#xff08;XOROUT&#xff09;输入数据反转&#xff08;REFIN&#xff09;输出数据反转&#xff08;REFOUT&#xff09; CRC手算过程模二加减&am…...

【算法思考记录】力扣2952. 需要添加的硬币的最小数量【C++,思路挖掘,贪心与证明】

原题链接 文章目录 需要添加的硬币的最小数量&#xff1a;贪心算法实现题目概述示例分析 关键思路分析贪心算法的优化选择证明案例推演与算法实现 C 实现结论 需要添加的硬币的最小数量&#xff1a;贪心算法实现 题目概述 在这个困难难度的算法题中&#xff0c;我们要解决的…...

用友NC JiuQiClientReqDispatch反序列化RCE漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC JiuQiClientReqDispatch 接口存在…...

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤&#xff1a; 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置&#xff0c;我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…...

数据结构与算法-D2D3线性表之顺序表

线性表&#xff1a;包含若干数据元素的一个线性序列&#xff0c;特征如下&#xff1a; 1&#xff09;对非空表&#xff0c;a0是表头&#xff0c;无前驱&#xff1b; 2&#xff09;an-1是表尾&#xff0c;无后继&#xff1b; 3&#xff09;其他元素仅且仅有一个前驱&#xff0c;…...

01_W5500简介

目录 W5500简介&#xff1a; 芯片特点: 全硬件TCPIP协议栈: 引脚分布&#xff1a; W5500简介&#xff1a; W5500是一款高性价比的以太网芯片&#xff0c;其全球独一无二的全硬件TCPIP协议栈专利技术&#xff0c;解决了嵌入式以太网的接入问题&#xff0c;简单易用&#xff…...

异常 Exception 练习题 (未完成)

异常 Exception 练习题 try-catch异常处理1234 异常1&#xff08;没有自己写&#xff09;234 try-catch异常处理 1 class Exception01 {public static int method() {try {String[] names new String[3];//String[]数组if (names[1].equals("tom")) {//NullPointe…...

Linux系统编程:并发与信号总结

并发 并发是指两个或多个同时独立进行的活动。在计算机系统中&#xff0c;并发指的是同一个系统中多个独立活动同时进行&#xff0c;而非依次进行。 并发在计算机系统中的表现&#xff1a; 一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是…...

Jmeter 接口-加密信息发送(一百九十九)

方式1&#xff1a;使用函数助手 比如MD5加密方式&#xff1a; 如图&#xff0c;需要对${user}进行MD5加密 1、打开函数助手&#xff0c;找到MD5&#xff0c;输入需要加密的值 2、将${__MD5(${user},)}放到请求中 3、查看请求&#xff0c;请求成功 方式2&#xff1a;导入jar包…...

微信小程序nodejs+vue+uniapp视力保养眼镜店连锁预约系统

作为一个视力保养连锁预约的网络系统&#xff0c;数据流量是非常大的&#xff0c;所以系统的设计必须满足使用方便&#xff0c;操作灵活的要求。所以在设计视力保养连锁预约系统应达到以下目标&#xff1a; &#xff08;1&#xff09;界面要美观友好&#xff0c;检索要快捷简易…...

掌握Vue侦听器(watch)的应用

文章目录 &#x1f341;watch 的优缺点&#x1f342;Watch 优点&#x1f342;Watch 缺点 &#x1f341;watch 的用法&#x1f342;对象式 watch&#x1f342;函数式 watch &#x1f341;代码示例&#x1f342;监听基本数据类型&#x1f342;监听复杂数据类型&#xff08;Object…...

SAP-PP:PP顾问管理系统的相关建议

本博客将探讨生产计划领域的控制要点。这将有助于减少仓库库存不准确情况&#xff0c;因为库存不准确会导致实物库存、发货、成本核算和计划方面出现许多效率低下的问题。 在物料主数据关键字段中&#xff0c;必须配置计划交货时间、GR处理时间、内部生产时间、计划交货时间&a…...

加载其他网站图片seo/软文广告怎么写

第一步&#xff1a;下載微信支付sdk下載網址&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1這是微信支付商戶平台頁面“公眾號支付”模塊里面的sdk&#xff0c;app支付的sdk是不能用的。下載好sdk之后&#xff0c;真正需要的文件有5個&#xff0c…...

wordpress仿百度贴吧/网站设计公司多少钱

.NET是一个微软开发的编程环境&#xff0c;里面可以使用C#,VB等多种编程语言。 不叫点net哦&#xff0c;叫点net太业余了啊。。。 显得太业余了。之前一直在用&#xff0c;today才know规范的叫法&#xff0c;&#xff0c;&#xff0c;。过去真是草莽写代码模式的了。 1 基础概…...

欧洲大带宽服务器/网站优化方案

字典&#xff08;Dictionary&#xff09; 字典是一种存储多个相同类型的值的容器。每个值&#xff08;value&#xff09;都关联唯一的键&#xff08;key&#xff09;&#xff0c;键作为字典中的这个值数据的标识符。和数组中的数据项不同&#xff0c;字典中的数据项并没有具体顺…...

济南外贸网站建设公司排名/在线识图

计算机网络课程设计某大学校园网设计_1摘要当今世界&#xff0c;各种先进的科学技术飞速发展&#xff0c;给人们的生活带来了深远的影响&#xff0c;它极大地改善着我们的生活方式。在以计算机技术为代表的信息科技的发展更是日新月异&#xff0c;从各个方面影响和改变着我们的…...

平板上做网站的软件/上海网络seo公司

如果是开平方根可以使用函数 SQRT(number)&#xff0c;返回数值的平方根 比如SQRT(9) 计算返回3如果是开立方根或者n次方根&#xff0c;可以进e68a847a64364行幂运算&#xff0c;POWER(number,power)函数表示返回number数值的power次乘幂&#xff0c;如POWER(5,2)表示5的2次方&…...

注册网站云空间/建站系统推荐

1、数据字典怎么理解&#xff1f;数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述&#xff0c;其目的是对数据流程图中的各个元素做出详细的说明。数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序源数据的目…...