MyBatis-Plus联表查询,模糊查询及分页

1.Maven配置:

    <!-- mybatis-plus join连表查询-->
    <dependency>
        <groupId>com.github.yulichang</groupId>
        <artifactId>mybatis-plus-join</artifactId>
        <version>1.2.4</version>
        <exclusions>
            <exclusion>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>com.github.yulichang</groupId>
        <artifactId>mybatis-plus-join</artifactId>
        <version>1.2.4</version>
    </dependency>

2.Service

/**
 * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.changecontrol.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.jeeplus.changecontrol.domain.ChangeControl;
import com.jeeplus.changecontrol.domain.ChangeEvaluation;
import com.jeeplus.changecontrol.mapper.ChangeEvaluationMapper;
import com.jeeplus.changecontrol.service.dto.ChangeControlDTO;
import com.jeeplus.changecontrol.service.dto.ChangeEvaluationDTO;
import com.jeeplus.sys.domain.Office;
import com.jeeplus.sys.domain.User;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import javax.annotation.Resource;

/**
 * 变更评估表Service
 * @author lgn
 * @version 2023-05-06
 */
@Service
@Transactional
public class ChangeEvaluationService extends ServiceImpl<ChangeEvaluationMapper, ChangeEvaluation> {
    @Resource
    private ChangeEvaluationMapper changeEvaluationMapper;

    /**
     *
     * @author lgn
     * @date 2023/5/6 16:42
     * @param changeEvaluationDTO
     * @param page
     * @return ChangeEvaluation
     */
    public Page<ChangeEvaluation> getEvaluationList(ChangeEvaluationDTO changeEvaluationDTO, Page<ChangeEvaluation> page) {
        //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
        MPJLambdaWrapper<ChangeEvaluation> wrapper = new MPJLambdaWrapper<ChangeEvaluation>()
                .selectAll(ChangeEvaluation.class)
                .select(ChangeControl::getNumber)
                .select(ChangeControl::getName)
                .select(ChangeControl::getChangeCategory)//类别
                .select(ChangeControl::getChangeGrade)//分级
                .selectAs(User::getName, ChangeControlDTO::getUserName)//申请人名称
                .selectAs(Office::getName,ChangeControlDTO::getOfficeName)//部门名称
                .leftJoin(ChangeControl.class,ChangeControl::getId,ChangeEvaluation::getChangeControlId)
                .leftJoin(User.class,User::getId,ChangeControl::getPreparationUserId)
                .leftJoin(Office.class,Office::getId ,User::getOfficeId)
                .orderByDesc(ChangeEvaluation::getCreateTime);

        if (StringUtils.isNotEmpty(changeEvaluationDTO.getNumber())){
            wrapper.like(ChangeControl::getNumber,changeEvaluationDTO.getNumber());
        }
        if (StringUtils.isNotEmpty(changeEvaluationDTO.getName())){
            wrapper.like(ChangeControl::getName,changeEvaluationDTO.getName());
        }
        if (StringUtils.isNotEmpty(changeEvaluationDTO.getProcessStatus())){
            wrapper.eq(ChangeEvaluation::getProcessStatus,changeEvaluationDTO.getProcessStatus());
        }
        return page(page, wrapper);
    }

    /**
     * 查看详情
     * @author lgn
     * @date 2023/5/9 16:25
     * @param id
     * @return ChangeEvaluation
     */
    public ChangeEvaluation getEvaluationInfo(String id) {
        //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
        MPJLambdaWrapper<ChangeEvaluation> wrapper = new MPJLambdaWrapper<ChangeEvaluation>()
                .selectAll(ChangeEvaluation.class)
                .select(ChangeControl::getNumber)
                .select(ChangeControl::getName)
                .select(ChangeControl::getChangeCategory)//类别
                .select(ChangeControl::getChangeGrade)//分级
                .selectAs(User::getName, ChangeControlDTO::getUserName)//申请人名称
                .selectAs(Office::getName,ChangeControlDTO::getOfficeName)//部门名称
                .leftJoin(ChangeControl.class,ChangeControl::getId,ChangeEvaluation::getChangeControlId)
                .leftJoin(User.class,User::getId,ChangeEvaluation::getPreparationUserId)
                .leftJoin(Office.class,Office::getId ,User::getOfficeId).eq(ChangeEvaluation::getId,id);

        return changeEvaluationMapper.selectOne(wrapper);
    }

}

