源码解析Spring 数据库异常抽理知识点总结

源码解析Spring 数据库异常抽象知识点总结

异常抽象

Java应用中处理数据库操作时,经常会出现各种数据库异常,例如连接超时、SQL语法错误等。这些异常信息通常是非常繁琐和冗长的,不利于开发者理解和处理异常。Spring提供了丰富的异常抽象支持,可以有效地降低程序员处理异常的复杂度,提升开发效率。

Spring 提供了以下几种异常:

DataAccessException

所有与数据访问、SQL仓库和JDBC相关的异常都继承DataAccessException。DataAccessException可分为以下两类:

  1. NonTransientDataAccessExcpetion:不可恢复的数据访问异常,例如:SQL语法错误、表不存在等。

  2. TransientDataAccessException:可恢复的数据访问异常,例如:数据库连接超时、死锁等。

DataAccessResourceFailureException

该异常继承自NonTransientDataAccessException,是由于媒介资源(如数据库)无法打开或获得连接而导致的异常。该异常通常表现为一系列连接或登录失败异常,操作中断。

DataIntegrityViolationExcetion

该异常继承自DataAccessException,反映了数据访问层的完整性失败。

JdbcUpdateAffectedIncorrectNumberOfRowsException

当sql更新时,影响的行不符合预期时,抛出该异常。

Spring中的异常处理

Spring使用异常体系统一异常处理,通过编写AOP环绕通知来捕捉异常并将其转换为Spring期望的异常体系。

AOP环绕通知的代码如下:

public class ExceptionHandlerAspect {
    @Around("execution(* com.example.demo.service..*.*(..))")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        try {
            return pjp.proceed();
        } catch (SQLException e) {
            throw new DataAccessResourceFailureException("SQLException", e);
        } catch (DataAccessException e) {
            throw new MyDataAccessException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } 
    }
}

在 AOP 环绕通知中,如果方法调用抛出 SQLException 或 DataAccessException,则将 SQLException 转换为 DataAccessResourceFailureException,将 DataAccessException 转换为 MyDataAccessException,并将其他异常转换为 RuntimeException。

MyDataAccessException 的实现如下:

public class MyDataAccessException extends UncategorizedDataAccessException {
    public MyDataAccessException(SQLException ex) {
        super(ex.getMessage(), ex);
    }
}

该类继承了Spring的UncategorizedDataAccessException,可把非DataAccessException类的异常转换为Spring期望的异常类型。

示例

示例1:使用Spring JdbcTemplate访问数据库

在Spring中,JdbcTemplate是最常用的JDBC访问模板。我们可以在异常抽象中利用JdbcTemplate的异常处理来处理数据访问异常。

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void addUser(User user) {
        String sql = "insert into user(name, age) values(?, ?)";
        try {
            jdbcTemplate.update(sql, user.getName(), user.getAge());
        } catch (DataAccessException e) {
            throw new MyDataAccessException(e);
        }
    }

    @Override
    public List<User> getUsers() {
        String sql = "select * from user";
        try {
            return jdbcTemplate.query(sql, new UserMapper());
        } catch (DataAccessException e) {
            throw new MyDataAccessException(e);
        }
    }
}

在 addUser 和 getUsers 方法中,我们利用 try/catch 块捕获了 DataAccessException 异常。如果抛出了 DataAccessException 异常,我们使用 MyDataAccessException 将其转换为 Spring 期望的异常类型,以提供更好的异常处理和控制。

示例2:使用Hibernate访问数据库

在Hibernate中,使用JPA操作数据库是很常见的。我们同样可以利用上面提到的异常处理机制来处理Hibernate的异常。

@Transactional
@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private EntityManager entityManager;

    @Override
    public List<User> getUsers() {
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<User> criteria = builder.createQuery(User.class);
        Root<User> root = criteria.from(User.class);
        criteria.select(root);
        List<User> result = new ArrayList<>();
        try {
            result.addAll(entityManager.createQuery(criteria).getResultList());
        } catch (Exception e) {
            throw new MyDataAccessException(e);
        }
        return result;
    }

    @Override
    public void addUser(User user) {
        try {
            entityManager.persist(user);
        } catch (Exception e) {
            throw new MyDataAccessException(e);
        }
    }
}

