Mybatis Plus快速实现关联查询并支持分页

1.相关基础类和工具类的准备

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 分页结果数据接收对象
 *
 */
@Data
@ApiModel(value = "分页数据")
public class PageData<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "总记录数")
    private int total;

    @ApiModelProperty(value = "列表数据")
    private List<T> list;

    @ApiModelProperty(value = "每页显示数量")
    private int size;

    @ApiModelProperty(value = "可显示的页数")
    private int pages;

    @ApiModelProperty(value = "当前页码,从1开始")
    private int current;

    public PageData(){}

    /**
     * 分页
     * @param list   列表数据
     * @param total  总记录数
     */
    public PageData(List<T> list, long total) {
        this.list = list;
        this.total = (int)total;
    }
}
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sxbscm.common.page.PageData;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class PageBuilder {

    private static <S,T> PageData<T> copy(IPage<S> page) {
        PageData<T> result = new PageData<T>();
        result.setSize((int)page.getSize());
        result.setTotal((int)page.getTotal());
        result.setPages((int)page.getPages());
        result.setCurrent((int)page.getCurrent());
        return result;
    }

    /**
     * 数据  转化
     * @param page
     * @param list
     * @param <S>
     * @param <T>
     * @return
     */
    public static <S, T> PageData<T> copyAndConvert(IPage<S> page, List<T> list) {
        PageData<T> result = copy(page);
        result.setList(list);
        return result;
    }

    public static <S, T> PageData<T> copyAndConvert(IPage<S> page, Function<S, T> function) {
        PageData<T> result = copy(page);
        result.setList(page.getRecords().stream().map(v -> function.apply(v)).collect(Collectors.toList()));
        return result;
    }
}
@Data
@ApiModel
public class SupplierContractQuery extends BasicQuery {
    @ApiModelProperty(value = "供应商ID")
    private Long supplierId;
}

@Data
@ApiModel
public class BasicQuery implements Serializable {
    @ApiModelProperty(value = "页面尺寸",required = true)
    private int limit;

    @ApiModelProperty(value = "当前页码",required = true)
    private int page;

    @ApiModelProperty(value = "排序字段",required = false)
    private String orderByField;
}

@Data
@ApiModel
public class BasicQueryDto implements Serializable {
    @ApiModelProperty(value = "页面尺寸",required = true)
    private int limit;

    @ApiModelProperty(value = "当前页码",required = true)
    private int page;

    @ApiModelProperty(value = "排序字段",required = false)
    private String orderByField;
}

2.对应的Dao接口以及mapper配置文件

import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

@Mapper
public interface SupplierContractDao extends BaseMapper<SupplierContractEntity> {
    List<SupplierContractDTO> selectPage(IPage<SupplierContractDTO> page, @Param("contract") SupplierContractDTO supplierContractDTO);
}
<?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="xxx.SupplierContractDao">

    <resultMap type="xxx.SupplierContractEntity" id="supplierContractMap">
        <result property="id" column="id"/>
        <result property="supplierId" column="supplier_id"/>
        <result property="contractNo" column="contract_no"/>
        <result property="contractAName" column="contract_a_name"/>
        <result property="contractACompanyName" column="contract_a_company_name"/>
        <result property="contractACardNo" column="contract_a_card_no"/>
        <result property="contractAAddress" column="contract_a_address"/>
        <result property="contractAPhone" column="contract_a_phone"/>
        <result property="contractBName" column="contract_b_name"/>
        <result property="contractBCompanyName" column="contract_b_company_name"/>
        <result property="contractBCardNo" column="contract_b_card_no"/>
        <result property="contractBAddress" column="contract_b_address"/>
        <result property="contractBPhone" column="contract_b_phone"/>
        <result property="contractStartDate" column="contract_start_date"/>
        <result property="contractEndDate" column="contract_end_date"/>
        <result property="contractSignedAddress" column="contract_signed_address"/>
        <result property="sort" column="sort"/>
        <result property="creator" column="creator"/>
        <result property="createDate" column="create_date"/>
        <result property="updater" column="updater"/>
        <result property="updateDate" column="update_date"/>
        <result property="remark" column="remark"/>
        <result property="enabled" column="enabled"/>
        <result property="isDelete" column="is_delete"/>
        <result property="tenantCode" column="tenant_code"/>
    </resultMap>

    <select id="selectPage" resultType="xxx.SupplierContractDTO">
        SELECT sc.`*`, ss.supplier_name supplierName FROM supplier_contract sc
        LEFT JOIN supplier ss ON ss.id = sc.supplier_id AND ss.is_delete = 0
        WHERE sc.is_delete = 0

        <if test="contract.supplierId != null">
            and sc.supplier_id = #{contract.supplierId}
        </if>
    </select>
