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

news2025/5/25 9:24:31

目录

  • 前言
  • 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类中)

    @Override
    public 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 {
    // 这里可以实现自定义的业务方法
}

对应的测试类如下:

  • 将多个数据进行排序比较:
    @Test
    public 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)

    }

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

在这里插入图片描述

  • 如果有多个数据,可以获取最新一条数据:
    @Test
    public 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.coloradmin.cn/o/1355841.html

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

相关文章

提升代码托管,助力大数据学习!Git学习网站等你来挑战!

介绍&#xff1a;Git是一个开源的分布式版本控制系统&#xff0c;可以高效地处理各种规模项目的版本管理。它是Linus Torvalds为了帮助管理Linux内核开发而开发的开放源码版本控制软件。在Git中&#xff0c;你可以掌握工作区、暂存区和版本库等核心概念&#xff0c;并学会使用常…

SV-7042VP 15W sip网络有源音箱,可外接15W无源副音箱

SV-7042VP 15W sip网络有源音箱,可外接15W无源副音箱 一、描述 SV-7042VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率15W。同时它可以外接一个15W的…

VSCode上远程调试代码出现的问题

记录一下&#xff1a; 真的是汗流浃背了&#xff0c;师妹叫帮忙如何在VSCode上远程调试代码&#xff0c;一些自己已经经历过的问题&#xff0c;现在已经忘记了。又在网上一顿搜索&#xff0c;这次记录下吧。。。 出现以下问题&#xff1a; 1. 终端界面总是sh-4.4 $ &#xff…

【自动化测试】转行人员在面试中被问及计算机基础知识该怎么办?????(长文,预计三小时阅读)

看前提示&#xff0c;本文共4W字&#xff0c;76道题&#xff08;附答案&#xff09; 全部看完预计三个小时&#xff0c;如果觉得时间长&#xff0c;可以直接跳转到文末&#xff0c;有本文的word版提供下载 近些年软件测试岗位从转行的来人越来越多&#xff0c;占比高达44% 软件…

OPENGL,GPU图形库Skia在Windows下编译多种VS版本的DLL

这几天刚改了改Duilib&#xff0c;之前为了让Duilib更好的支持透明异形窗体所以把Duilib改为Gdi和Gdi的双渲染引擎。于是想到了有时间就把渲染引擎完全独立为渲染接口&#xff0c;可以增加更多的渲染引擎。现在来说Skia是个很不错的渲染&#xff0c;之前我只是单独编译了VS2013…

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

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

软件测试基础理论学习-常见软件开发模型

瀑布模型 背景 瀑布模型的概念最早在1970年由软件工程师Winston W. Royce在其论文《Managing the Development of Large Software Systems》中提出。Royce虽然没有明确提出“瀑布模型”这个术语&#xff0c;但他描述了一种线性的、阶段性的开发流程&#xff0c;各个阶段之间具…

小迪安全第一天

一、常用的专业术语 参考&#xff1a; https://www.cnblogs.com/sunny11/p/13583083.html POC&#xff08;proof of concept&#xff09;验证漏洞的代码EXP(exploit) 利用对一段漏洞代码的利用Playload:有效载荷&#xff0c;当利用exploit成功后如何通过一个管道把这个权限给…

集群渲染是?渲染农场是?两者与云渲染关联是什么

在数字化浪潮不断推进的当下&#xff0c;渲染技术在多个行业中发挥着至关重要的作用&#xff0c;尤其体现在电影制作、建筑可视化以及电子游戏开发等领域。在众多渲染技术中&#xff0c;集群渲染、渲染农场以及云渲染特别受到业界的重视。本文旨在阐述这些概念的含义以及它们之…

蛇目标检测数据集VOC格式750张

蛇&#xff0c;一种令人着迷而又神秘的爬行动物&#xff0c;以其独特的外貌和习性&#xff0c;成为了自然界中的一道独特风景。 蛇的外观光滑细长&#xff0c;身体呈流线型&#xff0c;鳞片覆盖全身&#xff0c;使得它们能够在地面上或树枝间快速移动。大多数蛇拥有尖锐的毒牙…

