【Mybatis-Plus】分页简单使用

一、前期准备:

1. 创建测试表:用户并插入数据

create table user
(
	id int(20) auto_increment comment 'id',
	username varchar(20) null comment '用户名',
	gender tinyint null comment '''0保密 1男 2女',
	password varchar(32) null comment '密码',
	age int(4) null comment '年龄',
	create_time datetime null comment '创建时间',
	constraint user_pk
		primary key (id)
)
comment '用户表';

在这里插入图片描述

2. 导入mybatis-plus依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

3. 连接数据库:application.yaml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

server:
  port: 9090

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  # 控制台打印sql语句
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4. 生成实体类

@Data
@TableName(value = "user")
public class UserEntity{

    /**
     * id
     */
    @TableId
    private Long id;
    
    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 0保密 1男 2女
     */
    private Integer gender;

    /**
     * 年龄
     */
    private Integer age;
}

5. 配置类

参考:分页插件 - PaginationInnerInterceptor

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig{

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setOptimizeJoin(true);
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);
        return interceptor;
    }

}

二、Mybatis-Plus帮助文档分析

Mybatis-Plus分页插件

在这里插入图片描述

  1. 参数page:为查询的结果集进行一个自动分页.换句话来说,就是指定查询出来的结果集怎么样显示。比如:返回的结果集要显示第1页的数据,并且每页显示10行 —> new Page(1,10)
  2. 编写一个普通的list查询:需求显示什么样的数据,你只需要给我一个list就行了。参数page会按照你的规则进行分页。
  3. 继承Page实现自己的分页对象:显示下一行、前一行等等这种功能,你就需要自己写一个分页对象规则。

总结:就是相当于你要自定义一个多表的复杂查询返回来一个list之后,通过你指定的page参数的分页规则,来进行分页

三、功能实现

目的:通过发起请求传过来的gender参数来分页查询。
要求:显示第1页的数据,且每页仅有2行

1. 总览目录结构

在这里插入图片描述

2. 代码编写

UserController.java

指定了显示第1页的数据,且每页仅有2行 new Page<>(1, 2)
编写了一个普通的list查询:selectUserByGender


使用了两种方法实现:

  1. 简单分页查询:用条件构造器QueryWrapper就能够实现
  2. 复杂分页查询:就必须自己手写mapper文件:联表查询
@RestController
public class UserController {

    @Autowired
    private UserService userService;
    
	 /**
     * <p>
     * 查询 : 根据gender性别查询用户列表,分页显示
     * </p>
     *
     * @param page 指定当前页码1 ,每页显示2行
     * @param state 状态
     * @return 分页对象
     */
    @RequestMapping("/{gender}")
    public void test(@PathVariable Integer gender) {
		// 模拟复杂分页查询
        IPage<UserEntity> userEntityIPage = userService.selectUserByGender(new Page<>(1, 2), gender);
        System.out.println("总页数: " + userEntityIPage.getPages());
        System.out.println("总记录数: " + userEntityIPage.getTotal());
        userEntityIPage.getRecords().forEach(System.out::println);
		// 简单分页查询
        QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("gender", gender);
        userService.pageByGender(new Page<>(1, 2), queryWrapper);
        System.out.println("总页数: " + userEntityIPage.getPages());
        System.out.println("总记录数: " + userEntityIPage.getTotal());
        userEntityIPage.getRecords().forEach(System.out::println);
    }
}
UserService.java

不涉及到啥复杂的处理,直接调用DAO层

@Service
public class UserService{

    @Autowired
    private UserMapper userMapper;

	// 模拟复杂分页查询
    public IPage<UserEntity> selectUserByGender(Page<UserEntity> page,Integer gender){
        return userMapper.selectUserByGender(page,gender);
    }
	
	// 简单分页查询:条件构造器QueryWrapper
    public IPage<UserEntity> pageByGender(Page<UserEntity> page, QueryWrapper<UserEntity> queryWrapper){
        return userMapper.selectPage(page,queryWrapper);
    }
}
UserMapper.java

官网说可以继承或者不继承BaseMapper。
我之所以实现是因为测试实现简单的分页查询:调用了条件构造器QueryWrapper里面的方法

@Mapper
public interface UserMapper extends BaseMapper<UserEntity> {

	// 通过性别分页查询
    IPage<UserEntity> selectUserByGender(Page<UserEntity> page, @Param("gender") Integer gender);
}
UserMapper.xml

根据官网的文档分析:根据需求查询编写一个list查询;
所以,我们就是需要自己写一个SQL语句查询 :根据gender输入的情况:显示用户列表

<?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.hyl.demo.mapper.UserMapper">
    <sql id = "entity">
        a.id,a.username,a.password,a.gender,a.age,a.create_time
    </sql>
    <select id="selectUserByGender" resultType="com.hyl.demo.entity.UserEntity">
        select <include refid="entity"/> from user a
        <where>
            <if test="gender != null">
                and a.gender = #{gender}
            </if>
        </where>
    </select>
</mapper>

3. 运行

执行了两次操作:

  1. 查询总行数
  2. 再进行SQL语句查询

http://localhost:9090/0
在这里插入图片描述

在这里插入图片描述

四、总结

第一个参数:

  • page:指定分页规则

第二个参数:

  • 复杂分页查询:自定义分页:编写SQL查询
  • 简单分页查询:条件构造器QueryWrapper

比较好的博客:
写的详细:ITKaven:MyBatis-Plus 之分页查询
写的很实用:致HTC:分页插件IPage

### 回答1: Mybatis-Plus分页插件是一个基于Mybatis分页插件,可以方便地实现分页查询功能。使用该插件,只需要在Mapper接口中定义一个继承BaseMapper的接口,并在方法中使用Page对象进行分页查询即可。 具体使用步骤如下: 1. 引入Mybatis-Plus分页插件依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 定义Mapper接口 在Mapper接口中继承BaseMapper,并定义一个方法,使用Page对象进行分页查询。例如: ``` public interface UserMapper extends BaseMapper<User> { List<User> selectUserPage(Page<User> page, @Param("name") String name); } ``` 3. 在Service中调用Mapper方法 在Service中调用Mapper方法,传入Page对象和查询条件,例如: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public IPage<User> getUserPage(Page<User> page, String name) { return userMapper.selectUserPage(page, name); } } ``` 4. 在Controller中调用Service方法 在Controller中调用Service方法,传入Page对象和查询条件,例如: ``` @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/page") public IPage<User> getUserPage(Page<User> page, String name) { return userService.getUserPage(page, name); } } ``` 以上就是Mybatis-Plus分页插件的使用步骤。通过使用该插件,可以方便地实现分页查询功能,提高开发效率。 ### 回答2: Mybatis-Plus是一个基于Mybatis的增强工具,为了提高开发效率和减少重复的CRUD操作而生。其中,Mybatis-Plus分页插件是其重要的功能之一,可以帮助开发人员快速的实现数据的分页查询。 Mybatis-Plus分页插件的使用非常简单,开发人员只需要在Mybatis-Plus的配置文件中进行一些简单的配置即可。以下是为您提供的Mybatis-Plus分页插件使用方法: 1.引入依赖:首先我们需要在项目中引入自己构建的mybatis-plus-boot-starter,或者直接在pom.xml中引入Mybatis-Plus对应版本的依赖。 2.配置分页插件:在mybatis-plus.yml中配置分页插件,如下所示: mybatis-plus: # 配置分页插件 configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置 Mybatis-Plus 分页插件 plugins: - interceptor: class: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor 3.配置分页查询:在Mapper接口方法中添加分页参数,在Mapper.xml文件中添加分页查询的具体SQL语句,如下所示: //mapper 接口 public interface YourMapper extends BaseMapper<YourEntity> { IPage<YourEntity> selectPageVo(Page page, @Param("yourEntity") YourEntity yourEntity); } <!-- Mapper.xml --> <select id="selectPageVo" resultType="YourEntityVo"> select {yourEntity.*} from your_entity {yourEntity} where 1=1 <if test="yourEntity.name != null and yourEntity.name!=''"> and yourEntity.name like '%${yourEntity.name}%' </if> </select> 4.使用分页查询:在Service层中使用分页查询,如下所示: @Override public IPage<YourEntity> selectPageVo(Page<YourEntity> page, YourEntity yourEntity) { return this.getBaseMapper().selectPageVo(page, yourEntity); } 使用Mybatis-Plus分页插件,不仅可以实现简单分页查询,而且还可以自定义查询条件、排序方式等。总之,这是一个非常方便和实用的插件,可以让开发人员更快地进行数据操作和维护。 ### 回答3: Mybatis-plus 是一款基于 Mybatis 的增强工具包,它提供了很多的快捷操作,其中就包括分页插件。使用 Mybatis-plus 分页插件可以简化分页操作,提高代码的可读性和可维护性。 使用分页插件,需要先引入 Mybatis-plus 的依赖包。在 Spring Boot 中,可以通过 Gradle 或 Maven 的方式引入 Mybatis-plus 相关依赖,例如: ``` groovy dependencies { implementation 'com.baomidou:mybatis-plus-boot-starter:3.4.2' } ``` 在配置文件中加入分页插件配置: ``` yml mybatis-plus: page-params: limit: 10 # 每页显示条数 max-limit: 100 # 最大显示条数 overflow: false # 是否溢出 ``` 其中,`limit` 表示每页显示的条数,`max-limit` 表示最大显示的条数,`overflow` 表示是否允许溢出。 在 Mybatis-plus 的 Mapper 接口中定义查询方法时,需要加入 `IPage` 类型的参数,例如: ``` java import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; public interface UserMapper extends BaseMapper<User> { IPage<User> selectPageVo(Page<?> page, UserVo userVo); } ``` 其中,`Page` 类是 Mybatis-plus 中提供的分页对象,`User` 是实体类,`UserVo` 是查询参数,`selectPageVo` 方法就是查询分页方法。 在 Service 层中调用 Mapper 中定义的分页方法: ``` java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public IPage<User> selectPageVo(UserVo userVo) { Page<User> page = new Page<>(); page.setCurrent(userVo.getCurrentPage()); page.setSize(userVo.getPageSize()); return baseMapper.selectPageVo(page, userVo); } } ``` 在上面的示例中,`Page` 对象中设置了分页参数,`baseMapper` 是继承自 `BaseServiceImpl` 的默认的 Mapper 对象,`selectPageVo` 方法返回分页查询结果。 最后,在 Controller 中调用 Service 方法: ``` java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/page") public IPage<User> selectPageVo(UserVo userVo) { return userService.selectPageVo(userVo); } } ``` 在上面的示例中,`selectPageVo` 方法返回的就是分页查询结果。在前端展示时,可以通过获取到的 `IPage` 对象获取分页信息和查询结果,例如: ```javascript axios.get('/users/page', { params: { currentPage: 1, pageSize: 10, username: 'Tom' } }).then(res => { // 获取分页信息和查询结果 const { current, total, records } = res.data; // ... }); ``` 通过 Mybatis-plus分页插件,我们不仅可以简化分页操作,还可以通过配置实现一些高级功能,例如性能优化和多租户分页。因此,Mybatis-plus分页插件是一个非常实用的工具,值得推荐使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值