MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。以下是 MyBatis-Plus 中常用复杂查询(如 LIMIT、ORDER BY、GROUP BY、HAVING、LIKE 等)的引例:

1. 环境准备

首先,确保你已经在项目中添加了 MyBatis-Plus 的依赖。以 Maven 为例:

复制代码
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

2. 实体类和 Mapper 接口

假设我们有一个 User 实体类和对应的 UserMapper 接口:

复制代码
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

3. 常用复杂查询示例

3.1 LIMIT 查询

LIMIT 用于限制查询结果的数量。在 MyBatis-Plus 中,可以使用 Page 类来实现类似 LIMIT 的功能。

复制代码
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsersWithLimit(int pageNum, int pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        IPage<User> userPage = userMapper.selectPage(page, null);
        return userPage.getRecords();
    }
}
3.2 ORDER BY 查询

ORDER BY 用于对查询结果进行排序。在 MyBatis-Plus 中,可以使用 QueryWrapper 来实现排序。

复制代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsersOrderByAgeDesc() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("age");
        return userMapper.selectList(wrapper);
    }
}
3.3 GROUP BY 和 HAVING 查询

GROUP BY 用于对查询结果进行分组,HAVING 用于筛选分组后的结果。在 MyBatis-Plus 中,可以使用 QueryWrapper 结合 groupBy 和 having 方法来实现。

复制代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<Map<String, Object>> getUsersGroupByAgeHavingCount() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.select("age", "COUNT(*) as count")
               .groupBy("age")
               .having("COUNT(*) > 1");
        return userMapper.selectMaps(wrapper);
    }
}
3.4 LIKE 查询

LIKE 用于模糊查询。在 MyBatis-Plus 中,可以使用 QueryWrapper 的 like 方法来实现。

复制代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsersLikeName(String keyword) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("name", keyword);
        return userMapper.selectList(wrapper);
    }
}

4. 测试代码

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;
import java.util.Map;

@SpringBootApplication
public class Application implements CommandLineRunner {
    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // LIMIT 查询
        List<User> usersWithLimit = userService.getUsersWithLimit(1, 10);
        System.out.println("LIMIT 查询结果:" + usersWithLimit);

        // ORDER BY 查询
        List<User> usersOrderByAgeDesc = userService.getUsersOrderByAgeDesc();
        System.out.println("ORDER BY 查询结果:" + usersOrderByAgeDesc);

        // GROUP BY 和 HAVING 查询
        List<Map<String, Object>> usersGroupByAgeHavingCount = userService.getUsersGroupByAgeHavingCount();
        System.out.println("GROUP BY 和 HAVING 查询结果:" + usersGroupByAgeHavingCount);

        // LIKE 查询
        List<User> usersLikeName = userService.getUsersLikeName("张");
        System.out.println("LIKE 查询结果:" + usersLikeName);
    }
}

以上示例展示了 MyBatis-Plus 中常用复杂查询的使用方法,你可以根据实际需求进行调整。

相关推荐
xfan_me29 分钟前
维修保养记录精准版 API 对接实战指南
java·大数据·python
Keven-zhou31 分钟前
不用先学前端框架,Java后端也能独立交付项目?飞算JavaAI实测
java
海上小飞龙32 分钟前
改一个数,右边全得重算,这题怎么扛住两万次查询
java·c++·python
Leo.yuan33 分钟前
从“看全局“到“评成效“:央国企穿透式监管六步链路,哪些厂商能真正闭环
java·大数据·人工智能
小马哥程序开发1 小时前
[点赞收藏免费领取 · 项目源码]57105基于Spring Boot的充电桩管理系统的设计与实现
java·spring boot·源码·课程设计·毕设·大作业·课设
九皇叔叔1 小时前
【09】SpringBoot4 MyBatisPlus 增删改查(CRUD)
java·mybatis·mybatisplus
白杨尚青2 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
anew___2 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
天天向上2912 小时前
Spring AI 实战:14 个踩坑记录,其中一个让我的测试全绿但产品是坏的
java·开源
正在走向自律2 小时前
从只写接口到独立交付前后端,飞算JavaAI能给Java后端工程师多少溢价?
java·springboot·ai编程·全栈开发·java求职·飞算javaai·金九银十