MybatisPlus多表查询及分页查询完整代码

 更新时间:2024年08月19日 14:50:30   作者:华农第一蒟蒻  
这篇文章主要介绍了MybatisPlus多表查询及分页查询完整代码,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

多表查询

  • 实体类准备:在实体类中使用MyBatis-Plus的注解来映射数据库表和字段。比如,@TableName@TableField@TableId 注解用于标识实体类、字段以及主键。
  • 构建查询条件:使用QueryWrapper类可以创建查询条件方法,并指定联合查询条件。在条件中使用表的别名来指定字段,比如user.age 指的是 user 表中的 age 字段。
  • 执行查询:调用MyBatis-Plus提供的方法执行查询,比如selectList()selectPage()方法。

示例代码

// 多表查询示例
public List<UserVO> selectUserVOList() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user.age", 18)
                .like("user.username", "Jack")
                .orderByDesc("user.id");
    return userMapper.selectUserVOList(queryWrapper);
}
// 自定义 SQL 查询示例
@Select("SELECT u.id, u.username, a.address FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.age = #{age}")
List<UserAddressVO> selectUserAddressVOList(@Param("age") Integer age);
// 多表查询示例
public List<UserVO> selectUserVOList() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user.age", 18)
                .like("user.username", "Jack")
                .orderByDesc("user.id");
    return userMapper.selectUserVOList(queryWrapper);
}
// 自定义 SQL 查询示例
@Select("SELECT u.id, u.username, a.address FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.age = #{age}")
List<UserAddressVO> selectUserAddressVOList(@Param("age") Integer age);

第一段段代码使用了 QueryWrapper 来构建查询条件。

  • queryWrapper.eq("user.age", 18) 表示筛选出 user 表中 age 字段值等于 18 的记录。
    • eq 是“等于”的条件设置方法。
  • queryWrapper.like("user.username", "Jack") 表示筛选出 user 表中 username 字段值类似于 “Jack” 的记录。
    • like 用于模糊匹配,这里会匹配包含 “Jack” 的用户名。
  • queryWrapper.orderByDesc("user.id") 表示按照 user 表中 id 字段的值降序排列查询结果。
    • orderByDesc 用于设置降序排序

例如,如果在查询用户数据时使用了这些条件,那么最终得到的结果将是年龄为 18 岁、用户名包含 “Jack” ,并且按照用户 id 从大到小排序的数据。

第二段段代码是一个在 MyBatis-Plus 中的自定义 SQL 查询的示例。

  • @Select("SELECT u.id, u.username, a.address FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.age = #{age}"):这是一个 @Select 注解,用于定义一个自定义的 SQL 查询语句。它表示从 user 表(表别名 u )和 address 表(表别名 a )进行内连接(INNER JOIN ),连接条件是 u.address_id = a.id ,并且筛选出 u.age 等于传入参数 age 的记录。#{age} 是一个占位符,用于接收实际传入的参数值。
  • List<UserAddressVO> selectUserAddressVOList(@Param("age") Integer age):这定义了一个方法,返回类型是一个 List ,其中元素类型是 UserAddressVO 。方法名为 selectUserAddressVOList ,并且通过 @Param("age") 注解将传入的参数 age 与 SQL 语句中的占位符 #{age} 进行关联。

例如,如果传入的 age 值为 20 ,那么这个查询就会返回年龄为 20 岁的用户的 idusername 以及对应的地址信息。

补充:

内连接(inner join)是SQL中最常见的连接类型之一,用于根据两个表之间的共同值来合并数据。内连接返回两个表中满足连接条件的行,即返回两个表中共同的行。
具体来说,内连接会根据连接条件(通常是两个表之间的共同字段)将两个表中符合条件的行进行匹配,并将匹配的结果作为输出。如果某行在一个表中有匹配,但在另一个表中没有匹配,那么这行数据将不会包含在内连接的结果中。
内连接通常使用INNER JOIN关键字来表示,语法形式如下:

SELECT 列名
FROM 表1
INNER JOIN 表2
ON 表1.共同字段 = 表2.共同字段;

