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

相关文章
|
3月前
|
Java 数据库连接 Maven
后端框架学习-----mybatis(使用mybatis框架遇到的问题)
这篇文章总结了在使用MyBatis框架时可能遇到的几个常见问题及其解决方法,包括配置文件注册、接口绑定、方法名匹配、返回类型匹配、Maven资源导出、时区设置和字符编码问题。
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
3月前
|
Java 数据库连接 数据库
后端框架学习-----mybatis(4)
这篇文章介绍了如何解决在使用MyBatis时数据库字段名和Java实体类属性名不一致的问题,通过使用`<resultMap>`元素来映射字段和属性,确保能够正确地查询和映射数据。
|
3月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
3月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
3月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
5月前
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
122 3
我们后端程序员不是操作MyBatis的CRUD Boy
|
5月前
|
Java 数据库连接 数据库
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis