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

入门使用mybatis-plus

第一步:pom文件带入依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>

 第二步:创建实体对象

@TableName("leave_request")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LeaveRequest {@TableIdprivate int id;private String requestUuid;private String title;private Integer leaveDay;private LocalDate leaveStartTime;private LocalDate leaveEndTime;private String requestorName;private String teamLeader;private String sourcingManager;private String DbsBoss;private String NCSTeamLeader;private String status;}

 需要注意的是@TableName("leave_request"),这个东西对应你数据库里面的表

 

第三步:@Mapper和@MapperScan必须二选一

@SpringBootApplication(exclude= SecurityAutoConfiguration.class)
@MapperScan("com.example.demo.Mappers")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

@MapperScan("com.example.demo.Mappers")里面的value对应你第四步的文件路径

 

  第四步:创建实体类对应的repository,增删查改的语句就可以在这里面进行填写

@Repository
public interface LeaveRequestMapper extends BaseMapper<LeaveRequest> {LeaveRequest findByRequestUuid(String requestUuid);}

可以通过命名的方式不用写sql语句即可实现查询。下面是基本的查询方式:


/**
 * 普通查询
 */
@Test
public void selectById() {
    UserInfo userInfo = userInfoMapper.selectById(123);
    System.out.println(userInfo);
}
 
/**
 * 批量查询
 */
@Test
public void selectByIds() {
    List<Long> ids = Arrays.asList(123L,124L,125L);
    List<UserInfo> userInfo = userInfoMapper.selectBatchIds(ids);
    System.out.println(userInfo);
}
 
/**
 * 名字包含娟并且年龄小于30
 */
@Test
public void selectByWrapper() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like("username","娟").lt("age",30);
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
/**
 * 名字包含娟并且年龄大于等于20且小于等于40并且email不为空
 */
@Test
public void selectByWrapper2() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like("username","娟").between("age",20,30).isNotNull("email");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 名字姓肖或者年量大于等于20,按照年龄降序排列,年龄相同按照id生序排列
 */
@Test
public void selectByWrapper3() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.likeRight("username","肖")
            .or().ge("age",20).orderByDesc("age").orderByAsc("id");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 创建日期为2024年1月2日并且直属上级名字为王姓
 */
@Test
public void selectByWrapper4() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}","2024-10-02")
            .inSql("parent_id","select id from user where username like '王%'");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
//上面的日期查询使用的是占位符的形式进行查询,目的就是为了防止SQL注入的风险
 
/**
 * 名字为王姓并且(年龄小于40或邮箱不为空)
 */
@Test
public void selectByWrapper5() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.likeRight("username","王")
            .and(wq->wq.lt("age",40))
            .or().isNotNull("email");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
/**
 * 名字为王姓并且(年龄小于40并且大与20或邮箱不为空)
 */
@Test
public void selectByWrapper6() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.likeRight("username","王")
            .and(wq->wq.lt("age",40).gt("age",20))
            .or().isNotNull("email");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
/**
 * (年龄小于40并且大与20或邮箱不为空)并且名字为王姓
 */
@Test
public void selectByWrapper7() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.nested(wq->wq.lt("age",40).gt("age",20))
            .or().isNotNull("email")
            .likeRight("username","王");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
/**
 * 年龄23,30,40
 */
@Test
public void selectByWrapper8() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.in("age",Arrays.asList(20,30,40));
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
/**
 * 只返回满足条件的其中一条语句即可
 */
@Test
public void selectByWrapper9() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.in("age",Arrays.asList(20,30,40)).last("limit 1");
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 名字中包含雨并且年龄小于40(只取id,username)
 */
@Test
public void selectByWrapper10() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.select("id","username").like("username","雨").lt("age",40);
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 名字中包含雨并且年龄小于40(不取create_time,parent_id两个字段,即不列出全部字段)
 */
@Test
public void selectByWrapper11() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like("username","雨").lt("age",40)
                .select(UserInfo.class,info->!info.getColumn().equals("create_time")&&
                        !info.getColumn().equals("parent_id"));
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 姓名和邮箱不为空
 */
public void testCondition() {
    String username = "王";
    String email = "";
    condition(username,email);
}
 
