这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战
今天给小白带来的是Spring对这个JDBC异常抽象的讲解,借着文章顺便说一下自己的心情,哎今年不能回家了,要独自过年了,其实不回家也不是不能过年,但能和家人一起过年,是不错的事情。
Spring的抽象
我们以重复Key的异常为例子给小白同学简单的说明一下,这里截取了一个继承类的类图,大家可以看下:
我们知道Spring是有很多的这个数据操作方法的,有mybtis,hibernate,jdbc等等,但是Spring没有给这些方法进行单独异常抽象,而是采用了统一异常抽象,这个我们可以从这个类图上就能看出来,那我们这里有个疑问,Spring是如何做到这一点的呢?
Sql-Error-Code
其实是通过这些错误码来管理,哪些给jdbc,哪些给这个mybatis,哪些给h2或者其它的数据库,Spring都定义好了。
然后使用数据库的错误码解析器解析就行了,那当你们项目有类似于这种需求的时候,也可以考虑使用Spring的错误码和错误码解析的方式来完成需求。
我们可以找一下看看:
定义错误码的类:
错误码的定义:
这里还有一些注释,说已经给一些知名的数据库编辑了默认的错误码,如果你喜欢,你还可以覆盖这个文件,进行自定义错误码。
自定义错误码
这里以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一下:
测试结果:
测试通过,这是我第一次看到异常也这么开森,哈哈哈。