Mybatis-plus -2025/1/27

news/2025/2/4 11:38:31/文章来源:https://www.cnblogs.com/XYu1230/p/18692633

MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率

DQL编程控制

// 创建 LambdaQueryWrapper 对象,用于构建查询条件LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();// 1. 等值查询// 添加等于条件,查询 username 等于 "john_doe" 的记录lqw.eq(User::getUsername, "john_doe");// 2. 不等值查询// 添加不等于条件,查询 age 不等于 25 的记录lqw.ne(User::getAge, 25);// 3. 大于查询// 添加大于条件,查询 age 大于 18 的记录lqw.gt(User::getAge, 18);// 4. 大于等于查询// 添加大于等于条件,查询 age 大于等于 18 的记录lqw.ge(User::getAge, 18);// 5. 小于查询// 添加小于条件,查询 age 小于 30 的记录lqw.lt(User::getAge, 30);// 6. 小于等于查询// 添加小于等于条件,查询 age 小于等于 30 的记录lqw.le(User::getAge, 30);// 7. 模糊查询// 添加模糊查询条件,查询 username 包含 "doe" 的记录lqw.like(User::getUsername, "doe");// 8. 范围查询// 添加范围查询条件,查询 age 在 20 到 30 之间的记录lqw.between(User::getAge, 20, 30);// 9. 排序查询 - 升序// 按 age 字段升序排序lqw.orderByAsc(User::getAge);// 10. 排序查询 - 降序// 按 age 字段降序排序lqw.orderByDesc(User::getAge);// 11. 分组查询// 按 gender 字段分组lqw.groupBy(User::getGender);// 12. 逻辑与查询// 添加逻辑与条件,查询 age 等于 25 且 gender 等于 "male" 的记录lqw.and(wrapper -> wrapper.eq(User::getAge, 25).eq(User::getGender, "male"));// 13. 逻辑或查询// 添加逻辑或条件,查询 age 等于 25 或 age 等于 30 的记录lqw.or(wrapper -> wrapper.eq(User::getAge, 25).eq(User::getAge, 30));// 14. 查询指定字段// 只查询 username 和 age 字段lqw.select(User::getUsername, User::getAge);

聚合查询

需求:聚合函数查询,完成count、max、min、avg、sum的使用

count:总记录数

max:最大值

min:最小值

avg:平均值

sum:求和

@SpringBootTest
class Mybatisplus02DqlApplicationTests {@Autowiredprivate UserDao userDao;@Testvoid testGetAll(){QueryWrapper<User> lqw = new QueryWrapper<User>();//lqw.select("count(*) as count");//SELECT count(*) as count FROM user//lqw.select("max(age) as maxAge");//SELECT max(age) as maxAge FROM user//lqw.select("min(age) as minAge");//SELECT min(age) as minAge FROM user//lqw.select("sum(age) as sumAge");//SELECT sum(age) as sumAge FROM userlqw.select("avg(age) as avgAge");//SELECT avg(age) as avgAge FROM userList<Map<String, Object>> userList = userDao.selectMaps(lqw);System.out.println(userList);}
}

排序查询

/*** condition :条件,返回boolean,当condition为true,进行排序,如果为false,则不排序* isAsc:是否为升序,true为升序,false为降序* columns:需要操作的列*/

映射匹配兼容性

知识点1:@TableField

名称 @TableField
类型 属性注解
位置 模型类属性定义上方
作用 设置当前属性对应的数据库表中的字段关系
相关属性 value(默认):设置数据库表字段名称
exist:设置属性在数据库表字段中是否存在,默认为true,此属性不能与value合并使用
select:设置属性是否参与查询,此属性与select()映射配置不冲突

知识点2:@TableName

名称 @TableName
类型 类注解
位置 模型类定义上方
作用 设置当前类对应于数据库表关系
相关属性 value(默认):设置数据库表名称

用于解决表的名称和模型类的名称不一致

id生成策略控制

知识点1:@TableId

名称 @TableId
类型 属性注解
位置 模型类中用于表示主键的属性定义上方
作用 设置当前类中主键属性的生成策略
相关属性 value(默认):设置数据库表主键名称
type:设置主键属性的生成策略,值查照IdType的枚举值

从源码中可以看到,除了AUTO这个策略以外,还有如下几种生成策略:

  • NONE: 不设置id生成策略
  • INPUT:用户手工输入id
  • ASSIGN_ID:雪花算法生成id(可兼容数值型与字符串型)
  • ASSIGN_UUID:以UUID生成算法作为id生成策略
  • 其他的几个策略均已过时,都将被ASSIGN_ID和ASSIGN_UUID代替掉。

雪花算法

ID生成策略对比

  • NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很多判定,实现起来比较复杂
  • AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用
  • ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符串,长度过长占用空间而且还不能排序,查询性能也慢
  • ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键
  • 综上所述,每一种主键策略都有自己的优缺点,根据自己项目业务的实际情况来选择使用才是最明智的选择。

逻辑删除的本质为:

逻辑删除的本质其实是修改操作。如果加了逻辑删除字段,查询数据时也会自动带上逻辑删除字段。

@TableLogic

名称 @TableLogic
类型 属性注解
位置 模型类中用于表示删除字段的属性定义上方
作用 标识该字段为进行逻辑删除的字段
相关属性 value:逻辑未删除值
delval:逻辑删除值

乐观锁

数据库和java添加version属性

@Configuration
@MapperScan("com.yourpackage.mapper")
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}

