面向小白的SpringBoot的JDBC异常抽象讲解

239 阅读2分钟

这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

今天给小白带来的是Spring对这个JDBC异常抽象的讲解,借着文章顺便说一下自己的心情,哎今年不能回家了,要独自过年了,其实不回家也不是不能过年,但能和家人一起过年,是不错的事情。

Spring的抽象

我们以重复Key的异常为例子给小白同学简单的说明一下,这里截取了一个继承类的类图,大家可以看下:

image.png

我们知道Spring是有很多的这个数据操作方法的,有mybtis,hibernate,jdbc等等,但是Spring没有给这些方法进行单独异常抽象,而是采用了统一异常抽象,这个我们可以从这个类图上就能看出来,那我们这里有个疑问,Spring是如何做到这一点的呢?

Sql-Error-Code

其实是通过这些错误码来管理,哪些给jdbc,哪些给这个mybatis,哪些给h2或者其它的数据库,Spring都定义好了。

然后使用数据库的错误码解析器解析就行了,那当你们项目有类似于这种需求的时候,也可以考虑使用Spring的错误码和错误码解析的方式来完成需求。

我们可以找一下看看:

定义错误码的类:

image.png

错误码的定义: image.png

image.png

这里还有一些注释,说已经给一些知名的数据库编辑了默认的错误码,如果你喜欢,你还可以覆盖这个文件,进行自定义错误码。 image.png

自定义错误码

这里以H2数据库为例,玩一下错误码,然后加个这个错误码定义:

<property name="customTranslations">
   <bean class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation">
      <property name="errorCodes">
         <value>23505</value>
      </property>
      <property name="exceptionClass" value="geektime.spring.data.errorcodedemo.CustomDuplicatedKeyException"/>
   </bean>
</property>

如果遇到23505这个错误码,就抛重复主键的自定义异常,然后,我们还需要一个自定义异常类:CustomDuplicatedKeyException

public class CustomDuplicatedKeyException extends DuplicateKeyException {
    public CustomDuplicatedKeyException(String msg) {
        super(msg);
    }

    public CustomDuplicatedKeyException(String msg, Throwable cause) {
        super(msg, cause);
    }
}

之后,我们做一个单元测试

单元测试

@Test(expected =CustomDuplicatedKeyException.class )
public void test(){
    template.execute("INSERT INTO Foo (ID,BAR) VALUES (19,'qqqq')");
    template.execute("INSERT INTO Foo (ID,BAR) VALUES (19,'bdddd')");
}

这里添加了重复主键19,然后加了个预期,看看抛出的是不是我们自定义的异常,Run一下:

测试结果:

image.png

测试通过,这是我第一次看到异常也这么开森,哈哈哈。