3.分页加模糊搜索说明:

    //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用
    MPJLambdaWrapper<ChangeEvaluation> wrapper = new MPJLambdaWrapper<ChangeEvaluation>()
            .selectAll(ChangeEvaluation.class)
            .select(ChangeControl::getNumber)
            .select(ChangeControl::getName)
            .select(ChangeControl::getChangeCategory)//类别
            .select(ChangeControl::getChangeGrade)//分级
            .selectAs(User::getName, ChangeControlDTO::getUserName)//申请人名称
            .selectAs(Office::getName,ChangeControlDTO::getOfficeName)//部门名称
            .leftJoin(ChangeControl.class,ChangeControl::getId,ChangeEvaluation::getChangeControlId)
            .leftJoin(User.class,User::getId,ChangeControl::getPreparationUserId)
            .leftJoin(Office.class,Office::getId ,User::getOfficeId)
            .orderByDesc(ChangeEvaluation::getCreateTime);

3.1属性说明

selectAll():查询指定实体类的全部字段。

select():查询指定的字段,支持可变长参数同时查询多个字段,但是在同一个select中只能查询相同表的字段,所以如果查询多张表的字段需要分开写。

selectAs():字段别名查询,用于数据库字段与接收结果的dto中属性名称不一致时转换。

leftJoin():左连接,其中第一个参数是参与联表的表对应的实体类,第二个参数是这张表联表的ON字段,第三个参数是参与联表的ON的另一个实体类属性。

就相当于sql的写法:

SELECT
	t.id,
	t.change_control_id,
	t.pdf_template_file,
	t.process_status,
	t.is_estimate,
	t.is_evaluation,
	t.approval_date,
	t.preparation_department,
	t.preparation_user_id,
	t.preparation_date,
	t.create_time,
	t.create_by_id,
	t.update_time,
	t.update_by_id,
	t.del_flag,
	t1.number,
	t1.NAME,
	t1.change_category,
	t1.change_grade,
	t2. NAME AS userName,
	t3. NAME AS officeName
FROM
	tb_change_evaluation t
LEFT JOIN tb_change_control t1 ON (t1.id = t.change_control_id)
LEFT JOIN sys_user t2 ON (
	t2.id = t1.preparation_user_id
)
LEFT JOIN sys_office t3 ON (t3.id = t2.office_id)
WHERE
	t.del_flag = 0
AND (t1. NAME LIKE ?)
ORDER BY
	t.create_time DESC
LIMIT ?

这里返回字段有个细节要注意一下

我这里是三表联查,把t1,t2,t3里面的字段返回给t的bean里面,t的domian和dto都要加上这些新返回的字段。
domain层:通常就是用于放置这个系统中,与数据库中的表,一一对应起来的JavaBean的。所以domian里面加的字段数据库里面没有,查询的时候就会报错,这里需要使用@TableField(exist = false)处理一下:

@TableField(exist = false) 注解可以解决表中表的问题,加载bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样可以用来把一个数据表当作一个字段来输出,用来实现表中表数据输出。这样设置在新增等使用bean的时候,mybatis-plus就会忽略这个。

/**
 * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.changecontrol.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeeplus.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 变更评估表Entity
 * @author lgn
 * @version 2023-05-06
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_change_evaluation")
public class ChangeEvaluation extends BaseEntity {
	private static final long serialVersionUID = 1L;
	/**
     * 变更评估表id
     */
	private String changeControlId;
	private String pdfTemplateFile;
	/**
	 * 流程状态:0-审批中,1-已完成,2-审批不通过,3-不需审批
	 */
	private String processStatus;

	/**
	 * 是否需要评估
	 */
	private String isEstimate;

	/**
	 * 是否为已评估数据:0-否,1-是
	 */
	private String isEvaluation;

	/**
	 * 批准日期
	 */
	private String approvalDate;

	/**
	 * 编制部门id
	 */
	private String preparationDepartment;

	/**
	 * 编制人id
	 */
	private String preparationUserId;

	/**
	 * 编制日期
	 */
	private String preparationDate;
	/**
	 * 变更编号
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String number;

	/**
	 * 变更类别n
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String changeCategory;

	/**
	 * 变更名称
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String name;
	/**
	 * 变更分级
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String changeGrade;
	/**
	 * @author lgn
	 * @date 2023/5/5 11:30
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String userName;

	/**
	 * @author lgn
	 * @date 2023/5/5 11:30
	 */
	@TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的。
	private String officeName;
}

3.2模糊加精确搜索,返回分页

if (StringUtils.isNotEmpty(changeEvaluationDTO.getNumber())){
    wrapper.like(ChangeControl::getNumber,changeEvaluationDTO.getNumber());
}
if (StringUtils.isNotEmpty(changeEvaluationDTO.getName())){
    wrapper.like(ChangeControl::getName,changeEvaluationDTO.getName());
}
if (StringUtils.isNotEmpty(changeEvaluationDTO.getProcessStatus())){
    wrapper.eq(ChangeEvaluation::getProcessStatus,changeEvaluationDTO.getProcessStatus());
}
return page(page, wrapper);

猜你喜欢

转载自blog.csdn.net/u010797364/article/details/130677543