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,一经查实,立即删除!

相关文章

后端返回 date 时间日期格式为 UTC 格式字符串,形如 2022-08-11T10:50:31.050+00:00前端如何修改为yyyy-mm-dd

在不指定任何特殊配置的情况下&#xff0c;返回的 date 类型的字段会自动转成 UTC 格式字符串&#xff0c;形如 2022-08-11T10:50:31.05000:00。 前端如何处理&#xff1f; vue举例 utils 下新建 mixins.js文件 // minins.js文件 import Vue from "vue"; import {…

MidJourney笔记(1)-入门

注册 MidJourney注册和使用方式,有点特别。在介绍注册之前,需要给大家先介绍Discord。 Discord是一家游戏聊天应用与社区,在国内用的人相对比较少,在国外用得比较多。 那MidJourney和Discord有什么关系呢? MidJourney是搭建在Discord上的一个人工智能程序,通过在Discord添…

《洛谷深入浅出基础篇》——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点定…

交换机的工作原理

局域网交换技术是数据链路层上的技术&#xff0c;就是转发数据帧。在数据通信中&#xff0c;所有交换设备都执行两个基本操作&#xff1a; 交换数据帧生成并维护交换地址表 交换数据帧 交换机根据数据帧的MAC地址&#xff08;物理地址&#xff09;进行数据帧的转发操作。交换…

Stable Diffusion 入门

Stable Diffusion 入门 简介 稳定扩散&#xff08;Stable Diffusion&#xff09;是一种用于解决基于图论的问题的算法。在许多实际场景中&#xff0c;我们需要对图中的节点进行扩散&#xff0c;以便发现节点之间的关联性和信息传播路径。稳定扩散算法通过模拟节点之间的信息传…

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

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

C# public和internal的区别

在C#中&#xff0c;internal 和 public 是访问修饰符&#xff0c;它们控制着类和类成员的可访问性。 Public public 是最常用的访问修饰符。如果一个类或类成员被声明为 public&#xff0c;那么它可以从任何其他类或者是该类的实例访问到。换句话说&#xff0c;它没有任何访问…

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

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

JAVA基础12:字符串(上)

1.API 1&#xff09;API概述 API(Application Programming Interface):应用程序编程接口 编写一个机器人程序去控制机器人踢足球&#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;网上搜寻…

信息系统项目管理师 第四版 第4章 信息系统管理

1. 管理方法 1.1. 管理基础 1.2. 规划和组织 1.3. 设计和实施 1.4. 运维和服务 1.5. 优化和持续改进. 2. 管理要点 2.1. 数据管理 2.2. 运维管理 2.3. 信息安全管理

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

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

python3:print()打印. 2023-11-18

Python3 print ()不换行输出 import random # 导入random for i in range(10):print(random.randint(1,999), end",") #random.randint(1,999)随机返回1-999间任意一个整数,包括1和999 #print()添加end"" 自定义参数&#xff0c;实现不换行输出效果.end的…

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…