この記事に書いてあること
- プロになるためのSpring入門のデータベースアクセス時の例外の内容を読んだまとめ
- データベースアクセス例外の問題点とSpringの汎用的な例外クラスによる解決
データベースアクセス例外の問題
データベースアクセスでエラーが起きた時にスローされる例外クラスは、データベースアクセスの仕組みごとに異なる。
DBアクセスの仕組み | 例外 |
---|---|
Java標準JDBC | SQLException |
MyBatis | (MyBatis)PersistenceException |
JPA | (JPA)PersistenceException |
Hibernate | HibernateException |
… | … |
問題点:
- 例外をハンドリングするアプリケーションの処理は、それぞれの例外クラスをキャッチする必要があり、データベースアクセスの仕組みに依存する
- データベースアクセスの仕組みを変える場合は、例外をハンドリングしている部分の修正が必要になる
Springの汎用的な例外クラスによる解決
- Springの機能を使うと、スローされた例外を汎用的な例外に変換してくれる
- Spring JDBC
- MyBatisなど他ライブラリとの連携機能
- 例外をハンドリングするアプリケーションの処理は、汎用的なSpringの例外クラスをキャッチしてハンドリングすれば良いため、データベースアクセスの仕組みを変えても影響なし
try {
...
} catch (Springの例外クラス) {
...
}
Springの汎用的な例外DataAccessExceptionクラス
- Springが提供するデータベースアクセスまわりの汎用的な例外クラスは、DataAccessExceptionを継承している
- DataAccessExceptionはRuntimeExceptionを継承している非チェック例外
- 非チェック例外であるため、例外をハンドリングできないのであれば、try-catchで例外をキャッチする必要はない
- DataAccessExceptionクラスの代表的なサブクラス
サブクラス | 説明 |
---|---|
BadSqlGrammarException | 指定された SQL が無効な場合にスローされる例外 |
DuplicateKeyException | データを挿入または更新しようとすると、主キーまたは一意性制約に違反した場合にスローされる例外 |
DataAccessResourceFailureException | リソースが完全に失敗したときにスローされるデータアクセス例外: たとえば、JDBC を使用してデータベースに接続できない場合 |
… | … |
上記のように、DataAccessExceptionを継承した例外のサブクラスが、エラーの原因ごとに提供されている。例外をハンドリングするアプリケーションは、ハンドリングしたいエラーの原因に応じて、対応する例外クラスをキャッチすれば良い。