MyBatis-Plus自定义分页查询

MyBatis-Plus自定义分页查询

1、model

1.1、自定义分页类

继承Page接口

package com.wnx.mall.tiny.modules.test.model;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class MyPage<T> extends Page<T> {
    private Integer selectInt;
    private String selectStr;

    public MyPage(long current, long size) {
        super(current, size);
    }
}

1.2、设想的查询条件

package com.wnx.mall.tiny.modules.test.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ParamSome {

    private Integer param1;
    private String param2;
}

2、定义方法查询

2.1、mapper接口

package com.wnx.mall.tiny.modules.test.mapper;

import com.wnx.mall.tiny.modules.test.model.MyPage;
import com.wnx.mall.tiny.modules.test.model.ParamSome;
import com.wnx.mall.tiny.modules.test.model.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author wangnaixing
 * @since 2022-01-11
 */
public interface UserMapper extends BaseMapper<User> {

    /**
     * 3.x的page可以进行取值,多个入参记得加上注解!
     * 自定义的page类,必须放在入参第一位
     * 返回值可以用IPage<T>接收,也可以使用入参的MyPage<T>接收
     * @param myPage 自定义page
     * @param paramSome 条件查询的参数
     * @return
     */
    MyPage<User> mySelectPage(@Param("myPage") MyPage<User> myPage,@Param("paramSome") ParamSome paramSome);

}

2.2、mapper.xml

<?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.wnx.mall.tiny.modules.test.mapper.UserMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.wnx.mall.tiny.modules.test.model.User">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="age" property="age" />
        <result column="email" property="email" />
    </resultMap>
    <select id="mySelectPage" resultType="com.wnx.mall.tiny.modules.test.model.User">
        select * from user
            where age = #{myPage.selectInt} and name = #{myPage.selectStr}
               or age = #{paramSome.param1} and name = #{paramSome.param2}
    </select>


</mapper>

3、测试

       log.error("-------------------自定义 XML 分页-------------------------------------------------------");

        ParamSome paramSome = new ParamSome(20, "Jack");
        MyPage<User> page6 = mapper.mySelectPage(new MyPage<User>(1, 5).setSelectInt(20).setSelectStr("Jack"),
                paramSome);
        log.error("总条数 -------------> {}", page6.getTotal());
        log.error("当前页数 -------------> {}", page6.getCurrent());
        log.error("当前每页显示数 -------------> {}", page6.getSize());
        page6.getRecords().forEach(System.out::println);

3.1、结果

022-01-11 18:30:55.212 ERROR 13848 --- [           main] com.wnx.mall.tiny.PaginationTest         : ----------------------------------自定义 XML 分页-------------------------------------------------------
2022-01-11 18:30:55.218 DEBUG 13848 --- [           main] c.w.m.t.m.t.m.UserMapper.mySelectPage    : ==>  Preparing: SELECT COUNT(1) FROM user WHERE age = ? AND name = ? OR age = ? AND name = ? 
2022-01-11 18:30:55.219 DEBUG 13848 --- [           main] c.w.m.t.m.t.m.UserMapper.mySelectPage    : ==> Parameters: 20(Integer), Jack(String), 20(Integer), Jack(String)
2022-01-11 18:30:55.222 DEBUG 13848 --- [           main] c.w.m.t.m.t.m.UserMapper.mySelectPage    : ==>  Preparing: select * from user where age = ? and name = ? or age = ? and name = ? LIMIT ?,? 
2022-01-11 18:30:55.222 DEBUG 13848 --- [           main] c.w.m.t.m.t.m.UserMapper.mySelectPage    : ==> Parameters: 20(Integer), Jack(String), 20(Integer), Jack(String), 0(Long), 5(Long)
2022-01-11 18:30:55.227 DEBUG 13848 --- [           main] c.w.m.t.m.t.m.UserMapper.mySelectPage    : <==      Total: 5
2022-01-11 18:30:55.227 ERROR 13848 --- [           main] com.wnx.mall.tiny.PaginationTest         : 总条数 -------------> 13
2022-01-11 18:30:55.228 ERROR 13848 --- [           main] com.wnx.mall.tiny.PaginationTest         : 当前页数 -------------> 1
2022-01-11 18:30:55.228 ERROR 13848 --- [           main] com.wnx.mall.tiny.PaginationTest         : 当前每页显示数 -------------> 5
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Jack, age=20, email=test2@baomidou.com)
User(id=4, name=Jack, age=20, email=test2@baomidou.com)
User(id=5, name=Jack, age=20, email=test2@baomidou.com)
User(id=6, name=Jack, age=20, email=test2@baomidou.com)

### 回答1: Mybatis-Plus是一个Mybatis的增强工具,它提供了很多方便的功能,其中包括自定义分页查询自定义分页查询可以通过继承Mybatis-Plus的BaseMapper接口来实现。在自定义的Mapper接口中,可以定义一个方法,使用@Param注解来指定查询条件,使用Page对象来指定分页信息。 例如,定义一个自定义Mapper接口: public interface MyCustomMapper extends BaseMapper<User> { List<User> selectUserByAge(@Param("age") Integer age, Page<User> page); } 在这个接口中,我们定义了一个selectUserByAge方法,它接收一个age参数和一个Page对象。在方法中,我们可以使用Mybatis-Plus提供的Wrapper对象来构造查询条件,然后使用selectPage方法来执行查询。 例如,我们可以这样实现selectUserByAge方法: @Override public List<User> selectUserByAge(Integer age, Page<User> page) { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("age", age); return baseMapper.selectPage(page, wrapper).getRecords(); } 在这个实现中,我们使用QueryWrapper对象来构造查询条件,然后使用baseMapper的selectPage方法来执行查询。最后,我们返回查询结果中的记录列表。 使用自定义分页查询时,我们可以在Controller中使用Page对象来指定分页信息,例如: @GetMapping("/users") public Page<User> getUsers(@RequestParam Integer age, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { Page<User> page = new Page<>(pageNum, pageSize); List<User> users = myCustomMapper.selectUserByAge(age, page); page.setRecords(users); return page; } 在这个Controller中,我们使用@RequestParam注解来指定查询条件,然后使用Page对象来指定分页信息。最后,我们调用自定义Mapper接口的selectUserByAge方法来执行查询,然后将查询结果设置到Page对象中并返回。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值