实战中学习并进行补充该类的源码以及应用
在 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第三个条件
:列属性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 子句,按照指定的条件排序查询结果。
假设数据表中的数据为:
实体类:
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,原理一致