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);