源码解析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日

相关文章

  • 使用JAVA实现http通信详解

    使用JAVA实现http通信可以通过以下几个步骤完成: 步骤1:引入相关包 在实现http通信之前,需要引入相关的包,这些包中包含了实现http通信所需要的类和方法。Java中实现http通信一般使用Apache提供的HttpComponents包,该包可以通过Maven引入,如下: <dependency> <groupId>org…

    Java 2023年5月18日
    00
  • 用JavaScript实现仿Windows关机效果

    当我们尝试模仿操作系统的某些效果时,如Windows关机效果,我们需要使用 JavaScript 和 CSS。下面是实现仿Windows关机效果的完整攻略。 准备工作 在开始实现之前,需要先准备好以下三个工具: 一个编辑器,如 Visual Studio Code 一个浏览器,如 Chrome 一段用于实现效果的HTML和CSS代码 实现过程 以下是实现该效…

    Java 2023年6月16日
    00
  • Java基础精讲方法的使用

    当我们学习Java基础时,方法是一个非常重要和基础的概念,掌握了方法的使用可以帮助我们更好地编写代码。下面是“Java基础精讲方法的使用”的完整攻略: 方法的定义与使用 在Java的编程中,方法是一组执行特定任务的语句块。方法定义和调用的语法如下: // 方法的定义 public static returnType methodName(parameter …

    Java 2023年5月23日
    00
  • SpringBoot项目使用aop案例详解

    下面我为大家详细讲解“SpringBoot项目使用aop案例详解”的完整攻略。 一、什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,是一种编程思想,它的原理就是在不改变原有代码结构的基础上,对横切关注点进行描述,便于将这些非功能性的需求模块化,降低系统耦合度。在Spring Framework中,AOP通过切面…

    Java 2023年5月31日
    00
  • javaWeb实现简单文件上传

    下面是“javaWeb实现简单文件上传”的完整攻略。 一、准备工作 在开始之前,需要准备以下工作: 一个支持Servlet、JavaServer Pages(JSP)的JavaWeb环境,如Tomcat、Jetty等。 一个用于上传文件的HTML表单。 编写Java Servlet程序来处理上传文件,并保存在服务器上。 二、HTML表单 HTML表单必须包含…

    Java 2023年5月20日
    00
  • Java Swagger使用教程

    下面是Java Swagger使用教程的完整攻略: 1. 什么是Swagger? Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。Swagger包含了许多强大的工具,可以使用它们来构建、文档化和测试RESTful API。 2. Swagger的优点 Swagger最大的好处是它使API文档变得容易,让API…

    Java 2023年6月15日
    00
  • Java文件选择对话框JFileChooser使用详解

    Java文件选择对话框JFileChooser使用详解 JFileChooser Java 文件选择对话框 (JFileChooser) 是 Java Swing 组件库中的一部分。它允许用户选择文件或目录,是一种常用的用户界面组件。 JFileChooser 核心属性 下面是 JFileChooser 的一些核心属性: currentDirectory: …

    Java 2023年5月20日
    00
  • java中拼接字符串的5种方法效率对比

    下面我就为您详细讲解“Java中拼接字符串的5种方法效率对比”的攻略。 1. 前言 字符串是Java语言中最常用的数据类型之一,而字符串的拼接操作也是开发中经常需要用到的操作。本文将对Java中拼接字符串的5种常用方法进行效率对比。 2. String String 是Java中最基本的字符串类,它可以实现基本的字符串拼接功能。但是,由于Java语言中的字符…

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