快速开发

代码生成器

package com.stdu;import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.model.ClassAnnotationAttributes;
import lombok.Data;import java.sql.Types;
import java.util.Collections;public class CodeGenerator {public static void main(String[] args) {String database = "jdbc:mysql://localhost:3306/lxy?useSSL=false";String table = "51_job";String tablePrefix = "51_";String path = "D:\\Idea项目\\echarts-demo\\echarts_1_test\\src\\main";//取到当前java文件的绝对路径FastAutoGenerator.create(database, "root", "123456").globalConfig(builder -> {builder.author("XYu1230") // 设置作者.enableSwagger() // 开启 swagger 模式.outputDir(path + "\\java") // 指定输出目录.disableOpenDir();}).dataSourceConfig(builder ->builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {int typeCode = metaInfo.getJdbcType().TYPE_CODE;if (typeCode == Types.SMALLINT) {// 自定义类型转换return DbColumnType.INTEGER;}return typeRegistry.getColumnType(metaInfo);})).packageConfig(builder ->builder.parent("com.stdu") // 设置父包名
//                                .moduleName("system") // 设置父包模块名.pathInfo(Collections.singletonMap(OutputFile.xml, path + "\\resources\\com\\stdu\\mapper")) // 设置mapperXml生成路径).strategyConfig(builder ->builder.addInclude(table) // 设置需要生成的表名.addTablePrefix(tablePrefix) // 设置过滤表前缀.entityBuilder().enableFileOverride().enableLombok(new ClassAnnotationAttributes("@Data","lombok.Data")).controllerBuilder().enableRestStyle())
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();}
}

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

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

相关文章

springboot -2025/1/26

配置文件优先级: application.properties > application.yml > application.yaml YAML格式 YAML(YAML Aint Markup Language),一种数据序列化格式。 优点:容易阅读 yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰容易与脚本语言交互以数据为…

manim边学边做--局部变换

本次介绍的两个用于变换的动画类:TransformMatchingShapes和TransformMatchingTex。 它们的主要特点是对一组对象或一段文本进行局部变换,适用于复杂的图形或者文本的变换场景。 其中:TransformMatchingShapes:用于不同形状的 VMobject 间转换,能自动匹配相似形状并创建平…

读算法简史:从美索不达米亚到人工智能时代06人工智能现身

读算法简史:从美索不达米亚到人工智能时代06人工智能现身1. 人工智能现身 1.1. 在20世纪四五十年代,计算机在本质上被看成一种快速计算器1.1.1. 主机一个接一个地运行大量的数据处理作业(job),不与用户发生交互1.1.2. 最终的大量打印结果由操作员按批次(batch)展示给他们心怀…

2025 大盘

调整的差不多了 年后看3065附近

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求,这个场景需求,在播放这块,有几个明显的需求是,播放的视…

FFT+NTT入门

这是一个题图真的只是入门。 可能会接着更 分治FFT 或者 任意模数NTT? 前置知识 复数 也可以参考高中数学课本,这里只会介绍 fft 需要的(默认已经入门复数)。 多项式的相关概念。 点值表示法:假设 \(f(x)\) 是一个 \(n-1\) 次多项式,那么将 \(n\) 个 不同的 \(x\) 代入,…

Traefik新一代反代服务器,兼容所有主要的集群技术(二)

简介 笔记将记录如何使用docker配置traefik,代理一个gitea,自动申请tls证书,cloudflare反代80,443端口一系列实操。 daemon.json配置如下,主要是为了IPv6能访问,以及更改了主存储位置,配置了docker代理。{"data-root": "/storage/docker","ipv6…

macbookpro m3本地部署DeepSeek模型

macbookpro m3有着十分强大的性能。在deepseek如火如荼的当下,可以尝试在本地部署并使用。还可以将自己的文档作为语料喂给deepseek,使其能成为自己专属的AI助手。 本文介绍使用ollama在本地部署deepseek模型,并使用chatbox优化访问的步骤。 下载ollama https://ollama.com …

基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器

基于规则的风险分类风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High)、中(Medium)、低(Low)。目前,即便是在大规模环境中,风险分类器仍主要采用基于规则的系统实现。基于规则的分类器易于以符合人类直觉的方式定义——这也使…

坐标系与向量

坐标系规定 一般使用左手坐标系,+x,+y,+z分别指向右方、上方、前方。 多坐标系 世界坐标系:协议某个点为原点,其他所有点都有具体不变的坐标,能够用世界坐标系描述其他坐标系的位置,而不能使用更大的、外部的坐标系来描述世界坐标系。 物体坐标系:和物体相关联的坐标…

Netty实战入门教程

概述 Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端 Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求!Cassandra - nosql 数据库 Spark…

FFT入门

这是一个题图前置知识 复数 也可以参考高中数学课本,这里只会介绍 fft 需要的(默认已经入门复数)。 多项式的相关概念。 点值表示法:假设 \(f(x)\) 是一个 \(n-1\) 次多项式,那么将 \(n\) 个 不同的 \(x\) 代入,可以得到 \(n\) 个 \(y\)。这 \(n\) 个点对 \((x,y)\) 唯一…