详细分析MybatisPlus中的orderBy、orderByDesc、orderByAsc函数

目录

  • 前言
  • 1. 概念
  • 2. API示例
  • 3. 实战

前言

实战中学习并进行补充该类的源码以及应用

1. 概念

在 MyBatis-Plus 中,orderBy、orderByDesc 和 orderByAsc 是用于构建 SQL 查询语句中的 ORDER BY 子句的方法。

这些方法都是通过 QueryWrapper 类的实例来调用的,基础的只是可看我之前的文章:Springboot整合MybatisPlus的基本CRUD(全)

对应的源码如下:(此处的源码来源于Func.java类中)

default Children orderByAsc(R column) {return orderByAsc(true, column);}/*** ignore*/default Children orderByAsc(R... columns) {return orderByAsc(true, columns);}/*** 排序:ORDER BY 字段, ... ASC* <p>例: orderByAsc("id", "name")</p>** @param condition 执行条件* @param columns   字段数组* @return children*/default Children orderByAsc(boolean condition, R... columns) {return orderBy(condition, true, columns);}/*** ignore*/default Children orderByDesc(R column) {return orderByDesc(true, column);}/*** ignore*/default Children orderByDesc(R... columns) {return orderByDesc(true, columns);}/*** 排序:ORDER BY 字段, ... DESC* <p>例: orderByDesc("id", "name")</p>** @param condition 执行条件* @param columns   字段数组* @return children*/default Children orderByDesc(boolean condition, R... columns) {return orderBy(condition, false, columns);}/*** 排序:ORDER BY 字段, ...* <p>例: orderBy(true, "id", "name")</p>** @param condition 执行条件* @param isAsc     是否是 ASC 排序* @param columns   字段数组* @return children*/Children orderBy(boolean condition, boolean isAsc, R... columns);

对应的实现类大部分来源于如下:(AbstractWrapper类中)

    @Overridepublic Children orderBy(boolean condition, boolean isAsc, R... columns) {if (ArrayUtils.isEmpty(columns)) {return typedThis;}SqlKeyword mode = isAsc ? ASC : DESC;for (R column : columns) {doIt(condition, ORDER_BY, () -> columnToString(column), mode);}return typedThis;}
  • 第一个参数:执行条件,是否执行
  • 第二个条件:升降序,升序则为ASC,降序为DESC
  • 第三个条件:列属性

2. API示例

  • orderBy(fieldName):orderBy 方法用于指定按照某个字段进行排序,默认是升序排列。

通过指定字段名,生成 SQL 查询语句中的 ORDER BY 子句,用于排序结果集。

// 示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderBy("age");
  • orderByDesc(fieldName):orderByDesc 方法用于指定按照某个字段进行降序排序。

通过指定字段名,生成 SQL 查询语句中的 ORDER BY 子句,用于降序排序结果集。

// 示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("age");
  • orderByAsc(fieldName):orderByAsc 方法用于指定按照某个字段进行升序排序。

通过指定字段名,生成 SQL 查询语句中的 ORDER BY 子句,用于升序排序结果集。

// 示例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("age");

这些方法都是用于构建查询条件的 Wrapper 对象,并且可以链式调用。下面是一个简单的示例,展示如何使用这些方法:

// 示例
public class MyBatisPlusExample {public static void main(String[] args) {// 创建 QueryWrapper 对象QueryWrapper<User> queryWrapper = new QueryWrapper<>();// 添加查询条件queryWrapper.eq("gender", "male").ge("age", 18).le("age", 30).orderByDesc("age");// 执行查询List<User> userList = userDao.selectList(queryWrapper);// 处理查询结果for (User user : userList) {System.out.println(user);}}
}

在上面的示例中,通过 queryWrapper.orderByDesc(“age”) 方法指定按照年龄字段降序排列结果集。这样,生成的 SQL 查询语句中就会包含 ORDER BY 子句,按照指定的条件排序查询结果。

3. 实战

假设数据表中的数据为:

在这里插入图片描述

实体类:

package com.example.demo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("test_user1")
public class User1 {@TableId(value = "id", type = IdType.AUTO)private int id;private String username;private int age;// 其他字段...
}

Mapper类为:

package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User1;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper1 extends BaseMapper<User1> {// 这里可以自定义一些查询方法
}

service类为:

package com.example.demo.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User1;public interface UserService1 extends IService<User1> {// 这里可以自定义一些业务方法
}

实现类为:

package com.example.demo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User1;
import com.example.demo.mapper.UserMapper1;
import com.example.demo.service.UserService1;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl1 extends ServiceImpl<UserMapper1, User1> implements UserService1 {// 这里可以实现自定义的业务方法
}

对应的测试类如下:

