一套完整的基于Mabatis的多表关联分页查询脚手架

问题提出

在这里插入图片描述
三张表
学院表(college),专业表(major),证书表(certificate)
证书表外键专业表,专业表外键学院表
需要查询出

certificate.id,
certificate.certificatename,
certificate.rank,
certificate.image,
certificate.number,
certificate.create_time,
certificate.major_id,
certificate.college_id,
major.majorname,
college.collegename

问题解决

sql书写

select certificate.id,
certificate.certificatename,
certificate.rank,
certificate.image,
certificate.number,
certificate.create_time,
certificate.major_id,
certificate.college_id,
major.majorname,
college.collegename
FROM certificate
left join  major on certificate.major_id=major.id
left join college on major.college_id=college.id

mapper.xml

    <select id="getCertificateMajorCollege" resultType="com.example.api.entity.Certificate">
        select certificate.id,certificate.certificatename,certificate.rank,certificate.image,certificate.number,certificate.create_time,certificate.update_time
        ,major.majorname,college.collegename
        FROM certificate
        left join  major on certificate.major_id=major.id
        left join college on certificate.college_id=college.id
        <if test="ew.emptyOfWhere == false">
            ${ew.customSqlSegment}
        </if>
    </select>

条件查询配置

        <if test="ew.emptyOfWhere == false">
            ${ew.customSqlSegment}
        </if>

CertificateMapper.java

public interface CertificateMapper extends BaseMapper<Certificate> {
    IPage<Certificate> getCertificateMajorCollege(IPage<Certificate> page, @Param(Constants.WRAPPER) QueryWrapper<Certificate> wrapper);
}

ICertificateService

public interface ICertificateService extends IService<Certificate> {
    IPage<Certificate> getCertificateMajorCollege(IPage<Certificate> page, @Param(Constants.WRAPPER) QueryWrapper<Certificate> wrapper);
}

CertificateServiceImpl

@Service
public class CertificateServiceImpl extends ServiceImpl<CertificateMapper, Certificate> implements ICertificateService {
    @Autowired
    private CertificateMapper certificateMapper;

    @Override
    public IPage<Certificate> getCertificateMajorCollege(IPage<Certificate> page, QueryWrapper<Certificate> wrapper) {
        IPage<Certificate> list = certificateMapper.getCertificateMajorCollege(page,wrapper);
        return list;
    }
}

AdminCertificateController

@PostMapping("/getCertificatesList")
    @ApiOperation("分页获取所有专业接口")
    public ResponseEntity<JWTToken> getCertificatesList(
            @ApiParam("专业查询信息")
            @RequestBody(required = true)
                    CertificateReq certificateReq ){
        try {
            IPage<Certificate> page = new Page<>(certificateReq.getPageNo(), certificateReq.getPageSize(),true);
            QueryWrapper<Certificate> wrapperCertificate = new QueryWrapper<>();
            System.out.println(certificateReq);
            wrapperCertificate.orderByDesc("create_time");
            if(!certificateReq.getCertificatename().equals("0")||!certificateReq.getCertificatename().equals("")){
                wrapperCertificate.like("certificatename",certificateReq.getCertificatename());
            }
            if(certificateReq.getCollegeId()!=null){
                if(certificateReq.getCollegeId()!=0){
                    wrapperCertificate.eq("certificate.college_id",certificateReq.getCollegeId());
                }
            }
            if(certificateReq.getMajorId()!=null){
                if(certificateReq.getMajorId()!=0){
                    wrapperCertificate.eq("certificate.major_id",certificateReq.getMajorId());
                }
            }
            if(certificateReq.getRank()!=null){
                if(certificateReq.getRank()!=0){
                    wrapperCertificate.eq("rank",certificateReq.getRank());
                }
            }
//            page= certificateService.page(page,wrapperCertificate);
            page= certificateService.getCertificateMajorCollege(page,wrapperCertificate);
            return new ResponseEntity<>(new JWTToken(page), HttpStatus.OK);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            throw new CustomException("",7001,"获取College数据异常");
        }
    }

测试

测试数据

{
  "pageNo": 1,
  "pageSize": 2,
  "certificatename": ""
}

返回结果

{
  "code": 200,
  "msg": "success",
  "data": {
    "records": [
      {
        "id": 13,
        "certificatename": "Web前端开发-初级",
        "collegename": "计算机学院",
        "majorname": "软件工程",
        "rank": 1,
        "image": "http://localhost:3298/upload/f7074348-126d-45e5-87ed-b509bda389ed.jpg",
        "number": 2,
        "updateTime": "2021-05-11T02:36:29",
        "createTime": "2021-04-16T13:54:27",
        "collegeIdAndMajorId": []
      },
      {
        "id": 12,
        "certificatename": "网络安全评估-初级",
        "collegename": "计算机学院",
        "majorname": "网络与信息安全",
        "rank": 1,
        "image": "http://localhost:3298/upload/d945d55c-fa38-456e-8746-2901a2e79051.jpg",
        "number": 2,
        "updateTime": "2021-05-14T06:08:15",
        "createTime": "2021-04-16T13:39:52",
        "collegeIdAndMajorId": []
      }
    ],
    "total": 5,
    "size": 2,
    "current": 1,
    "orders": [],
    "optimizeCountSql": true,
    "hitCount": false,
    "searchCount": true,
    "pages": 3
  }
}
Mybatis Plus多表关联查询分页可以通过使用Mybatis Plus提供的Wrapper对象和Page对象来实现。具体操作如下: 1. 创建Wrapper对象 Wrapper是Mybatis Plus提供的一个查询条件构造器,可以用来构建复杂的查询条件。在多表关联查询中,我们可以使用Wrapper来构建关联查询的条件。例如: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1) .inSql("dept_id", "select id from dept where status=1") .orderByDesc("create_time"); ``` 这段代码创建了一个Wrapper对象,它的条件是status等于1,并且dept_id在dept表中status等于1的记录中。最后按照create_time倒序排序。 2. 创建Page对象 Page对象是Mybatis Plus提供的分页对象,用于控制分页查询的页码和每页记录数。例如: ```java Page<User> page = new Page<>(1, 10); ``` 这段代码创建了一个Page对象,表示查询第一页,每页10条记录。 3. 执行查询 使用Mybatis Plus提供的IService接口的page方法进行分页查询。例如: ```java IPage<User> userPage = userService.page(page, wrapper); ``` 这段代码执行了分页查询,查询条件是wrapper,查询的分页信息是page。最终结果会被封装在IPage对象中。 完整示例代码: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1) .inSql("dept_id", "select id from dept where status=1") .orderByDesc("create_time"); Page<User> page = new Page<>(1, 10); IPage<User> userPage = userService.page(page, wrapper); List<User> userList = userPage.getRecords(); long total = userPage.getTotal(); ``` 这段代码执行了一个多表关联查询,查询条件是status等于1,并且dept_id在dept表中status等于1的记录中。最后按照create_time倒序排序,查询第一页,每页10条记录。查询结果被封装在IPage对象中,可以通过getRecords方法获取查询结果,通过getTotal方法获取总记录数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

计忆芳华

制作不易,欢迎打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值