MybatisPlus学习

一.快速入门

1.相关数据库创建

CREATE TABLE USER(id BIGINT(20) NOT NULL COMMENT '主键ID',NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) 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工程创建

3.相关配置

application.propertise
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3307/mybatis_plus?severTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=123456
依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.hjj</groupId><artifactId>onlearn_parent</artifactId><version>0.0.1-SNAPSHOT</version><name>onlearn_parent</name><description>onlearn_parent</description><properties><java.version>1.8</java.version><mybatis-plus.version>3.4.2</mybatis-plus.version></properties>​<dependencies><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>​<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version><scope>runtime</scope></dependency>//记得装插件<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--        Mp:苞米谷--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version>​</dependency></dependencies>​<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image></configuration></plugin></plugins></build>​</project>

4.相关代码

1.User实体类
   package com.hjj.onlearn_parent.entity;​import lombok.Data;​/*** @author:嘉佳 Date:2023/11/12 11:13**/@Datapublic class User {private Long id;private String name;private Integer age;private String email;}
2.mapper接口
package com.hjj.onlearn_parent.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hjj.onlearn_parent.entity.User;
import org.springframework.stereotype.Repository;/*** @author:嘉佳 Date:2023/11/12 11:14**/
//不用写xml,mp已经封装,只要继承BaseMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
3.springboot启动类
@SpringBootApplication@MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口public class OnlearnParentApplication {​public static void main(String[] args) {SpringApplication.run(OnlearnParentApplication.class, args);}​}
4.测试类
 @SpringBootTestclass OnlearnParentApplicationTests {​@Autowiredprivate UserMapper userMapper;​//    查询user表所有@Testvoid findAll() {List<User> users = userMapper.selectList(null);System.out.println(users);}​}

5.日志配置

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

二.主键生成策略

1.策略种类

策略介绍缺点
数据库自增长AUTO INCREMENT分表时需获取上张表id
UUID每次生成随机唯一值排序不便
Redis生成id
mp自带策略snowflake算法

2.设置主键生成策略

MyBatis-Plus中使用 @TableId(type = IdType.xxx ) 注解来标注使用哪种主键生成策略

  • AUTO: 自动增长

  • INPUT: 需要自行输入

  • ASSIGN_UUID: 自动生成随机唯一值

  • NONE: 不使用任何策略 也属于是自行输入

  • ASSIGN_ID: Mybatis-Plus自带策略 自动生成19为值

三.自动填充

步骤:

  • 1.在实体类中为要自动填充的属性加注解@TableFiled(fill=XX

    • FieldFill.INSERT 表示在插入操作时填充字段的值。

    • FieldFill.INSERT_UPDATE 表示在插入和更新操作时填充字段的值。

  • 2.创建一个类实现MetaObjectHandler接口

四.乐观锁

乐观锁:主要解决丢失更新问题丢失更新:多人同时修改同一条记录,最后提交的会把之前已经提交过的数据覆盖

解决方法:

  • 1 . 悲观锁:串行执行

  • 2.乐观锁: 添加version 使用版本号进行控制 比较数据与数据库中的版本号,版本号不同,不能进行更改

乐观锁的具:体实现:

  • 1.表中添加字段 作为乐观锁版本号

  • 2.对应实体类添加版本号属性和@Version注解

  • 3.在配置类中配置乐观锁插件

  //配置乐观锁插件@Configuration@MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口public class MpConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}}
  • 乐观锁修改时要先查再改

  • 原因:当执行更新操作时,需要比较当前数据的版本信息与更新前获取的版本信息是否一致。如果没有查询操作,就无法知道其他线程是否已经修改了该数据。

五.mp简单查询

1.根据id查询

2.多个id批量查询

userMapper.selectBatchIds(Arrays.asList(x,x,...))

六.分页查询

1.在配置类中配置分页插件(新版)

//    分页插件@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}

2.编写分页代码

  • 1.创建page对象

  • 2.调用mp分页查询方法,把分页数据封装到page中

  • //    分页查询@Testpublic void testPage(){//   1.创建page对象//      传入两个参数(当前页,每页显示记录数)Page<User> page = new Page<>(1, 3);//   2.调用mp分页查询方法,把分页数据封装到page中//          selectPage(分页对象,条件)userMapper.selectPage(page,null);}

3.通过page对象获取分页数据

  System.out.println(page.getCurrent());//当前页System.out.println(page.getRecords());//每页数据list集合System.out.println(page.getSize());//每页显示记录数System.out.println(page.getTotal());//总记录数System.out.println(page.getPages());//总页数System.out.println(page.hasNext());//是否有下一页System.out.println(page.hasPrevious());//是否有上一页

七.删除

物理删除:直接删除数据库中的记录

逻辑删除:使用标识符 表示记录已被删除,但是还存在于表中,逻辑删除的数据不能被查询,需要使用xml写复杂sql查询

1.物理删除

  • 删除单条

    //    简单删除@Testpublic void deleteById(){int result = userMapper.deleteById(1L);System.out.println(result);}
  • 删除多条

     //    批量删除@Testpublic void testDeleteByBatchIds(){int result = userMapper.deleteBatchIds(Arrays.asList(1, 2));System.out.println(result);}

2.逻辑删除

  • 1.数据库添加deleted字段

  • 2.实体类添加deleted字段并加上@TableLogin和 @TableField(fill = FieldFill.INSERT)注解

  • 3.新版无需添加逻辑删除插件

  • 底层:UPDATE user SET deleted=1 WHERE id=? AND deleted=0

  @TableLogic//标识逻辑删除字段@TableField(fill = FieldFill.INSERT)private Integer deleted;

八.Mybatis-Plus构造器查询 --复杂条件查询

1.wrapper

一般使用QueryWrapper进行mp复杂条件查询

2.QueryWrapper进行mp复杂条件查询

  • 1.创建QueryWrapper对象

  • 2.通过QueryWrapper设置条件

    @Testpublic void testSelectQuery(){
    //        创建QueryWrapper对象QueryWrapper<User> wrapper = new QueryWrapper<>();//        通过QueryWrapper设置条件
    //        ge、gt、le、lt   >=  >   <=  <
    //        查询age>=20记录
    //        第一个参数 字段名  第二个参数 设置值
    //        wrapper.ge("age",20);//        eq、ne 等于  不等于
    //        wrapper.eq("name","Tom");
    //        wrapper.ne("name","tom");//        between   范围查询
    //        wrapper.between("age",21,30);//        orderByDesc 降序排序
    //        wrapper.orderByDesc("id");//        like  模糊查询
    //        wrapper.like("name","吴");//        last  追加sql语句
    //        wrapper.last("limit 1");//        指定要查询的列wrapper.select("age","name");List<User> users = userMapper.selectList(wrapper);System.out.println(users);}

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

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

相关文章

《洛谷深入浅出基础篇》——P3405 citis and state ——哈希表

上链接&#xff1a;P3405 [USACO16DEC] Cities and States S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3405 上题干&#xff1a; 题目描述 Farmer John 有若干头奶牛。为了训练奶牛们的智力&#xff0c;Farmer John 在谷仓的墙上放了一…

Spring对事务的实现

Spring对事务的支持 事务概述事务的四个处理过程事务的四个特性 引入事务场景Spring实现事务的两种方式声明式事务之注解实现方式 事务概述 在一个业务流程当中&#xff0c;通常需要多条DML&#xff08;insert delete update&#xff09;语句共同联合才能完成&#xff0c;这多…

若依启动步骤

1.创建数据库 2.启动redis 3.改后端的数据库连接配置 4.配置redis redis的地址&#xff1a;cmd中ipconfig命令查看 6.启动后端&#xff1a;如下 7.启动前端ruoyi-ui中 先运行npm install&#xff0c;再npm run dev。项目就启动成功了。 用户名&#xff1a;admin 密码&#x…

【2022改良版】学法减分助手PRO小程序源码

【2022改良版】学法减分助手PRO小程序源码 &#xff0c;交管推出个学法减分&#xff0c;每个驾驶员可以把被扣的6分&#xff0c;以看视频答题的形式学习回来&#xff0c;然后答题这个一共二十道题每道题60秒&#xff0c; 有好多人不会&#xff0c;用咱们的小程序就可以模拟练习…

计算机视觉:驾驶员疲劳检测

目录 前言 关键点讲解 代码详解 结果展示 改进方向&#xff08;打哈欠检测疲劳方法&#xff09; 改进方向&#xff08;点头检测疲劳&#xff09; GUI界面设计展示 前言 上次博客我们讲到了如何定位人脸&#xff0c;并且在人脸上进行关键点定位。其中包括5点定位和68点定…

二、程序员指南:数据平面开发套件

MEMPOOL库 内存池是固定大小对象的分配器。在DPDK中&#xff0c;它由名称标识&#xff0c;并使用环形结构来存储空闲对象。它提供一些其他可选服务&#xff0c;例如每个核心的对象缓存和一个对齐辅助工具&#xff0c;以确保对象填充以将它们均匀分布在所有DRAM或DDR3通道上。 …

LINUX入门篇【6】----第一个LINUX小程序---进度条及相关知识讲解

前言&#xff1a; 本篇我们将开始尝试构建我们的第一个LINUX的小程序----进度条作为一个十分常见的程序&#xff0c;在我们之后的工程实践中也是需要多次运用&#xff0c;但是介于我们目前还没有去学习网络等方面的知识&#xff0c;没法独立的去利用程序去下载一个真正的程序&…

Devart dotConnect ADO.NET Data Providers Crack

开发数据相关 .NET 应用程序的终极解决方案&#xff1a;快速、灵活、全面、功能丰富、支持 ORM 的 ADO.NET 提供程序 概述 实体框架 连接字符串 博客 高性能 ADO.NET 数据提供程序 dotConnect 是基于 ADO.NET 架构和采用多项创新技术的开发框架构建的增强型数据连接解决方​​…

【配置环境】VS Code怎么使用JavaScript的Mocha测试框架和Chai断言库

一&#xff0c;环境 Windows 11 家庭中文版&#xff0c;64 位操作系统, 基于 x64 的处理器VS Code 版本: 1.83.1 (user setup)Node.js 版本&#xff1a;20.9.0 二&#xff0c;安装背景 在运行测试用例时遇到 ReferenceError: describe is not defined 错误&#xff0c;网上搜寻…

C/C++预定义宏、 #line 、#error、 #pragma和泛型选择

文章目录 预定义宏_ _func_ _是C语言的预定义标识符 #line和#error#pragma泛型选择&#xff08;C11&#xff09;参考 预定义宏 C标准规定了一些预定义宏&#xff1a; _ _func_ _是C语言的预定义标识符 C99 标准提供一个名为_ _func_ _的预定义标识符&#xff0c;它展开为一…

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍&#xff1a; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析&#xff1a;一旦数据被索引&#…

《向量数据库指南》——TruLens + Milvus Cloud构建RAG深入了解性能

深入了解性能 索引类型 本例中,索引类型对查询速度、token 用量或评估没有明显影响。这可能是因为数据量较小的关系。索引类型对较大语料库可能更重要。 Embedding 模型 text-embedding-ada-002 在准确性(0.72,平均 0.60)和答案相关度(0.82,平均0.62)上优于 MiniLM Embeddin…

Office Word 中的宏

Office Word 中的宏 简介宏的使用将自定义创建的宏放入文档标题栏中的“自定义快速访问工具栏”插入指定格式、内容的字符选中word中的指定文字查找word中的指定文字A&#xff0c;并替换为指定文字B插入文本框并向内插入文字word 表格中的宏操作遍历表格中的所有内容批量设置表…

CTF-PWN-堆- 【off-by-one】

文章目录 堆的off-by-one利用思路Asis CTF 2016 b00ks libc 2.31IDA源码main输入名字creat函数dele函数edit函数print函数reeditor name函数 思路exp思路 堆的off-by-one off-by-one指的是单字节缓冲区溢出&#xff08;off-by-one 是可以基于各种缓冲区的&#xff0c;比如栈、…

解决公网下,k8s calico master节点无法访问node节点创建的pod

目的&#xff1a;解决pod部署成功后&#xff0c;只能在node节点访问&#xff0c;而master节点无法访问 原因&#xff1a;集群搭建时&#xff0c;没有配置公网进行kubectl操作&#xff0c;从而导致系统默认node节点&#xff0c;使用内网IP加入k8s集群&#xff01;如下&#xff…

八股文-TCP的三次握手

TCP协议是一种面向连接、可靠传输的协议&#xff0c;而建立连接的过程就是著名的三次握手。这个过程保证了通信的双方能够同步信息&#xff0c;确保后续的数据传输是可靠和有序的。本文将深入解析TCP三次握手的步骤及其意义。 漫画TCP的三次握手 TCP连接的建立采用了三次握手的…

VSCode 使用CMakePreset找不到cl.exe编译器的问题

在用vscode开发c项目的时候&#xff0c;使用预先配置的CMakePresets.json可以把一些特定的cmake选项固定下来&#xff0c;在配置时直接使用 "cmake --config --preset presetname"就可以进行配置&#xff0c;免去在命令行输入过多的配置参数。 但是在vscode中&#…

C++菜鸟日记2

关于getline()函数&#xff0c;在char和string输入的区别 参考博客 1.在char中的使用&#xff1a; 2.在string中的使用&#xff1a; 关于char字符数组拼接和string字符串拼接方法 参考博客 字符串拼接方法&#xff1a; 1.直接用 号 2.利用append&#xff08;&#xff0…

【观察】华为:数智世界“一触即达”,应对数智化转型“千变万化”

毫无疑问&#xff0c;数智化既是这个时代前进所趋&#xff0c;也是国家战略所指&#xff0c;更是所有企业未来发展进程中达成的高度共识。 但也要看到&#xff0c;由于大量新兴技术的出现&#xff0c;技术热点不停的轮转&#xff0c;加上市场环境的快速变化&#xff0c;让数智化…

Nacos 配置中心底层原理(1.X版本)

前言 Nacos 1.X版本 是长轮询 Nacos 2.X版本 是GRPC 长轮询 概念 客户端会轮询向服务端发出一个长连接请求&#xff0c;这个长连接最多30s就会超时&#xff0c;服务端收到客户端的请求会先判断当前是否有配置更新&#xff0c;有则立即返回&#xff0c;如果没有服务端会将这个…