</mapper>

3.Service接口以及相关实现类

import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

public interface SupplierContractService extends IService<SupplierContractEntity> {
    PageData<SupplierContractDTO> findPage(SupplierContractDTO supplierContractDTO);
}
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractDao, SupplierContractEntity> implements SupplierContractService {
    
    @Override
    public PageData<SupplierContractDTO> findPage(SupplierContractDTO supplierContractDTO) {
        IPage<SupplierContractDTO> page = new Page<>(supplierContractDTO.getPage(), supplierContractDTO.getLimit());
        List<SupplierContractDTO> supplierContractDTOS = this.getBaseMapper().selectPage(page, supplierContractDTO);

        return PageBuilder.copyAndConvert(page, supplierContractDTOS);
    }
}

4.Controller的调用

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("supplier")
public class SupplierContractController {
    @Autowired
    private SupplierContractService supplierContractService;

    @GetMapping("page")
    @ApiOperation("分页")
    public Result<PageData<SupplierContractDTO>> page(@ModelAttribute SupplierContractQuery query){
        PageData<SupplierContractDTO> page = supplierContractService.findPage(ObjectUtil.source2Target(query, SupplierContractDTO.class));

        return new Result<PageData<SupplierContractDTO>>().ok(page);
    }

}

注意:

1.controller里面的query对象需要继承BasicQuery;

2.xxxDao需要继承BasicQueryDto;

备注:本文仅用来记录mybatis-plus实现多表分页关联查询的思路,引用的类是不完整的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mybatis Plus多表关联查询分页实现可以通过使用Mybatis Plus提供的Wrapper类来实现。以下是一个示例: ```java Page<User> page = new Page<>(1, 10); QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("role_id", roleId); wrapper.orderByDesc("create_time"); IPage<User> userPage = userMapper.selectPage(page, wrapper); List<User> userList = userPage.getRecords(); ``` 在以上示例中,我们使用了QueryWrapper来构建查询条件,其中eq表示等于,orderByDesc表示按照create_time字段进行降序排序。然后我们调用了Mybatis Plus提供的selectPage方法来进行分页查询,其中第一个参数是Page对象,表示查询分页信息,第二个参数是Wrapper对象,表示查询的条件。最后我们可以通过getRecords方法获取查询结果。 在多表关联查询时,我们可以使用Mybatis Plus提供的LambdaQueryWrapper类来进行条件构造,例如: ```java LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.eq(User::getRoleId, roleId) .orderByDesc(User::getCreateTime); IPage<User> userPage = userMapper.selectPage(page, wrapper); ``` 以上示例使用了LambdaQueryWrapper来构造查询条件,其中eq表示等于,orderByDesc表示按照create_time字段进行降序排序。然后我们调用了Mybatis Plus提供的selectPage方法来进行分页查询,其中第一个参数是Page对象,表示查询分页信息,第二个参数是Wrapper对象,表示查询的条件。最后我们可以通过getRecords方法获取查询结果。 需要注意的是,在多表关联查询时,我们需要使用Mybatis Plus提供的@TableName和@TableField注解来指定表名和字段名,以便Mybatis Plus能够正确地生成SQL语句。另外,在查询结果中,我们可以通过使用Mybatis Plus提供的@Result注解来指定实体类中的属性和查询结果中的字段的映射关系。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值