7.讲师新增和修改
7.1 新增
在Controller中编写代码
@ApiOperation(value = "新增讲师") @PostMapping public BaseResult save( @ApiParam(name = "teacher", value = "讲师对象", required = true) @RequestBody EduTeacher teacher){ boolean save = eduTeacherService.save(teacher); if(save) { return BaseResult.ok("添加成功"); } return BaseResult.error("添加失败"); }
7.2 根据id查询
@ApiOperation(value = "根据ID查询讲师") @GetMapping("{id}") public BaseResult getById( @ApiParam(name = "id", value = "讲师ID", required = true) @PathVariable String id){ EduTeacher teacher = eduTeacherService.getById(id); return BaseResult.ok("查询成功", teacher); }
7.3 根据id修改
@ApiOperation(value = "根据ID修改讲师") @PutMapping public BaseResult updateById( @ApiParam(name = "teacher", value = "讲师对象", required = true) @RequestBody EduTeacher teacher){ boolean update = eduTeacherService.updateById(teacher); if(update) { return BaseResult.ok("更新成功"); } return BaseResult.error("更新失败"); }
7.4 批量删除
/** * 批量删除 * @return */ @PostMapping("/batchDelete") public BaseResult batchDelete(@RequestBody List<Integer> ids) { boolean result = eduTeacherService.removeByIds(ids); if(result) { return BaseResult.ok("批量删除成功"); } return BaseResult.error("批量删除失败"); }
7.5 修改处理类:自动填充
package com.czxy.zx.teacher.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; /** * @author 桐叔 * @email liangtong@itcast.cn */ @Component public class TeacherMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 给javabean默认值 // 1 逻辑删除的默认值 this.setFieldValByName("isDeleted", 0 , metaObject); // 2 创建、修改时间 this.setFieldValByName("gmtCreate", new Date(), metaObject); this.setFieldValByName("gmtModified", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { // 2 修改时间 this.setFieldValByName("gmtModified", new Date(), metaObject); } }
8.统一异常处理
8.1 测试系统对错误的响应
- 在更新操作中,应该输入
{}
填写更新数据,如果填写成[]
,程序将抛出异常。
8.2 全局异常处理
- 我们想让异常结果也统一,并且在集中的地方处理系统的异常信息,那么需要统一异常处理。
- spring mvc 提供
@ControllerAdvice
就可以完成此需求。 @ControllerAdvice
是对Controller进行增强的注解,主要作用有三个:
- 全局异常处理(*)
- 全局数据绑定
- 全局数据预处理
- zx-common中创建统一异常处理类:
package com.czxy.zx.exception; import com.czxy.zx.vo.BaseResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * @author 桐叔 * @email liangtong@itcast.cn */ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class)//拦截什么异常 @ResponseBody public BaseResult error(Exception e){ e.printStackTrace(); return BaseResult.error("系统错误"); } }
注意:启动类的位置
- 启动类必须放在
com.czxy.zx
包下面才可以加载到com.czxy.zx.exception
包下面的内容 - 如果放在
com.czxy.zx.teacher
下面,将无法加载到com.czxy.zx.exception
包下面的内容
- 测试,返回统一错误结果
8.3 特殊异常配置
如果是除数为0的异常;那么需要如下配置,精确匹配异常:
package com.czxy.zx.exception; import com.czxy.zx.vo.BaseResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * @author 桐叔 * @email liangtong@itcast.cn */ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class)//拦截什么异常 @ResponseBody public BaseResult error(Exception e){ e.printStackTrace(); return BaseResult.error("系统错误"); } @ExceptionHandler(ArithmeticException.class) @ResponseBody public BaseResult error(ArithmeticException e){ e.printStackTrace(); return BaseResult.error("除数不能为0"); } }
8.4 自定义异常
8.4.1 EduException通用异常类
- 在zx-common中创建Exception的异常类
package com.czxy.zx.exception; import io.swagger.annotations.ApiModel; /** * @author 桐叔 * @email liangtong@itcast.cn */ @ApiModel(value = "自定义异常") public class EduException extends RuntimeException { public EduException(String message) { super(message); } public EduException(String message, Throwable cause) { super(message, cause); } public EduException(Throwable cause) { super(cause); } protected EduException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }
8.4.2 创建捕获自定义异常类
- 在 GlobalExceptionHandler类中添加自定义处理方法
@ExceptionHandler(EduException.class) @ResponseBody public BaseResult error(EduException e){ e.printStackTrace(); if(e.getMessage() == null) { return BaseResult.error("空指针异常"); } return BaseResult.error(e.getMessage()); }
- 测试:在业务中需要的位置抛出EduException,举例子在查询列表中出错:
@ApiOperation(value = "查询所有老师") @GetMapping private BaseResult<List<EduTeacher>> getTeacherList(){ List<EduTeacher> list = eduTeacherService.list(null); //测试自定义异常 if(list.size() > 0) { throw new EduException("数据异常"); } return BaseResult.ok("查询成功", list); }
8.4.3 异常工具类
- 编写 ExceptionUtils 类,方便异常的抛出
package com.czxy.zx.exception; /** * @author 桐叔 * @email liangtong@itcast.cn */ public class ExceptionUtils { /** * 抛出异常 * @param message */ public static void cast(String message) { throw new EduException(message); } }
- 测试:
@ApiOperation(value = "查询所有老师") @GetMapping private BaseResult<List<EduTeacher>> getTeacherList(){ List<EduTeacher> list = eduTeacherService.list(null); //测试自定义异常 if(list.size() > 0) { //throw new EduException("数据异常"); ExceptionUtils.cast("数据异常"); } return BaseResult.ok("查询成功", list); }
9.附:创建MP代码生成器
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency>
在test/java目录下创建包com.zx.edu,创建代码生成器:CodeGenerator.java
package com.zx; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import org.junit.Test; public class CodeGenerator { @Test public void run() { // 1、创建代码生成器 AutoGenerator mpg = new AutoGenerator(); // 2、全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); //有的电脑系统,如果代码发现生成有问题,projectPath直接写成项目名称 //gc.setOutputDir("edu_eduservice" + "/src/main/java"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("lt"); gc.setOpen(false); //生成后是否打开资源管理器 gc.setFileOverride(false); //重新生成时文件是否覆盖 //IUserServcie gc.setServiceName("%sService"); //去掉Service接口的首字母I gc.setIdType(IdType.ID_WORKER_STR); //主键策略 gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型 gc.setSwagger2(true);//开启Swagger2模式 mpg.setGlobalConfig(gc); // 3、数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/zx_edu_teacher"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("1234"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 4、包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName("teacher"); //模块名 pc.setParent("com.zx"); pc.setController("controller"); pc.setEntity("entity"); pc.setService("service"); pc.setMapper("mapper"); mpg.setPackageInfo(pc); // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("edu_teacher");//表名称 strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀 strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略 strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作 strategy.setRestControllerStyle(true); //restful api风格控制器 strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符 mpg.setStrategy(strategy); // 6、执行 mpg.execute(); } }
执行代码生成器方法
说明:
XxxServiceImpl 继承了 ServiceImpl 类,并且MP为我们注入了 XxxMapper
这样可以使用 service 层默认为我们提供的很多方法,当然也可以调用我们自己在 dao 层编写的方法。