小目标识别任务算法

小目标识别是计算机视觉领域中的一个挑战性任务&#xff0c;主要是指在图像或视频中检测和识别尺寸相对较小的目标。 以下是一些常见的小目标识别算法&#xff1a; Faster R-CNN&#xff1a; Faster R-CNN是一种基于深度学习的目标检测算法&#xff0c;通过引入区域建议网络&am…

算法导论复习——CHP22 基本图算法

图的表示 邻接矩阵和邻接表 稀疏图一般用邻接表表示&#xff08;稀疏图&#xff1a;边数|E|远小于的图 &#xff09; 稠密图更倾向于用邻接矩阵表示 (稠密图&#xff1a;边数|E|接近的图) 邻接矩阵可用于需要快速判断任意两个结点之间是否有边相连的应用场景。 如果用邻…

VSCode远程连接centos

1 下载remote -ssh插件 2 在上方打开命令面板&#xff0c;输入>,再输入ssh&#xff0c;选择设置 Remote-SSH:Settings 那行 3 勾选下面这个选项 4 点击加号旁边的那个齿轮&#xff0c;选择.ssh\config ,配置连接信息&#xff0c;保存好后&#xff0c;刷新。 4 连接centos,然…

springBoot2.3-简单了解依赖管理、自动配置

一、自动依赖管理 基本介绍&#xff1a;springBoot提前帮我们写好了极多的依赖及版本号&#xff0c;当然我们也可以自定义依赖项与版本号。 1.1 简单介绍 1、在入门案例中&#xff0c;springBoot的maven中引入了parent父工程 2、ctrl 左键 parent&#xff0c; 发现里边还有…

图像融合算法

图像融合是将两个或多个图像或图像的特定部分合并在一起的过程。这可以通过各种图像融合算法来实现&#xff0c;这些算法可以用于不同的应用&#xff0c;如图像编辑、计算机视觉和医学图像处理。以下是一些常见的图像融合算法&#xff1a; 透明度融合&#xff08;Alpha Blendi…

智能洗地机哪款最好用?智能洗地机推荐

洗地机是一种非常实用的家居清洁设备&#xff0c;可以有效地清理地面上的污垢和灰尘&#xff0c;给人们的生活带来了极大的便利性。那么洗地机哪个牌子最好用呢?市场上出现了越来越多的洗地机品牌&#xff0c;究竟哪一款智能洗地机更好用呢?本文将为大家简单介绍一下! 在选择…

这份江苏“最牛”医院和科室名单,我们核实过了

这份榜单不仅评出了全国100家最具科技影响力医院 还公布了25个医院学科影响力排行 那么&#xff0c;江苏哪些医院和科室入榜了呢&#xff1f; ▲戳大图更清晰 具体到学科排名 是这样的 心血管病 ▲戳大图更清晰 呼吸病学 ▲戳大图更清晰 消化病学 ▲戳大图更清晰 血液病…

接口和抽象类有什么共同点和区别?

共同点&#xff1a; 都不能被实例化。都可以包含抽象方法。都可以有默认实现的方法&#xff08;Java 8 可以用 default 关键字在接口中定义默认方法&#xff09;。 区别&#xff1a; 接口主要用于对类的行为进行约束&#xff0c;你实现了某个接口就具有了对应的行为。抽象类…

halcon 缺陷检测--形状匹配+差分

一、前言 本篇主要总结使用halcon 做缺陷检测的一个常用思路&#xff0c;当一张图片拍摄多个待检测工件&#xff0c;常用方法是由预先建立好的模版图像&#xff0c;采用 形状匹配查分方法抠下每个工件&#xff0c;逐个检测。 形状匹配比灰度值匹配要更为可靠 二、代码 代码是对…

目标管理(案例)

介绍 本篇Codelab将介绍如何使用State、Prop、Link、Watch、Provide、Consume管理页面级变量的状态&#xff0c;实现对页面数据的增加、删除、修改。要求完成以下功能&#xff1a; 实现一个自定义弹窗&#xff0c;完成添加子目标的功能。实现一个可编辑列表&#xff0c;可点击指…