什么是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<AdmissionListVo> getDetail(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/