  • 将多个数据进行排序比较:
    @Testpublic void test16(){List<User1> user = userService1.list(new LambdaQueryWrapper<User1>().orderBy(true,false,User1::getAge,User1::getUsername));user.forEach(System.out::println);// 输出:// User1(id=3, username=user1, age=25)// User1(id=2, username=user1, age=19)// User1(id=4, username=user2, age=18)// User1(id=1, username=user1, age=18)}

截图如下所示:
(通过截图可以看出具体的顺序是怎样的,这有助于我们实战中的开发抽取某个类别!!请看下面的功能测试)

在这里插入图片描述

  • 如果有多个数据,可以获取最新一条数据:
    @Testpublic void test16(){User1 user = userService1.getOne(new LambdaQueryWrapper<User1>().eq(User1::getUsername,"user1").orderBy(true,false,User1::getAge).last("limit 1"));System.out.println(user);}

截图如下:(抽取最新的一条,从而忽略原先的数据,通过limit 1 加以配合限制)

在这里插入图片描述

对于orderByAsc以及orderByDesc,函数最后还是使用了orderBy,原理一致

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

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

相关文章

【Java】实验三 抽象类与接口

实验名称 实验三 抽象类与接口 实验目的 1. 深刻理解抽象类、接口的意义。 2. 熟练掌握抽象类和接口的定义、继承抽象类以及实现接口的方法。 3. 理解和掌握多态。 实验内容 &#xff08;一&#xff09;抽象类实验&#xff1a;项目源码中新建一个ahpu.shape的包&a…

低代码:实现数据可视化的强大助手

随着数据在企业中的价值越来越受到重视&#xff0c;数据可视化成为了决策者和业务专家们必备的工具。然而&#xff0c;传统的数据可视化开发过程常常繁琐且耗时&#xff0c;限制了其在应用中的广泛应用。低代码平台的出现&#xff0c;为实现高效的数据可视化提供了新的解决方案…

切换node.js不同版本

切换node.js不同版本 因新项目用到vite4创建项目&#xff0c;输入命令后报错&#xff0c;经查询得知是node版本过低导致&#xff0c;所以需要升级node版本&#xff0c;但是又有老的项目需要维护&#xff0c;因此需要多个版本的node使用需求。 流程&#xff1a; 卸载原有的node…

实验笔记之——Linux实现COLMAP

之前博客跑instant-NGP的时候&#xff0c;除了用官方的数据集&#xff0c;用自己的数据则是通过手机采集&#xff0c;同时获得pose与image。但是这种获取的方式对于3D gaussian而言&#xff0c;并不支持对应的数据格式&#xff0c;为此采用COLMAP来根据image获取pose&#xff0…

Python条件语句与运算符优先级详解,python学习必看

文章目录 Python 条件语句Python运算符优先级关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 Python 条件语句 …

springcloud之集成nacos config

写在前面 源码 。 本文看下如下集成nacos config组件。 1&#xff1a;常见配置方式分析 我们先来看下常见的配置方式都有哪些&#xff0c;以及其有什么优点和缺点。 硬编码 优点&#xff1a;hardcode&#xff0c;除了开发的时候快些&#xff0c;爽一下&#xff0c;有个屁优…

Jtti:UNIX管道和重定向功能在系统备份中怎么用

UNIX 管道和重定向功能是在系统备份和数据处理中非常有用的工具。它们可以用于将命令的输出传递给其他命令、将输出保存到文件中&#xff0c;以及通过管道传递数据流。以下是一些在系统备份中使用管道和重定向功能的例子&#xff1a; 1. 备份文件并将输出保存到文件&#xff1a…

深入理解C语言中的return关键字与函数返回机制

各位少年&#xff0c;我是博主那一脸阳光&#xff0c;今天分享return语句的使用和返回 引言 在C语言编程中&#xff0c;return关键字扮演着至关重要的角色&#xff0c;它是实现函数间数据传递和控制流程的关键工具。本文将详细探讨C语言中return语句的使用方式、作用机制以及它…

洗地机什么牌子最好?家用洗地机推荐指南

随着人们对健康和卫生的关注日益增长&#xff0c;洗地机成为了现代家庭清洁的必备工具。然而&#xff0c;在市场上琳琅满目的洗地机品牌中&#xff0c;洗地机哪个品牌最好最实用呢?这是消费者最为关心的问题。现本文将为您介绍几个备受推崇的洗地机品牌&#xff0c;帮助您在众…

Linux进程以及计划任务

一&#xff1a;程序&#xff1a; 1.什么是程序&#xff1f; 执行特定任务的一串代码 &#xff0c;是一组计算机能识别和执行的指令&#xff0c;运行于电子计算机上&#xff0c;满足人们某种需求的信息化工具 用于描述进程要完成的功能&#xff0c;是控制进程执行的指令集 二…

论文查重降重写成大白话可以吗

大家好&#xff0c;今天来聊聊论文查重降重写成大白话可以吗&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 论文查重降重&#xff1a;用大白话解析 一、引言 写论文是每个…

进程的韵律:探索计算机世界中的动态舞台

这里写目录标题 进程定义进程的组成进程与程序区别进程与线程区别进程特点进程控制结尾 进程定义 进程&#xff1a;一个具有一定功能的程序在一个数据集合上的一次动态执行过程。 进程是指正在运行的程序&#xff0c;它是操作系统进行资源分配和调度的基本单位。在计算机中&…

红日靶场第一关 attck

之前因为事情耽搁了&#xff0c;今天争取把第一关红日靶场完成 目前找到了关于外网服务器的网址 之前有过扫描目录得知了登陆界面 和爆破得到的密码 目前我们的想法是把病毒上传到网页当中&#xff0c;所以我们应该找个文件注入点 但是再次之前 我们需要找到网页的绝对路径 …

node知识点

谷歌浏览器内运行一个V8的JS引擎&#xff0c;该引擎负责接收JS代码&#xff0c;优化代码&#xff0c;然后在计算机上执行。 node.js: JS代码用于服务器端脚本而开发的环境。 开源跨平台&#xff1a;不局限于单一的操作系统或硬件架构JS运行时环境 node.js如何工作&#xff…

生成式AI:软件工程的未来伙伴

随着技术不断进步&#xff0c;软件工程正在经历一场革命性的变革。从最初的穿孔卡片和汇编语言编程&#xff0c;到现代集成开发环境和高级编程语言&#xff0c;软件工程已经走过了一条漫长的路。现在&#xff0c;生成式人工智能(AI)正打开新的篇章&#xff0c;不仅对传统的编码…

解决SyntaxError: future feature annotations is not defined,可适用其他包

方法&#xff1a;对报错的包进行降级 pip install tikzplotlib0.9.8site-packages后面是使用pip install安装的包&#xff0c;根据这个找到报错的包 想法来源&#xff1a; 环境是python3.6&#xff0c;完全按照作者要求进行环境配置&#xff0c;但仍报错。 我在网上找的解决…

当AI遇见大脑:电脑与人脑协同“进化”

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。借此机会&#xff0c;我们特别策划了“智启未来”系列文章&#xff0c;邀请到微软亚洲研究院不同研究领域的领军人物&#xff0c;以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…

FFmpeg之——获取上传视频的尺寸(长、宽)

获取上传视频的尺寸&#xff1a; 获取视频尺寸通常需要借助第三方库FFmpeg。 首先&#xff0c;确保你的系统中已安装了FFmpeg&#xff0c;并且FFmpeg的可执行文件路径已经添加到你的系统环境变量中。 1.官网下载ffmpeg 进入 链接: ffmpeg官网 网址&#xff0c;点击下载wind…

MySQL中的连接池

数据库的连接池 1 &#xff09;概述 网站连接数据库&#xff0c;为庞大用户的每次请求创建一个连接是不合适的关闭并重新连接的成本是很大的处理方法&#xff1a;设置最大值, 最小值, 设置最多闲置连接&#xff0c;设置等待阻塞 2 &#xff09;示例演示 import threading i…

C++五子棋人机对战(已修复已知问题)

C五子棋人机对战(含注释)-CSDN博客 C五子棋人机对战-CSDN博客 这两篇博客中有个bug&#xff0c;就是没加srand(time(0));这个语句(放在主函数的最开头) 改正代码 #include<bits/stdc.h>//万能头 #define ll long long using namespace std; ll n,a[1000][1000],x,y,…