在这个语句中,INNER JOIN表示进行内连接操作,ON关键字用于指定连接条件,即指定两个表之间用于匹配的共同字段。
内连接是SQL中最常用的连接类型之一,用于从多个表中检索相关数据,是数据查询和分析中非常重要的操作。

分页查询

  • 准备分页对象:MyBatis-Plus提供了Page类,用于封装分页查询条件。你需要传入页码和每页查询数量作为参数。
  • 构建分页查询条件:在查询条件中指定需要查询的条件,然后将分页对象和查询条件传递给selectPage()方法。
  • 执行分页查询:调用selectPage()方法执行分页查询,它会返回一个IPage对象,其中包含了查询结果和分页信息。

示例代码

// 分页查询示例
public IPage<User> selectUserPage(Page<User> page) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("age", 18);
    return userMapper.selectPage(page, queryWrapper);
}
// 自定义分页查询示例
public IPage<User> selectUserPage(Page<User> page, Integer age) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("age", age);
    return userMapper.selectPage(page, queryWrapper);
}

第一段代码:分页查询示例

public IPage<User> selectUserPage(Page<User> page) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("age", 18);
    return userMapper.selectPage(page, queryWrapper);
}
  • public IPage<User> selectUserPage(Page<User> page):这定义了一个公共方法,返回类型为 IPage<User>,表示分页查询的结果。方法名为 selectUserPage,并接收一个 Page<User> 类型的参数 page,用于设置分页的相关信息(如当前页码、每页条数等)。
  • QueryWrapper<User> queryWrapper = new QueryWrapper<>();:创建了一个用于构建查询条件的 QueryWrapper 对象。
  • queryWrapper.eq("age", 18);:使用 eq 方法设置查询条件,即筛选出年龄(age)等于 18 的用户记录。
  • return userMapper.selectPage(page, queryWrapper);:调用 userMapper 中的 selectPage 方法进行分页查询。将之前创建的分页对象 page 和包含查询条件的 queryWrapper 作为参数传入,最终返回分页查询的结果。

第二段代码:自定义分页查询示例

public IPage<User> selectUserPage(Page<User> page, Integer age) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("age", age);
    return userMapper.selectPage(page, queryWrapper);
}

这段代码与第一段类似,但增加了一个参数 age 用于自定义年龄条件。

  • public IPage<User> selectUserPage(Page<User> page, Integer age):方法接收两个参数,除了分页对象 page ,还有一个整数类型的 age 参数,用于指定具体的年龄条件。
  • queryWrapper.eq("age", age);:这里将传入的 age 参数值作为年龄的筛选条件。
  • 同样通过 userMapper.selectPage(page, queryWrapper) 进行分页查询并返回结果。

例如,如果在第一段代码中,假设每页显示 10 条数据,当前是第 2 页,那么它会返回年龄为 18 岁的用户数据,并且按照每页 10 条,第 2 页的规则进行分页。

在第二段代码中,如果传入的 age 为 25 ,其他条件相同,那么会返回年龄为 25 岁的用户数据的分页结果。

补充:

在上述代码中,Page<User> page 是一个用于分页操作的对象,它具有以下几个重要的属性和功能:

  • current:表示当前要获取的页码。页码从 1 开始计数。例如,如果 current 的值为 2 ,则表示要获取的是第 2 页的数据。
  • size:指定每页显示的记录数量。例如,如果 size 的值为 10 ,则每页将返回 10 条记录。除了设置这两个属性来控制分页的页码和每页记录数,Page 对象还可以用于获取一些与分页相关的其他信息,比如:
- 总记录数:通过调用相关方法可以获取整个查询结果集的总记录数。
- 总页数:根据总记录数和每页记录数,可以计算出总的页数。
- 是否有上一页和下一页:可以判断当前页是否有前一页或后一页,以便在前端进行页面导航的显示控制。
  • 假设我们有一个数据库表,其中总共有 50 条用户记录,并且设置 pagesize 为 10 :

  • 如果 current 为 1 ,则会获取第 1 页的 10 条记录(记录 1 - 10)。
  • 如果 current 为 3 ,则会获取第 3 页的 10 条记录(记录 21 - 30)。