我们同样利用上面提到的 try/catch 块来捕获异常,并将异常转换为 MyDataAccessException,以提供更好的异常处理和控制。

以上就是Spring数据库异常抽象的知识点总结,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:源码解析Spring 数据库异常抽理知识点总结 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Maven安装过程图文详解

    下面我将为你详细讲解”Maven安装过程图文详解”的完整攻略。 Maven是什么 Maven是一个项目管理和构建工具,它提供了一种简单易用的构建方式便于开发人员使用。使用Maven可以方便的管理依赖,自动生成项目结构,编译,测试,打包等。 Maven的安装过程 以下是Maven的安装过程。 1. 下载Apache Maven Maven的官方网站为 http…

    Java 2023年5月20日
    00
  • Java复制文件常用的三种方法

    当需要将一个文件复制到另一个地方时,Java中有许多方法可以复制文件。接下来我将讲解Java中复制文件的常用三种方法。 方法一: 使用Java IO的流来复制文件 最传统的方法是使用Java IO的流来复制文件。此方法使用基本的文件输入/输出流,将源文件作为输入流,将目标文件作为输出流进行复制。 public static boolean copyFileU…

    Java 2023年5月20日
    00
  • Spring Boot 使用 SSE 方式向前端推送数据详解

    在Spring Boot应用程序中,我们可以使用SSE(Server-Sent Events)方式向前端推送数据。SSE是一种基于HTTP协议的轻量级推送技术,它允许服务器向客户端推送数据,而无需客户端发起请求。在本文中,我们将详细讲解如何使用Spring Boot和SSE来实现向前端推送数据。 增加依赖 首先,我们需要在pom.xml文件中增加webflu…

    Java 2023年5月18日
    00
  • Springboot打包成jar发布的操作方法

    请允许我来详细讲解“Springboot打包成jar发布的操作方法”的完整攻略。 一、前置条件 Java开发环境已经配置好。 Maven已经安装配置好。 已经使用Springboot完成了应用程序的开发。 二、打包Springboot应用程序 1. 使用命令行 运行下面的命令将应用程序打包成可执行的jar包: mvn clean package 该命令会在M…

    Java 2023年5月19日
    00
  • extjs 学习笔记 四 带分页的grid

    下面是针对“EXTJS 学习笔记 四 —— 带分页的 Grid”这篇文章的详细攻略。 1. 文章概览 该篇文章主要是介绍如何使用 EXTJS 构建具有分页功能的 Grid 表格。其中,主要介绍以下内容: 引入必要的资源文件 创建分页工具栏 构建 Grid 表格 设置 Grid 表格分页参数 2. 引入必要的资源文件 在使用 EXTJS 构建 Grid 表格时…

    Java 2023年6月16日
    00
  • 基于Java写minio客户端实现上传下载文件

    下面是基于Java写minio客户端实现上传下载文件的完整攻略。 1. 安装Minio服务器 首先,需要在本地或服务器上安装Minio服务器,具体步骤可以参考官方文档进行操作。一般来说,可以通过以下命令安装: $ wget https://dl.min.io/server/minio/release/linux-amd64/minio $ chmod +x …

    Java 2023年5月19日
    00
  • javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    一、概述在国际化应用中,日期格式化、数字格式化和消息格式化是常见的需求,针对这些需求,Java提供了一系列的类和工具:DateFormat、NumberFormat、MessageFormat和ResourceBundle。 二、DateFormat使用DateFormat是一个日期格式化类,它可以将Date对象格式化成指定的字符串。 使用方法如下: Dat…

    Java 2023年6月15日
    00
  • Java 实现网络爬虫框架详细代码

    我将为您详细讲解Java 实现网络爬虫框架的攻略。 什么是网络爬虫 网络爬虫(英语:web crawler),也叫做网络蜘蛛(spider),是一种按照一定的规则和算法,自动访问万维网信息的程序或脚本。网络爬虫可以从互联网上自动获取信息,并通过许多处理方法对这些信息进行重组和筛选,从而给用户提供全面和高效的信息检索服务。 网络爬虫的实现 在Java中,我们可…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部