private void condition(String username,String email){
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like(StringUtils.isNullOrEmpty(username),"name",username)
                .like(StringUtils.isNullOrEmpty(email),"email",email);
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 实体作为条件构造器方法的参数
 */
@Test
public void selectByWrapperEntity() {
    UserInfo whereUser = new UserInfo();
    whereUser.setUsername("xiaojuan");
    whereUser.setAge(22);
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>(whereUser);
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
/**
 * AllEq用法
 */
@Test
public void selectByWrapperAllEq() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("nuserame","xiaojuan");
    params.put("age",null);
    queryWrapper.allEq(params);
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * AllEq用法(排除不是条件的字段)
 */
@Test
public void selectByWrapperAllEq2() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("nuserame","xiaojuan");
    params.put("age",null);
    queryWrapper.allEq((k,v)->!k.equals("name"),params);
    List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * selectMaps
 */
@Test
public void selectByWrapperMaps() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like("name","肖").lt("age",40);
    List<Map<String,Object>> userInfoList = userInfoMapper.selectMaps(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 按照直属上级分组,查询每组的平均年龄,最大年龄,最小年龄。并且只取年龄总和小于500的组
 */
@Test
public void selectByWrapperMaps2() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.select("avg(age) avg_age","min(min) min_age","max(age) max_age")
            .groupBy("parent_id").having("sum(age)<{0}",500);
    List<Map<String,Object>> userInfoList = userInfoMapper.selectMaps(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * selectObjs
 */
@Test
public void selectByWrapperObjs() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.select("id","name").like("name","肖").lt("age",40);
    List<Object> userInfoList = userInfoMapper.selectObjs(queryWrapper);
    userInfoList.forEach(System.out::println);
}
 
/**
 * selectCount
 */
@Test
public void selectByWrapperCount() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like("name","肖").lt("age",40);
    Integer count = userInfoMapper.selectCount(queryWrapper);
    System.out.println(count);
}
 
/**
 * selectOne
 */
@Test
public void selectByWrapperSelectOne() {
    QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
    queryWrapper.like("name","肖").lt("age",40);
    UserInfo user = userInfoMapper.selectOne(queryWrapper);
    System.out.println(user);
}
 
/**
 * 使用Lambda
 */
@Test
public void selectLambda() {
   // LambdaQueryWrapper<UserInfo> lambda = new QueryWrapper<UserInfo>().lambda();
    LambdaQueryWrapper<UserInfo> lambda = new LambdaQueryWrapper<UserInfo>();
    lambda.like(UserInfo::getUsername,"娟").lt(UserInfo::getAge,40);
    List<UserInfo> userInfoList = userInfoMapper.selectList(lambda);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 使用Lambda,名字为王姓(年龄小于40或邮箱不为空)
 */
@Test
public void selectLambd2() {
    LambdaQueryWrapper<UserInfo> lambda = new LambdaQueryWrapper<UserInfo>();
    lambda.like(UserInfo::getUsername,"娟")
            .and(lqw->lqw.lt(UserInfo::getAge,40).or().isNotNull(UserInfo::getEmail));
    List<UserInfo> userInfoList = userInfoMapper.selectList(lambda);
    userInfoList.forEach(System.out::println);
}
 
/**
 * 使用Lambda链式
 */
@Test
public void selectLambd3() {
    List<UserInfo> userInfoList = new LambdaQueryChainWrapper<UserInfo>(userInfoMapper)
            .like(UserInfo::getUsername,"娟").ge(UserInfo::getAge,20).list();
    userInfoList.forEach(System.out::println);

相关文章:

入门使用mybatis-plus

第一步&#xff1a;pom文件带入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version> </dependency> 第二步&#xff1a;创建实体对象 TableName(&…...

ubuntu安装和配置ssh教程

一、前言 ssh服务类似于windows的远程桌面服务,可以实现对linux系统的远程管理,ssh默认端口为22端口。后面博主进行操作以ubuntu2020操作系统为例进行操作。 二、安装ssh服务 Ubuntu 2020 默认不安装 SSH 服务。它只安装了 SSH 客户端,可以用于连接到其他计算机上的 SSH 服…...

每天刷两道题——第六天

1.1字母异位词分组 给你一个字符串数组&#xff0c;将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词指的是由重新排列源单词的所有字母得到的一个新单词。 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,…...

时间序列平稳性相关检验方法

理解平稳性 一般来说&#xff0c;平稳时间序列是指随着时间的推移具有相当稳定的统计特性的时间序列&#xff0c;特别是在均值和方差方面。平稳性可能是一个比较模糊的概念&#xff0c;将序列排除为不平稳可能比说序列是平稳的更容易。通常不平稳序列有几个特征&#xff1a; …...

<leetcode修炼>双指针训练-移动零

题目: 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 方法1: 快慢指针 快指针负责遍历数组中所有元素&#xff0c;慢指针负责记录不为0的…...

Python初探:从零开始的编程奇妙之旅

一、Python是什么 Python是一门多用途的高级编程语言&#xff0c;以其简洁、易读的语法而脱颖而出。在深度学习领域&#xff0c;Python扮演着至关重要的角色。其丰富的科学计算库&#xff08;如NumPy、Pandas、Matplotlib&#xff09;和强大的深度学习框架&#xff08;如Tenso…...

算法与数据结构之链表<一>(Java)

目录 1、链表的定义 2、链表的特点 3、为何要使用链表 4、数组与链表的区别 5、链表的增删查 5.1、在头部插入链表 5.2、在中间插入链表 5.3、删除头节点 5.4、删除中间节点 5.5、查询某个值 6、链表的应用 6.1 如何设计一个LRU缓存算法&#xff1f; 6.2 约瑟夫问题 1、链表的定…...

目标检测COCO数据集与评价体系mAP

1.mAP 2.IoU IoU也就是交并比&#xff0c;也称为 Jaccard 指数&#xff0c;用于计算真实边界框与预测边界框之间的重叠程度。它是真值框与预测边界框的交集和并集之间的比值。Ground Truth边界框是测试集中手工标记的边界框&#xff0c;用于指定对象图像的位置以及预测的边界框…...

2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在Web3技术迅速发展的时代&#xff0c;寻找一个综合且深入的Web3开发工具和学习项目资源平台变得至关重要。今天&#xff0c;我将向大家介绍一个非常有价值的网站&#xff0c;它就是https://web3x.world 。 Web3X是一个全面而深入的Web3开发者社区&#xff0c;为开发者们提供了…...

Golang - defer关键字 深入剖析

defer关键字 defer和go一样都是Go语言提供的关键字。defer用于资源的释放&#xff0c;会在函数返回之前进行调用。一般采用如下模式&#xff1a; f,err : os.Open(filename) if err ! nil {panic(err) } defer f.Close()如果有多个defer表达式&#xff0c;调用顺序类似于栈&a…...

如何在Spring Boot中使用@Scheduled写定时任务判断数据量是否过大,过大则进行分表操作,多张表使用临时视图查询

当数据量过大&#xff0c;在定时任务中执行分表操作 1、复制表结构及数据 在xml中编写复制表结构及数据&#xff08;newTableName为新表名、originalTableName为原始表名&#xff09; 只复制表结构&#xff1a; CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTa…...

使用jieba库进行中文分词和去除停用词

jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数&#xff0c;它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数&#xff1a;需要分词的字符串&#xff0c;是否使用全模式&#xff08;默认为False&#xff09;以及是否使用HMM模型&…...

C语言之分支与循环【附6个练习】

文章目录 前言一、什么是语句&#xff1f;1.1 表达式语句1.2 函数调用语句1.3 控制语句1.4 复合语句1.5 空语句 二、分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 练习&#xff08;1. 判断一个数是否为奇数 2. 输出1-100之间的奇数&#xff09; 2.2…...

使用通用MCU实现无人机飞行任务的快速二次开发

使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知&#xff0c;在以往TI电赛真题的学习…...

什么是Selinux

官网地址&#xff1a;What is SELinux? 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 概述 安全增强型 Linux (SELinux) 是Linux 系统的安全架构&#xff0c;允许管理员更好地控制谁可以访问系统。它最初是由美…...

计算机网络知识点

1. URI 和 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff09;&#xff0c;是对资源的引用和访问该资源的方法。俗称网址&#xff0c;就是浏览器地址栏里面的内容。 URL 语法为&#xff1a;protocol://userInfohost:port/p…...

Qt 连接 Mysql

Linux下安装mysql及qt连接_liunx下安装mysql及qt链接-CSDN博客...

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…...

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY&#xff0c;同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里&#xff0c;这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正

问题描述 使用环境与工具&#xff1a;Unity 2022.3.4fc1&#xff0c;steam VR(2.7.3)&#xff0c;steamvrSDK&#xff08;1.14.15&#xff09;&#xff0c;HTC vive pro专业版&#xff0c;Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明&#xff08;可参考&#xff1a;HI5 2.0 交…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...