全栈开发之后端脚⼿架:SpringBoot集成MybatisPlus代码⽣成,分页,雪花
算。。。
背景
当需要快速实现⼀个想法时,如果采⽤ Java 技术栈,⼀般都是选择 SpringBoot 技术栈,虽然 SpringBoot 解决了传统 Spring 及 MVC 配置等⽅⾯的问题,且其⽣态体系也⾮常强⼤,但是在实际使⽤时仍然需要集成最起码的数据库、响应封装、异常拦截、代码⽣成器、接⼝⽂档等基础组件,这时⼀般有两种⼿段:
1. 使⽤开源的各类后台管理系统,这类系统⼀般模块完善,功能强⼤;然⽽很多⽆关紧要的模块⼜会带来⼀些⼲扰;
2. 使⽤⾃建的简化版,集成最常⽤的模块即可,⼀⽅⾯便于掌控,同时在“重复造轮⼦”的过程中也熟悉下这些主流技术是如何整合在
⼀起的。
这⾥,就从零开始搭建后端脚⼿架,以搭积⽊的⽅式将开源组件组装起来。后续的玩具项⽬都基于这个脚⼿架进⾏开发。MybatisPlus代码⽣成器
简单修改路径信息后,直接执⾏ MysqlGenerator 类的 main ⽅法。分别键⼊模块表以及表名即可⽣成 Entity , Mapper , Service , Controller 等对应的⽂件。
MybatisPlus雪花算法ID
MybatisPlus (3.3.1)的主键策略默认是雪花算法,如果不显式设置主键的话, MybatisPlus 通过代码⾃动通过雪花算法算出⼀个值,插⼊的时候就会将其作为id插⼊。
springboot推荐算法雪花算法( SnowFlake )是⼀个 Long 类型的 Java 长整型数字,⼀般对应 MySQL 中的类型为 BIGINT(20) ;具有趋势单调递增,且全局唯⼀的特点。
MybatisPlus分页
MybatisPlusConfig.java
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true)); }
}
PageUtils.java
@Data
public class PageUtils {
//总记录数
private long total;
//每页记录数
private long size;
//总页数
private long pages;
//当前页数
private long current;
//列表数据
private List<?> records;
//灵活添加
private Map<String,Object> data;
/
**
* 分页
* @param records        列表数据
* @param total  总记录数
* @param size    每页记录数
* @param current    当前页数
*/
public PageUtils(List<?> records,long total,long size,long current){
this.size = size;
this.current = current;
this.pages =(il((double)total/size);
}
/**
* 分页
* @param records        列表数据
* @param total  总记录数
* @param size    每页记录数
* @param current    当前页数
*/
public PageUtils(List<?> records,long total,long size,long current, Map<String,Object> data){ ds = records;
this.size = size;
this.current = current;
this.data = data;
this.pages =(il((double)total/size);
}
/**
* 分页
*/
public PageUtils(Page<?> page){
this.size = Size();
this.current = Current();
this.pages =(Pages();
}
}
BookController.java
// 分页查询:使⽤⾃定义PageUtils
@GetMapping("list")
public Result<PageUtils>list(@RequestParam(defaultValue ="0") Integer page,@RequestParam(defaultValue ="10") Integer size,@RequestParam Map <String, Object> params){
PageUtils list = bookService.findList(new Page<>(page, size), params);
return Result.success(list);
}
// 分页查询:使⽤MyBatisPlus的page⽅法
@GetMapping("page")
public Result<IPage<Book>>page(@RequestParam(defaultValue ="0") Integer page,@RequestParam(defaultValue ="10") Integer size,@RequestPara m Map<String, Object> params){
QueryWrapper<Book> queryWrapper =new QueryWrapper<>();
queryWrapper.likeRight("read_date", ("readDate"));
IPage<Book> list = bookService.page(new Page<>(page, size),queryWrapper);
return Result.success(list);
}
统⼀响应封装
通过 RestControllerAdvice 注解,实现对请求的拦截,统⼀封装结果为 Result 。
@RestControllerAdvice
public class ResultAdvice implements ResponseBodyAdvice<Object>{
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<?extends HttpMessageConverter<?>> aClass){
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<?extends HttpMessageConverter<?>> aC lass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse){
if(o instanceof String){
return objectMapper.writeValueAsString(Result.success(o));
}
if(o instanceof Result){
return o;
}
return Result.success(o);
}
}
Result.java