此文章是自己在多表业务时遇到的一些问题解答,希望有思路可以帮助到你!
数据库关联情况:
问卷表---关联---问题表---关联---答案表
业务模拟需求:
问卷可以包含N个问题,问题可以包含N个答案,完成新增以及修改(此文章只展示新增)
业务实现:
创建实体类(重要!)
问卷DTO
@ApiModel("问卷参数DTO")
public class QuestionnaireDTO {
@ApiModelProperty(value = "问卷Id", name = "questionnaireId")
private String questionnaireId;
@ApiModelProperty(value = "问卷编号", name = "questionnaireNo")
private String questionnaireNo;
@ApiModelProperty(value = "问卷类型", name = "questionnaireType")
private Integer questionnaireType;
@ApiModelProperty(value = "问卷名称", name = "questionnaireName")
private String questionnaireName;
@ApiModelProperty(value = "问卷备注", name = "questionnaireRemark")
private String questionnaireRemark;
@ApiModelProperty(value = "是否发布", name = "isRelease")
Integer isRelease;
@ApiModelProperty(value = "是否有效", name = "isValid")
Integer isValid;
@ApiModelProperty(value = "当前页码", name = "currentPage")
Integer currentPage;
@ApiModelProperty(value = "最大页数", name = "pageSize")
Integer pageSize;
@ApiModelProperty(value = "问题List", name = "questionList")
private List<QuestionDTO> questionList;
}
在DTO中要包含问题List,因为业务要求可以拥有多个问题
问题DTO
@ApiModel("问题参数DTO")
public class QuestionDTO {
@ApiModelProperty(value = "问题Id", name = "questionId")
private String questionId;
@ApiModelProperty(value = "问题顺序", name = "questionOrder")
private Integer questionOrder;
@ApiModelProperty(value = "问题类型", name = "questionType")
private Integer questionType;
@ApiModelProperty(value = "问题内容", name = "questionContent")
private String questionContent;
@ApiModelProperty(value = "是否必填", name = "isRequired")
private Integer isRequired;
@ApiModelProperty(value = "uuid", name = "uuid")
private String uuid;
@ApiModelProperty(value = "答案List", name = "answerList")
private List<AnswerDTO> answerList;
}
在DTO中要包含答案List,因为业务要求可以拥有多个答案
答案DTO
@ApiModel("答案参数DTO")
public class AnswerDTO {
@ApiModelProperty(value = "答案Id", name = "answerId")
private String answerId;
@ApiModelProperty(value = "答案内容", name = "answerContent")
private String answerContent;
@ApiModelProperty(value = "答案分数", name = "answerGrade")
private Integer answerGrade;
}
由此实体类可以看出其中的包含关系已经符合业务需求
代码实现(业务层)
@Override
public ResultBean addQuestionnaire(QuestionnaireDTO questionnaireDTO) {
ResultBean resultBean = new ResultBean();
// 校验问卷
if (StringUtils.isNullOrEmpty(paramDTO.getQuestionnaireName())){
throw new ServiceBizException("问卷名称不可为空");
}
if (StringUtils.isNullOrEmpty(paramDTO.getQuestionnaireType())){
throw new ServiceBizException("问卷类型不可为空");
}
try {
// 添加问卷
ProductQuestionnairePO questionnairePO = new ProductQuestionnairePO();
// 将相同属性的值转换到questionnairePO实体类中
BeanUtils.copyProperties(paramDTO,questionnairePO);
questionnairePO.setIsRelease(Integer.parseInt(CommonConstants.DICT_IS_NO));
// 问卷表插入操作(Mybtis-plus)
questionnairePO.insert();
// 获取到新增的问卷id
String questionnaireId = questionnairePO.getQuestionnaireId();
// 添加问题
if (!StringUtils.isNullOrEmpty(paramDTO.getQuestionList())) {
// 新增的问题可能是多个,所以使用for循环
for (QuestionDTO questionDTO : paramDTO.getQuestionList()) {
// 判断必填项
if (StringUtils.isNullOrEmpty(questionDTO.getQuestionContent())){
throw new ServiceBizException("问题内容不能为空");
}
ProductQuestionPO questionPO = new ProductQuestionPO();
// 将相同属性的值copy到PO实体类中
BeanUtils.copyProperties(questionDTO, questionPO);
questionPO.setQuestionnaireId(questionnaireId);
questionPO.setUuid(String.valueOf(UUID.randomUUID()));
// 问题表插入操作(Mybtis-plus)
questionPO.insert();
// 获取到新增的问题id
String questionId = questionPO.getQuestionId();
// 添加对应答案
if (!StringUtils.isNullOrEmpty(questionDTO.getAnswerList())){
for (AnswerDTO answerDTO : questionDTO.getAnswerList()) {
if (StringUtils.isNullOrEmpty(answerDTO.getAnswerContent())){
throw new ServiceBizException("答案内容不能为空");
}
ProductAnswerPO answerPO = new ProductAnswerPO();
// 将相同属性的值copy到PO实体类中
BeanUtils.copyProperties(answerDTO,answerPO);
answerPO.setQuestionnaireId(questionnaireId);
answerPO.setQuestionId(questionId);
// 问题表插入操作(Mybtis-plus)
answerPO.insert();
}
}
}
}
} catch (BeansException e) {
throw new RuntimeException(e);
}
return resultBean;
}
使用copyProperties方法是因为只有PO实体类继承了Mybtis-plus
文章主要提供业务解决思路,具体过程有多种,实体类设计嵌套是核心!
for循环插入耗时比较长,性能堪忧,下一篇文章为优化此代码,提高插入效率!