五、MyBatis-Plus分页插件与联表查询

说明

mybatis plus内置的是逻辑分页,保存在内存中,而不是硬盘上。因此引入分页插件,实现物理分页,在数据量大时,物理分页比逻辑分页有优势。

参考 官方文档

分页插件

以admin-module微服务模块为示例,进行分页查询示例。

添加配置类MybatisPlusConfig

package com.admin.module.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
    
//    版本迭代,setUseDeprecatedExecutor方法已弃用,无需配置
//    @Bean
//    public ConfigurationCustomizer configurationCustomizer() {
//        return configuration -> configuration.setUseDeprecatedExecutor(false);
//    }
    
}

测试分页效果

package com.admin.module.controller;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.commons.school.entity.SchoolAdmin;
import com.commons.school.mapper.SchoolAdminMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
class SchoolAdminController {

    @Autowired
    private SchoolAdminMapper schoolAdminMapper;

    // 获取某个学校的全部管理员信息,分页测试接口
    @GetMapping("/schoolAdmin/getAdminList")
    public Map<String, Object> getAdminList(
            @RequestParam("sid") Long sid, @RequestParam("page") int pageNum, @RequestParam("size") int pageSize
    ) {

        //查询第pageNum页,每页pageSize条数据
        Page<SchoolAdmin> page = new Page<>(pageNum, pageSize);

        // 构建查询对象
        SchoolAdmin SchoolAdmin = new SchoolAdmin();
        SchoolAdmin.setSid(sid);

        // 查询条件
        QueryWrapper<SchoolAdmin> schoolAdminQueryWrapper = new QueryWrapper<>(SchoolAdmin);

        // 分页查询
        Page<SchoolAdmin> schoolAdminPage = schoolAdminMapper.selectPage(page, schoolAdminQueryWrapper);
        List<SchoolAdmin> records = schoolAdminPage.getRecords();

        // 返回信息
        Map<String, Object> result = new HashMap<>();
        result.put("code", 1);// 状态码
        result.put("msg", "success");// 信息
        result.put("length", records.size());// data长度
        result.put("data", JSONObject.toJSON(records));

        return result;
    }
}

测试类

/**
     * 分页测试
     * @param sid
     * @param page
     * @param size
     */
    public void testSelectPage(Long sid, int page, int size) {
        String CHECK_CODE_URI =
                "http://localhost:8071/schoolAdmin/getAdminList?sid={sid}&page={page}&size={size}";
        String uriString = UriComponentsBuilder.fromUriString(CHECK_CODE_URI)
                .buildAndExpand(sid, page, size).toString();
        JSONObject result = restTemplate.getForObject(uriString, JSONObject.class);
        assert result != null;
        log.info("result[] => {}",result.toJSONString());
    }

运行测试

先启动主类再启动测试类。

测试通过,但是数据不好看,用postman效果比较好:

分页插件功能正常,但单表查询是不够的,在此基础上做联表查询,使用的是xml方式,没有使用注解方式是个人觉得xml方式比较灵活。

联表分页查询

在mapper自定义一个分页方法

package com.commons.school.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.commons.school.entity.SchoolAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author yushanma
 * @since 2021-05-25
 */
public interface SchoolAdminMapper extends BaseMapper<SchoolAdmin> {

    /**
     * <p>
     * 查询 : 根据sid状态查询学校管理员,分页显示
     * </p>
     *
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @param sid 学校id
     * @return 分页对象
     */
    IPage<SchoolAdmin> selectAdminPage(Page<?> page, Long sid);

}

Mapper.xml 编写一个普通 list 查询,交付mybatis-plus 自动分页

<?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.commons.school.mapper.SchoolAdminMapper">
    <select id="selectAdminPage" resultType="com.commons.school.entity.SchoolAdmin">
        SELECT b.id,b.username,b.sid,b.reg_time,b.roles,b.status
        FROM dgut_school a,dgut_school_admin b
        WHERE a.id = b.sid
        AND a.id = #{sid}
    </select>
</mapper>

调用自定义分页查询方法

运行测试

测试通过,在xml中没有选中的字段全部都是null:

指定一个不存在的sid时返回长度为0的data:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余衫马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值