基于SpringCloudalibaba+SSM+Mybatisplus实现在线教育讲师管理后端(三)

简介: 基于SpringCloudalibaba+SSM+Mybatisplus实现在线教育讲师管理后端(三)

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 测试系统对错误的响应

  • 在更新操作中,应该输入{}填写更新数据,如果填写成[],程序将抛出异常。

image.png

image.png

8.2 全局异常处理

  • 我们想让异常结果也统一,并且在集中的地方处理系统的异常信息,那么需要统一异常处理。
  • spring mvc 提供 @ControllerAdvice就可以完成此需求。
  • @ControllerAdvice 是对Controller进行增强的注解,主要作用有三个:
  1. 全局异常处理(*)
  2. 全局数据绑定
  3. 全局数据预处理
  • zx-common中创建统一异常处理类:

image.png

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包下面的内容

image.png

  • 测试,返回统一错误结果

image.png

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的异常类

image.png

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 类,方便异常的抛出

image.png

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 层编写的方法。

相关文章
|
16天前
|
前端开发 JavaScript Java
智慧物流管理|基于SSM的第三方物流信息管理系统
智慧物流管理|基于SSM的第三方物流信息管理系统
|
22天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的教材库存管理附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的教材库存管理附带文章和源代码部署视频讲解等
31 6
|
22天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的洛川县苹果销售管理平台附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的洛川县苹果销售管理平台附带文章和源代码部署视频讲解等
23 5
|
1天前
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
10 2
我们后端程序员不是操作MyBatis的CRUD Boy
|
1天前
|
Java 数据库连接 数据库
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
|
6天前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
24 3
|
6天前
|
Java 数据库连接 API
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
13 3
|
6天前
|
安全 前端开发 Java
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
12 1
|
25天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的车辆运输管理附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的车辆运输管理附带文章和源代码部署视频讲解等
20 7
|
25天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高校实验室信息化综合管理平台附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的高校实验室信息化综合管理平台附带文章和源代码部署视频讲解等
142 6