springboot整合mybatis-plus

979 阅读4分钟

什么是mybatis-plus?

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具包,旨在简化开发过程并提高效率。这个工具包在 MyBatis 的基础上进行增强,但不会对 MyBatis 本身做出任何改变。以下是 MyBatis-Plus 的一些主要特性:

无侵入性:MyBatis-Plus 的引入不会对现有工程产生影响,与原有系统可以无缝集成。

损耗小:在启动时,MyBatis-Plus 会自动注入基本的 CRUD(创建、读取、更新、删除)操作,对性能的影响几乎可以忽略不计。

强大的 CRUD 操作:内置了通用的 Mapper 和 Service,通过简单的配置就能实现单表的大部分 CRUD 操作。

Lambda 表达式支持:允许使用 Lambda 表达式来编写查询条件,这样可以避免字段名称写错的问题。

主键自动生成:支持多种主键策略,包括分布式唯一 ID 生成器,可以自由配置,方便解决主键问题。

ActiveRecord 模式支持:实体类只需继承 Model 类,就可以进行 CRUD 操作。

自定义全局通用操作:支持全局通用方法的注入,实现“一次编写,到处使用”。

内置代码生成器:可以快速生成 Mapper、Model、Service、Controller 层的代码,支持模板引擎,提供了丰富的自定义配置。

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体的分页操作。

环境准备

springboot 2.4.8

mybatis-plus 3.5.7

<dependencies>
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
  </dependency>
  <dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
  </dependency>
</dependencies>

代码工程

req

/**
 * @Description 录取名单
 * @Author WuYiLong
 * @Date 2025-03-16
 */
@Data
@ApiModel(value = "AdmissionListReq对象", description = "录取名单")
public class AdmissionListReq extends PageParam implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "大学")
    private String university;

    @ApiModelProperty(value = "年份")
    private Integer year;

}

dto

/**
 * @Description 录取名单
 * @Author WuYiLong
 * @Date 2025-03-16
 */
@Data
@ApiModel(value = "AdmissionListDto对象", description = "录取名单")
public class AdmissionListDto implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键id")
    private Long id;

    @ApiModelProperty(value = "大学")
    private String university;

    @ApiModelProperty(value = "考生编号")
    private String examineeNo;

    @ApiModelProperty(value = "考生姓名")
    private String name;

    @ApiModelProperty(value = "院系")
    private String department;

    @ApiModelProperty(value = "专业代码")
    private String professionalCode;

    @ApiModelProperty(value = "初试总分")
    private Float initialExamScore;

    @ApiModelProperty(value = "复试成绩")
    private Float interviewResultScore;

    @ApiModelProperty(value = "总成绩")
    private Float totalScore;

    @ApiModelProperty(value = "专业名称")
    private String professionalName;

    @ApiModelProperty(value = "学习方式")
    private String studyType;

    @ApiModelProperty(value = "备注")
    private String remark;

    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;

    @ApiModelProperty(value = "年份")
    private Integer year;

    @ApiModelProperty(value = "研究方向")
    private String researchDirection;

    @ApiModelProperty(value = "学位类型")
    private String degreeType;
}

vo

/**
* @Description 录取名单
* @Author WuYiLong
* @Date 2025-03-16
*/
@Data
@ApiModel(value = "AdmissionListVo对象", description = "录取名单")
public class AdmissionListVo implements Serializable {
private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键id")
    private Long id;

    @ApiModelProperty(value = "大学")
    private String university;

    @ApiModelProperty(value = "考生编号")
    private String examineeNo;

    @ApiModelProperty(value = "考生姓名")
    private String name;

    @ApiModelProperty(value = "院系")
    private String department;

    @ApiModelProperty(value = "专业代码")
    private String professionalCode;

    @ApiModelProperty(value = "初试总分")
    private Float initialExamScore;

    @ApiModelProperty(value = "复试成绩")
    private Float interviewResultScore;

    @ApiModelProperty(value = "总成绩")
    private Float totalScore;

    @ApiModelProperty(value = "专业名称")
    private String professionalName;

    @ApiModelProperty(value = "学习方式")
    private String studyType;

    @ApiModelProperty(value = "备注")
    private String remark;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;

    @ApiModelProperty(value = "年份")
    private Integer year;

    @ApiModelProperty(value = "研究方向")
    private String researchDirection;

    @ApiModelProperty(value = "学位类型")
    private String degreeType;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新时间")
    private LocalDateTime updateTime;
}

entity

/**
 * @Description 录取名单
 * @Author WuYiLong
 * @Date 2025-03-16
 */
@Data
@TableName("admission_list")
public class AdmissionList extends Model<AdmissionList> {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * 大学
     */
    private String university;

    /**
     * 考生编号
     */
    private String examineeNo;

    /**
     * 考生姓名
     */
    private String name;

    /**
     * 院系
     */
    private String department;

    /**
     * 专业代码
     */
    private String professionalCode;

    /**
     * 初试总分
     */
    private Float initialExamScore;

    /**
     * 复试成绩
     */
    private Float interviewResultScore;

    /**
     * 总成绩
     */
    private Float totalScore;

    /**
     * 专业名称
     */
    private String professionalName;

    /**
     * 学习方式
     */
    private String studyType;

