05使用MyBatis Plus的分页插件,自定义查询语句

分页插件

添加分页插件

分页就是将查询结果集的一部分取出来方便用户一页一页看 ,因为一次性把数据全部都查出来会降低用户的阅读体验

  • limit startIndex,length : startIndex是起始数据的下标(每页的起始索引),length是取几条数据(每页显示几条数据)
  • limit (pageNo-1) * pageSize,pageSize: 每页显示pageSize条记录,显示第pageNo页的数据
  • 如果起始下标是0可以省略,同样如果显示第一页的数据页码可以省略

MyBatis Plus自带分页插件只要简单的配置即可实现分页功能

  • 在MyBatis Plus底层,我们先写了查询功能然后它对我们的查询操作进行拦截,增加一些额外的操作红再执行查询操作从而达到分页的功能

第一步: 添加配置类config.MybatisPlusConfig,开启MyBatis Plus的插件功能

  • 先向容器中注入MyBatis Plus配置插件的对象MybatisPlusInterceptor,然后在插件对象内部添加分页插件对象PaginationInnerInterceptor
@Configuration
@MapperScan("com.atguigu.mybatisplus.mapper") //可以将启动类中的扫描Mapper接口的注解移到此处
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 配置MyBatis Plus中插件的对象
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 在插件对象中添加分页插件并设置数据库类型(不同数据库分页功能的实现过程不同)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

第二步: 使用MyBatis Plus提供的方法, 添加测试类测试分页功能

方法功能
Page<实体类> Page(当前页码,每页显示的总记录数)创建一个Page对象,存储查询到的分页数据分页相关的信息
Page<实体类> selectPage(Page page,Wrapper queryWrapper)BaseMapper提供的分页查询的方法,条件构造器为null时表示查所有
Page<实体类> page(Page page,Wrapper queryWrapper)IService接口提供的分页查询的方法,条件构造器为null时表示查所有
设置分页的相关参数(当前页码,每页显示的总记录数)

获取Page对象存储的分页数据分页相关的信息的方法,用来给前端设置页码中分页相关的超链接和按钮

方法名功能
List <实体类> getRecords获取查询到的分页数据
long getCurrent获取当前页的页码
long getSize获取每页显示的总记录数
long getTotal获取总记录条数(注意状态是未删除的记录)
long getPages获取总页数
boolean hasPrevious判断是否有上一页
boolean hasNext判断是否有下一页
@springBootTest
public class MybatisPlusPluginsTest{
    @Autowired
    private UserMapper userMapper;
    // 查询所有的用户并按照分页展示
    /*
    SELECT 
    	id,user_name AS name,age,email,is_deleted 
    FROM 
    	t_user 
    WHERE 
    	is_deleted=0 LIMIT ? ?
    */
    @Test
    public void testPage(){
        //添加分页对象设置分页参数即当前页码数和每页显示的记录数
        Page<User> page = new Page<>(2, 5);
        //条件构造器queryWrapper为null表示查询所有数据
        userMapper.selectPage(page, null);
        //获取分页对象Page封装的分页数据
        List<User> list = page.getRecords();
        //获取分页相关的数据
        list.forEach(System.out::println);
        System.out.println("当前页:"+page.getCurrent());
        System.out.println("每页显示的条数:"+page.getSize());
        System.out.println("总记录数(只包含删除状态是未删除的数据):"+page.getTotal());
        System.out.println("总页数:"+page.getPages());
        System.out.println("是否有上一页:"+page.hasPrevious());
        System.out.println("是否有下一页:"+page.hasNext());
    }
}
User(id=3, name=Tom, age=28, email=test3@baomidou.com, isDeleted=null) 
User(id=4,name=Sandy, age=21, email=test4@baomidou.com, isDeleted=null) 
User(id=5, name=Billie,age=24, email=test5@baomidou.com, isDeleted=null) 
User(id=8, name=ybc1, age=21,email=null, isDeleted=null)
User(id=9, name=ybc2, age=22, email=null, isDeleted=null)
当前页:2 每页显示的条数:5 总记录数(只包含删除状态是未删除的数据):12 总页数:3 是否有上一页:true 是否有下一页:true	

自定义查询语句用分页插件

第一步: 在UserMapper中自定义接口方法根据年龄查询用户列表并按照分页显示

  • 从MyBatis Plus自带的selectPage方法可以看出要想使用分页插件的功能,方法的第一个参数需要接收一个Page<实体类>对象并且返回值也是一个Page对象
@Repository
public interface UserMapper extends BaseMapper<User> {
    Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
}

第二步: 在application.yml文件中配置类型别名所对应的包,这样该包下所有类的别名默认就是类的简类名且不区分大小写

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 设置MyBatis-Plus的全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表的统一前缀
      table-prefix: t_
      # 设置统一的主键生成策略
      id-type: auto
  # 配置类型别名所对应的包
  type-aliases-package: com.atguigu.mybatisplus.pojo 

第三步: 在UserMapper.xml中编写自定义SQL,因为最后的结果集是要封装到User对象的属性中,所以返回的参数是User对象

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mybatisplus.mapper.UserMapper">
    <!--IPage<User> selectPageVo(Page<User> page, Integer age);-->
    <select id="selectPageVo" resultType="User">
        SELECT id,user_name,age,email FROM t_user WHERE age > #{age}
    </select>
</mapper>

第四步: 在测试类中测试自定义的接口方法

@Test
public void testSelectPageVo(){
    //设置分页参数
    Page<User> page = new Page<>(1, 5);
    userMapper.selectPageVo(page, 20);
    //获取分页数据
    List<User> list = page.getRecords();
    list.forEach(System.out::println);
    System.out.println("当前页:"+page.getCurrent());
    System.out.println("每页显示的条数:"+page.getSize());
    System.out.println("总记录数:"+page.getTotal());
    System.out.println("总页数:"+page.getPages());
    System.out.println("是否有上一页:"+page.hasPrevious());
    System.out.println("是否有下一页:"+page.hasNext());
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus 是一个功能强大的持久层解决方案,它内置了许多实用的插件,其中包括分页插件分页插件可以方便地进行数据分页查询操作,提高了查询效率和系统性能。 但是,在某些情况下,我们可能需要做一些自定义的 SQL 查询操作,例如多表关联查询、复杂的条件判断等。这时,我们可以通过自定义 SQL 来实现这些复杂的查询需求。 在 MyBatis Plus 中,自定义 SQL 有多种方式可以实现。常见的方式有以下几种: 1. 使用注解 @SelectProvider: 我们可以通过在 DAO 接口的方法上添加 @SelectProvider 注解来指定自定义 SQL 的提供者类,然后在提供者类中编写 SQL 语句。这样,在执行对应的方法时,就会执行自定义 SQL 语句。 2. XML配置文件配置 mapper: 另一种方式是在 MyBatis 的 XML 配置文件中编写自定义 SQL 语句,并在对应的 mapper 中配置对应的 SQL 语句的 ID 和 SQL 代码。然后,在 DAO 接口中通过 @Select 注解指定对应的 SQL 语句的 ID,就可以执行自定义 SQL 了。 无论使用哪种方式,我们需要熟悉 MyBatis 的 SQL 语法,并了解数据库的表结构和关系,才能编写出正确的自定义 SQL 语句。 总结起来,MyBatis Plus 分页插件确实非常方便,但在某些情况下需要进行自定义的SQL查询操作时,我们可以通过使用注解 @SelectProvider 或者在 XML 配置文件中配置 mapper 来实现自定义 SQL 的需求。这样可以满足我们对于复杂查询需求的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值