源码解析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编程实现数组转成list及list转数组的方法

    Java编程实现数组转成list及list转数组的方法 在Java编程中,我们经常需要将数组和List之间进行转换。下面是将数组转换成List和将List转换成数组的方法: 将数组转换成List 使用Arrays.asList(Object[] array) 可以使用Arrays.asList()方法将数组转换成List。代码示例如下: // 定义一个数组 …

    Java 2023年5月26日
    00
  • java求数组最大值和最小数示例分享

    Java求数组最大值和最小值示例分享 在Java开发中,我们经常需要对数组中的元素进行操作。其中,求出数组的最大值和最小值是常见操作之一。下面我们将会介绍两种不同的方法来求数组的最大值和最小值。 方法一: 遍历比较法 遍历比较法是一种简单粗暴的方法。我们可以通过循环遍历数组中的每一个元素,并且在遍历的过程中与当前的最大值或最小值进行比较。当我们遍历完整个数组…

    Java 2023年5月26日
    00
  • servlet实现图片上传功能

    下面我来为你讲解如何使用servlet实现图片上传功能的完整攻略。 1. 准备工作 首先,我们需要在web项目中添加commons-fileupload和commons-io两个jar包。这两个包是实现文件上传必不可少的工具包,它们可以在apache的官网上下载到。 2. 自定义servlet 我们需要自定义一个servlet来实现上传图片的功能,具体实现就…

    Java 2023年6月15日
    00
  • java程序打包成exe与jar的图文教程

    下面我来为您详细讲解“java程序打包成exe与jar的图文教程”。整个教程包含以下几个步骤: 安装JDK:打包Java程序需要先安装JDK,并配置环境变量。 编写Java程序:编写自己需要打包的Java程序。 使用命令行打包成jar文件:进入项目所在目录,使用javac命令编译Java程序,再使用jar命令打包成jar文件。 运行jar文件:使用命令行运行…

    Java 2023年5月23日
    00
  • Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例

    你好,下面是关于“Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例”的详细攻略。 什么是Hibernate? Hibernate是一种Java框架,用于在Java对象和关系型数据库之间提供持久性支持。它是ORM(对象关系映射)的基础框架,可以使用Hibernate来管理和查询数据库中的数据。 什么是HQL? HQL(Hibernate…

    Java 2023年5月31日
    00
  • SpringBoot整合freemarker的讲解

    SpringBoot整合Freemarker的完整攻略 1.1 添加依赖 使用SpringBoot整合Freemarker需要添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star…

    Java 2023年5月19日
    00
  • Java中ArrayBlockingQueue和LinkedBlockingQueue

    简介: Java中的BlockingQueue是java.util.concurrent包中的一个接口,是JDK中的并发工具,提供了线程安全的队列,可以用来协调生产者与消费者线程的生产和消费的速度,并且解决了高并发下数据读写的安全问题。BlockingQueue具有阻塞的复杂行为,可以实现生产、消费线程集合的同步。 Java中有两个BlockingQueue…

    Java 2023年5月26日
    00
  • java创建excel示例(jxl使用方法)

    关于“java创建excel示例(jxl使用方法)”的攻略,可以分以下步骤进行讲解: 1. 准备工作 在使用jxl创建Excel文件之前,需要先下载并导入jxl的jar包,可以通过以下方式导入: 将下载的jxl.jar文件拷贝至项目的lib目录下,然后右键点击该文件,选择“Build Path” -> “Add to Build Path”即可将其添加…

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