    /**
     * 备注
     */
    private String remark;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 年份
     */
    private Integer year;

    /**
     * 研究方向
     */
    private String researchDirection;

    /**
     * 学位类型
     */
    private String degreeType;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 是否删除?0否,1是
     */
    private Integer deleted;

    @Override
    public Serializable pkVal() {
        return this.id;
    }
}

mapper

/**
* @Description 录取名单
* @Author WuYiLong
* @Date 2025-03-16
*/
@Mapper
public interface AdmissionListMapper extends BaseMapper<AdmissionList> {

}

service

/**
* @Description 录取名单
* @Author WuYiLong
* @Date 2025-03-16
*/
public interface AdmissionListService extends IService<AdmissionList{

    /**
     * 分页
     * @param admissionListReq
     * @return
     */
    CommonPage<AdmissionListVo> page(AdmissionListReq admissionListReq);

    /**
     * 保存
     * @param admissionListDto
     */
    void save(AdmissionListDto admissionListDto);

    /**
     * 详情
     * @param id
     * @return
     */
    AdmissionListVo getDetail(Long id);

    /**
     * 删除
     * @param ids
     */
    void delete(List<Long> ids);
}

serviceImpl

/**
* @Description 录取名单
* @Author WuYiLong
* @Date 2025-03-16
*/
@Service
public class AdmissionListServiceImpl extends ServiceImpl<AdmissionListMapper, AdmissionList> implements AdmissionListService {

    @Override
    public CommonPage<AdmissionListVo> page(AdmissionListReq admissionListReq) {
        Page<AdmissionList> page = new Page<>(admissionListReq.getCurrentPage(), admissionListReq.getPageSize());
        LambdaQueryWrapper<AdmissionList> wrapper = Wrappers.lambdaQuery(AdmissionList.class);
        wrapper.like(StrUtil.isNotBlank(admissionListReq.getUniversity()), AdmissionList::getUniversity, admissionListReq.getUniversity());
        wrapper.eq(admissionListReq.getYear() != null, AdmissionList::getYear, admissionListReq.getYear());
        wrapper.orderByDesc(AdmissionList::getCreateTime);
        Page<AdmissionList> admissionListPage = baseMapper.selectPage(page, wrapper);
        List<AdmissionListVo> admissionListVos = admissionListPage.getRecords().stream().map(m -> {
            AdmissionListVo admissionListVo = new AdmissionListVo();
            BeanUtil.copyProperties(m, admissionListVo);
            return admissionListVo;
        }).collect(Collectors.toList());
        CommonPage<AdmissionListVo> commonPage = new CommonPage<>();
        commonPage.setCurrentPage(admissionListReq.getCurrentPage());
        commonPage.setPageSize(admissionListReq.getPageSize());
        commonPage.setTotal(admissionListPage.getTotal());
        commonPage.setList(admissionListVos);
        return commonPage;
    }

    @Override
    public void save(AdmissionListDto admissionListDto) {
        if(admissionListDto.getId() != null){
            AdmissionList admissionList = baseMapper.selectById(admissionListDto.getId());
            CopyOptions copyOptions = new CopyOptions().setIgnoreNullValue(true);
            BeanUtil.copyProperties(admissionListDto, admissionList,copyOptions);
            admissionList.setUpdateTime(LocalDateTime.now());
            admissionList.updateById();
        }else{
            AdmissionList admissionList = new AdmissionList();
            BeanUtil.copyProperties(admissionListDto, admissionList);
            admissionList.setCreateTime(LocalDateTime.now());
            admissionList.setUpdateTime(LocalDateTime.now());
            admissionList.insert();
        }
    }

    @Override
    public AdmissionListVo getDetail(Long id) {
        AdmissionList admissionList = baseMapper.selectById(id);
        AdmissionListVo admissionListVo = BeanUtil.copyProperties(admissionList, AdmissionListVo.class);
        return admissionListVo;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<Long> ids) {
        baseMapper.deleteBatchIds(ids);
    }
}

controller

/**
* @Description 录取名单
* @Author WuYiLong
* @Date 2025-03-16
*/
@Api(tags = "录取名单")
@RestController
@RequestMapping("admissionList")
public class AdmissionListController {

    @Autowired
    private AdmissionListService admissionListService;

    @ApiOperation(value = "分页")
    @PostMapping(value = "page")
    public ResponseData<CommonPage<AdmissionListVo>> page(@RequestBody AdmissionListReq admissionListReq) {
        return ResponseData.successInstance(admissionListService.page(admissionListReq));
    }

    @ApiOperation(value = "保存")
    @PostMapping(value = "save")
    public ResponseData save(@RequestBody AdmissionListDto admissionListDto) {
        admissionListService.save(admissionListDto);
        return ResponseData.success();
    }

    @ApiOperation(value = "获取详情")
    @GetMapping(value = "getDetail")
    public ResponseData<AdmissionListVogetDetail(Long id) {
        return ResponseData.successInstance(admissionListService.getDetail(id));
    }

    @ApiOperation(value = "删除")
    @PostMapping(value = "delete")
    public ResponseData delete(@RequestBody List<Long> ids) {
        admissionListService.delete(ids);
        return ResponseData.success();
    }

}

测试

分页

保存

获取详情

删除

引用

mybatis-plus:baomidou.com/