这样,通过灵活设置 page 对象的 currentsize 属性,就可以实现对数据的分页获取和展示。

使用 Page 对象进行分页查询的完整代码示例

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class PageExampleTest {
    @Autowired
    private UserMapper userMapper;  // 假设您有一个 UserMapper 接口
    @Test
    public void testPageQuery() {
        // 创建 Page 对象,设置当前页码为 2,每页记录数为 5
        Page<User> page = new Page<>(2, 5);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 可以添加其他查询条件
        IPage<User> userIPage = userMapper.selectPage(page, queryWrapper);
/*在 MyBatis-Plus 中,`IPage` 是 MyBatis-Plus 自定义的用于表示分页结果的接口。通过使用 `IPage` ,可以方便地获取分页相关的信息,如总记录数、当前页数据、每页记录数、当前页码、总页数等。*/
        // 获取总记录数
        long total = userIPage.getTotal();
        // 获取当前页数据列表
        List<User> userList = userIPage.getRecords();
        // 获取当前页码
        int currentPage = userIPage.getCurrent();
        // 获取每页记录数
        int pageSize = userIPage.getSize();
        // 获取总页数
        int totalPages = userIPage.getPages();
        System.out.println("总记录数: " + total);
        System.out.println("当前页数据列表: " + userList);
        System.out.println("当前页码: " + currentPage);
        System.out.println("每页记录数: " + pageSize);
        System.out.println("总页数: " + totalPages);
    }
}

到此这篇关于MybatisPlus多表查询及分页查询的文章就介绍到这了,更多相关MybatisPlus多表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在SpringBoot中该如何配置拦截器

    在SpringBoot中该如何配置拦截器

    今天给大家带来的是关于SpringBoot的相关知识,文章围绕在SpringBoot中该如何配置拦截器展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 一分钟掌握Java ElasticJob分布式定时任务

    一分钟掌握Java ElasticJob分布式定时任务

    ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,本文主要通过简单的示例带大家深入了解ElasticJob分布式定时任务的相关知识,需要的可以参考一下
    2023-05-05
  • 详解Springboot事务管理

    详解Springboot事务管理

    本篇文章主要介绍了详解Springboot事务管理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java定义队列结构,并实现入队、出队操作完整示例

    Java定义队列结构,并实现入队、出队操作完整示例

    这篇文章主要介绍了Java定义队列结构,并实现入队、出队操作,结合完整实例形式分析了java数据结构中队列的定义、入队、出队、判断队列是否为空、打印队列元素等相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • 详解SpringBoot中的统一结果返回与统一异常处理

    详解SpringBoot中的统一结果返回与统一异常处理

    这篇文章主要将通过详细的讨论和实例演示来帮助你更好地理解和应用Spring Boot中的统一结果返回和统一异常处理,感兴趣的小伙伴可以了解下
    2024-03-03
  • Java流程控制break和continue

    Java流程控制break和continue

    这篇文章主要介绍了Java流程控制break和continue,下面文章围绕break和continue的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2021-12-12
  • Spring Cloud Hystrix异常处理方法详解

    Spring Cloud Hystrix异常处理方法详解

    这篇文章主要介绍了Spring Cloud Hystrix异常处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • java如何自定义注解

    java如何自定义注解

    这篇文章主要介绍了java如何自定义注解问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Java实现三子棋小游戏简易版

    Java实现三子棋小游戏简易版

    这篇文章主要为大家详细介绍了Java实现三子棋小游戏简易版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java中Map和Set的常见用法举例

    Java中Map和Set的常见用法举例

    Map和Set是一种专门用来进行搜索的容器或者数据结构,其具体效率与具体的实例化子类有关,下面这篇文章主要给大家介绍了关于Java中Map和Set的常见用法,需要的朋友可以参考下
    2024-04-04

最新评论