SSM | 整合(基于图书的增删改查操作)(下)

简介: SSM | 整合(基于图书的增删改查操作)(下)

3.4 controller接口


@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService service;
    @PostMapping // @RequestBody注解用于接收JSON格式数据 POST请求的数据用@RequestParam注解接收
    public int addBook(@RequestBody Book book) {
        return service.addBook(book);
    }
    @PutMapping
    public int updateBookById(@RequestBody Book book) {
        return service.updateBookById(book);
    }
    @DeleteMapping("/{id}")
    public int deleteBookById(@PathVariable Integer id) {
        return service.deleteBookById(id);
    }
    @GetMapping("/{id}")
    public Book getBookById(@PathVariable Integer id) {
        return service.getBookById(id);
    }
    @GetMapping
    public List<Book> selectAll() {
        return service.selectAll();
    }
}


表现层接口测试:使用Postman进行测试


四、表现层数据封装


因为各种对数据库的增删改查操作返回的结果不一定相同,表现层返回给前端人员的数据可能是int类型,对象类型,数组类型,……这就需要统一格式,通过对象将这些返回值封装在属性里。此外,通过状态码告诉前端人员操作是否成功。


下面是表现层数据封装模型:


/**
 * 表现层数据封装模型-返回给前端的数据都是Result对象类型
 */
public class Result {
    /**
     * 返回的状态-成功与失败,何种操作
     */
    private Integer code;
    /**
     * 返回的数据
     */
    private Object data;
    /**
     * 成功或失败的响应信息
     */
    private String msg;
    public Result() {
    }
    /**
     * 不带消息
     *
     * @param data
     * @param code
     */
    public Result(Integer code, Object data) {
        this.data = data;
        this.code = code;
    }
    /**
     * 带消息
     *
     * @param data
     * @param code
     * @param msg
     */
    public Result(Integer code, Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }
    // getter setter 已省略


状态码模型:


/**
 * 定义增删改查操作成功或者失败的状态码-8种
 */
public class Code {
    /**
     * 结尾1代表成功,0代表失败
     */
    public static final Integer ADD_OK = 20011;
    public static final Integer ADD_ERR = 20010;
    public static final Integer DELETE_OK = 20021;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer SELECT_OK = 20041;
    public static final Integer SELECT_ERR = 20040;
}


从而controller层返回的都是Result对象。


五、异常处理器


5.1 异常处理

(1)可能出现异常之处

9fcf54fc3b9742e88f290db93ca167ec.png


(2)解决步骤

将所有的异常都抛出到表现层,进行集中处理,但是肯定不能放到表现层控制器

上,因为不同异常处理方案不同,且会让代码臃肿,其实是使用Spring的AOP思想

(3)异常处理类


@RestControllerAdvice // 将这个类作为异常处理器通知类
public class ProjectExceptionAdvice {
    @ExceptionHandler({Exception.class}) // 拦截所有异常
    public Result doException(Exception e) {
        System.out.println("error ...");
        return new Result(500,null,"error");
    }
}


17c99fed85324fc98a070d7fa8f8bcb3.png

9cc60148cb494bb4ac4f66a04d606537.png


5.2 项目异常处理步骤


(1)异常分类及处理方案


业务异常 系统异常 其他异常
用户操作产生的异常 项目运行中可预计不可避免的异常(如停电,系统宕机) 编程人员无法预计的异常
发送对应消息给用户,提示规范操作 发送固定消息给用户,安抚用户(如您的网络状态不佳,请稍后重试);发送特定消息给运维人员;记录日志 和系统异常处理相似

(2)具体代码实现

1.新建自定义系统异常和业务异常类,两个类非常相似


public class SystemException extends RuntimeException {
    /**
     * 加入异常编号帮助识别是哪一种异常
     */
    private Integer code;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }
    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}
public class BusinessException extends RuntimeException {
    /**
     * 加入异常编号帮助识别是哪一种异常
     */
    private Integer code;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }
    public BusinessException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}


2.在Code类中增加了几种状态码:


    /**
     * 异常状态码(可以细分)
     */
    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
    public static final Integer BUSINESS_ERR = 60002;
    public static final Integer SYSTEM_UNKNOWN_ERR = 59999;


3.在业务层BookServiceImpl类分别模拟业务异常和系统异常:


  @Override
    public Book getBookById(Integer id) {
        // 模拟业务异常
        if (id == 1) {
            throw new BusinessException(Code.BUSINESS_ERR, "ban!");
        }
        // 模拟系统异常
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            throw new SystemException(Code.SYSTEM_TIMEOUT_ERR, "Time out!", e); // 将可能出现的异常进行包装,转换为自定义异常
        }
        Book book = mapper.getBookById(id);
        return book;
    }

4.在异常通知类中添加这两种异常处理方法:


@RestControllerAdvice // 将这个类作为异常处理器通知类
public class ProjectExceptionAdvice {
    @ExceptionHandler({SystemException.class}) // 拦截系统异常
    public Result doSystemException(SystemException e) {
        // 1.记录日志
        // 2.发送消息给运维
        // 3.发送邮件给开发人员
        System.out.println("SystemException ...");
        return new Result(e.getCode(), null, e.getMessage());
    }
    @ExceptionHandler({BusinessException.class}) // 拦截业务异常
    public Result doBusinessException(BusinessException e) {
        System.out.println("BusinessException ...");
        return new Result(e.getCode(), null, e.getMessage());
    }
    @ExceptionHandler({Exception.class}) // 拦截未知异常
    public Result doException(Exception e) {
        // 1.记录日志
        // 2.发送消息给运维
        // 3.发送邮件给开发人员
        System.out.println("Exception ...");
        return new Result(Code.SYSTEM_UNKNOWN_ERR, null, "System busy ...");
    }
}


5.重启服务器,使用Postman测试:


88099b2523f14f3fb876f0e7e4f6fe43.png


相关文章
|
27天前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
4天前
|
SQL 关系型数据库 MySQL
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
课程分类查询、课程新增、统一异常处理、统一封装结果类、JSR303校验、修改课程、查询课程计划、新增/修改课程计划
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
|
1月前
|
SQL 数据库连接 API
ThinkPHP6实现增删改查接口
ThinkPHP6实现增删改查接口
28 1
|
1月前
|
SQL Java 应用服务中间件
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
这篇文章是关于如何使用SSM框架搭建图书商城管理系统的教程,包括完整过程介绍、常见问题解答和售后服务,提供了项目地址、运行环境配置、效果图展示以及运行代码的步骤。
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
|
1月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
1月前
|
SQL XML Java
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
|
21天前
|
开发工具 数据安全/隐私保护 索引
LDAP学习笔记之二:389-DS(RHDS) 增删改查基本操作
LDAP学习笔记之二:389-DS(RHDS) 增删改查基本操作
|
21天前
|
关系型数据库 MySQL 数据库
MySQL数据库的增删改查
MySQL数据库的增删改查
12 0
|
28天前
|
SQL 关系型数据库 MySQL
"Python与MySQL的浪漫邂逅:一键掌握增删改查,开启你的数据库编程之旅!"
【8月更文挑战第21天】Python因其简洁的语法和强大的库支持,成为连接数据库的首选工具。本文介绍如何使用Python连接MySQL数据库并执行基本操作。首先需安装`mysql-connector-python`库。通过配置连接信息建立数据库连接后,可利用`cursor.execute()`执行SQL语句进行数据的增删改查,并通过`commit()`提交更改。查询时使用`fetchall()`或`fetchone()`获取结果。记得处理异常及关闭连接以释放资源。掌握这些基础,有助于高效进行数据库编程。
27 0
|
1月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
150 0