8. 分页查询
分页查询的配置类写在service-util模块中。
- 首先创建查询条件类,用封装前端发送的查询条件。vo(view object),用于与视图层的交互。
package pers.beiluo.yunshangoffice.vo;
import java.io.Serializable;
/**
* <p>
* 角色查询实体
* </p>
*/
public class SysRoleQueryVo implements Serializable {
private static final long serialVersionUID = 1L;
//根据角色名称进行查询
private String roleName;
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
- 创建分页插件配置类,在service-util的config包下。
package pers.beiluo.yunshangoffice.common.config.mp;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//在这里使用@MapperScan注解之后,就不需要在启动类上添加这个注解了
//注解中的包名爆红不用管,不影响使用
@MapperScan("pers.beiluo.yunshangoffice.mapper")
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//注意DbType是Mysql
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
- 分页控制器方法
//与SysRole有关的控制器方法都写在SysController中
//分页查询
@ApiOperation("分页查询")
//表示查询第page页,每页有limit个数据
@GetMapping("{page}/{limit}")
public Result pageQueryRole(@PathVariable Long page,
@PathVariable Long limit,
SysRoleQueryVo sysRoleQueryVo){
//先创建一个page对象
Page<SysRole> sysRolePage = new Page<>(page,limit);
//封装条件
LambdaQueryWrapper<SysRole> sysRoleLambdaQueryWrapper = new LambdaQueryWrapper<>();
String roleName = sysRoleQueryVo.getRoleName();
if(!StringUtils.isEmpty(roleName)){
sysRoleLambdaQueryWrapper.like(SysRole::getRoleName,roleName);
}
//进行分页查询并返回
return Result.ok(sysRoleService.page(sysRolePage,sysRoleLambdaQueryWrapper));
}
9. 其他controller方法
9.1 根据id获取角色
//根据id查询角色
@ApiOperation("根据id查询角色")
@GetMapping("/get/{id}")
public Result getRoleById(@PathVariable Long id){
SysRole byId = sysRoleService.getById(id);
return Result.ok(byId);
}
9.2 添加角色
//新增角色
@ApiOperation("添加角色")
@PostMapping("/save")
public Result save(@RequestBody SysRole sysRole){
boolean save = sysRoleService.save(sysRole);
if(save){
return Result.ok();
}else{
return Result.fail();
}
}
9.3 修改角色
//修改角色
@ApiOperation("修改角色")
@PostMapping("/update")
public Result updateRoleById(@RequestBody SysRole sysRole){
boolean b = sysRoleService.updateById(sysRole);
if(b){
return Result.ok();
}else{
return Result.fail();
}
}
9.4 根据id删除角色
//根据id删除角色
@ApiOperation("根据id删除角色")
@GetMapping("/remove/{id}")
public Result deleteRoleById(@PathVariable Long id){
boolean b = sysRoleService.removeById(id);
if(b){
return Result.ok();
}else{
return Result.fail();
}
}
9.5 批量删除角色
//根据ids批量删除角色
//JSON中的数组可以与Java中的list相互转化
@ApiOperation("根据ids批量删除角色")
@PostMapping("/batchRemove")
public Result deleteBatch(@RequestBody List<Long> list){
boolean b = sysRoleService.removeByIds(list);
if(b){
return Result.ok();
}else{
return Result.fail();
}
}
10. 配置日期时间格式
当前的时间返回值格式与我们平时使用的不一样,在application-dev.yml文件中将其配置成我们常用的格式。在配置文件中添加以下内容:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
11. 统一异常处理
在程序产生异常时,希望返回的也是Result对象,所以需要对异常进行统一处理。
在service-util模块中添加异常处理器。
首先在service-util模块中的config包下创建一个异常处理类:
package pers.beiluo.yunshangoffice.common.config.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
/**
* 异常处理类
* 其中的方法用于实现自定义的异常处理逻辑
*/
@ControllerAdvice
public class MyExceptionHandler {
}
为了更方便的修改返回结果对象的message内容并直接返回(因为setMessage方法没有返回值,所以需要先创建Result对象再设置内容然后返回),需要在Result类中加入如下方法:
11.1 全局异常处理
//全局异常处理
@ExceptionHandler(Exception.class)
@ResponseBody
public Result error(Exception e){
e.printStackTrace();
return Result.fail("全局异常处理执行了");
}
11.2 特定异常处理
//特定异常处理
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Result error(ArithmeticException e){
return Result.fail().message("特定异常处理执行了");
}
11.3 自定义异常处理
- 首先需要自定义一个异常类,表示异常类型
package pers.beiluo.yunshangoffice.common.config.exception;
import lombok.Data;
import pers.beiluo.yunshangoffice.common.result.ResultCodeEnum;
@Data
public class CustomizedException extends RuntimeException{
private Integer code;
private String message;
public CustomizedException(){}
//通过code和message构造对象
public CustomizedException(Integer code,String message){
super(message);
this.code = code;
this.message = message;
}
//通过ResultCodeEnum构造对象
public CustomizedException(ResultCodeEnum resultCodeEnum){
super(resultCodeEnum.getMessage());
this.code = resultCodeEnum.getCode();
this.message = resultCodeEnum.getMessage();
}
}
- 自定义的异常需要手动抛出。
try {
int i = 10 / 0;
} catch (Exception e) {
throw new CustomizedException(000,"自定义异常");
}
- 处理器方法。
//自定义异常处理
@ExceptionHandler(CustomizedException.class)
@ResponseBody
public Result error(CustomizedException e){
return Result.fail().message(e.getMessage()).code(e.getCode());
}