SQLExceptionTranslator - bu interfeys, u SQLExceptions va o'zining org.springframework.dao.DataAccessExceptionlari o'rtasida o'zgartirishlarni amalga oshira oladigan sinflar tomonidan amalga oshirilishi kerak, bu ma'lumotlarga kirish strategiyasidan mustaqil bo'ladi. Realizatsiyalar tiplashtirilgan bo'lishi mumkin (masalan, JDBC uchun SQLState kodlaridan foydalanish) yoki xususiy (masalan, Oracle kodlaridan foydalanish) aniqroq ma'lumot olish uchun.
SQLErrorCodeSQLExceptionTranslator - bu SQLExceptionTranslatorning standart ishga tushirilishi. Ushbu versiyada ishlab chiqaruvchilar tomonidan belgilangan kodlardan foydalaniladi. Bu SQLState realizatsiyasidan ko'ra aniqroq. Xatolarni o'zgartirish kodlari SQLErrorCodes nomli JavaBean turidagi sinfda saqlanadi. Ushbu sinf SQLErrorCodesFactory tomonidan yaratiladi va to'ldiriladi, u (nomidan ko'rinib turibdiki) sql-error-codes.xml konfiguratsiya faylining tarkibiga asoslangan holda SQLErrorCodes yaratish fabrikasi. Ushbu fayl ishlab chiqaruvchi kodlar bilan to'ldiriladi va DatabaseProductName asoslangan holda DatabaseMetaData'dan olinadi. Siz foydalanadigan ma'lumotlar bazasi uchun haqiqiy kodlar ishlatiladi.
SQLErrorCodeSQLExceptionTranslator quyidagi ketma-ketlikda moslash qoidalarini qo'llaydi:
-
Har qanday maxsus o'zgartirish, subklass tomonidan amalga oshirilgan. Odatda, aniq
SQLErrorCodeSQLExceptionTranslatorishlatiladi, shuning uchun ushbu qoida qo'llanilmaydi. Bu qoida faqat siz haqiqatan ham subklassni amalga oshirishni taqdim etganingizda qo'llaniladi. -
SQLErrorCodessinfiningcustomSqlExceptionTranslatorxususiyatlari sifatida taqdim etilganSQLExceptionTranslatorinterfeysining har qanday maxsus realizatsiyasi. -
SQLErrorCodessinfiningcustomTranslationsuchun taqdim etilganCustomSQLErrorCodesTranslationsinfi misollar ro'yxatida moslik izlash. -
Xatolik kodlarini moslashtirish qo'llaniladi.
-
Qaytariladigan translator (tarjimon) qo'llaniladi.
SQLExceptionSubclassTranslatorstandart tarjimon bo'lib, agar bu tarjima mavjud bo'lmasa, keyingi qaytariladigan tarjimonSQLStateSQLExceptionTranslatorbo'ladi.
SQLErrorCodesFactory
Error kodlarini va maxsus xatolik o'zgartirishlarini aniqlash uchun standarta ishlatiladi. Ular classpathdan
sql-error-codes.xml faylida qidiriladi va mos keladigan
SQLErrorCodes misoli foydalanilayotgan ma'lumotlar bazasining metama'lumotlaridagi bazaning nomiga asoslangan.
Quyida ko'rsatilgandek, SQLErrorCodeSQLExceptionTranslator kengaytirish mumkin:
public class CustomSQLErrorCodesTranslator extends SQLErrorCodeSQLExceptionTranslator {
protected DataAccessException customTranslate(String task, String sql, SQLException sqlEx) {
if (sqlEx.getErrorCode() == -12345) {
return new DeadlockLoserDataAccessException(task, sqlEx);
}
return null;
}
}
class CustomSQLErrorCodesTranslator : SQLErrorCodeSQLExceptionTranslator() {
override fun customTranslate(task: String, sql: String?, sqlEx: SQLException): DataAccessException? {
if (sqlEx.errorCode == -12345) {
return DeadlockLoserDataAccessException(task, sqlEx)
}
return null
}
}
Yuqoridagi misolda, aniq xatolik kodi (-12345) o'zgartiriladi, qolgan xatolar esa o'zgartiruvchi realizatsiyaga bog'liq qoladi. Ushbu maxsus tarjimonni ishlatish uchun uni JdbcTemplate'ga setExceptionTranslator metodi orqali o'tkazishingiz kerak, keyin esa bu tarjimon kerak bo'lgan har qanday ma'lumotlarga kirish ishlov berish uchun bu JdbcTemplate'dan foydalanishingiz mumkin. Quyidagi misol ushbu maxsus tarjimondan qanday foydalanish mumkinligini ko'rsatadi:
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
// JdbcTemplate yaratamiz va ma'lumotlar manbasini o'rnatamiz
this.jdbcTemplate = new JdbcTemplate();
this.jdbcTemplate.setDataSource(dataSource);
// Maxsus tarjimonni yaratamiz va ma'lumotlar manbasini standarta tarjimani qidirish uchun o'rnatamiz
CustomSQLErrorCodesTranslator tr = new CustomSQLErrorCodesTranslator();
tr.setDataSource(dataSource);
this.jdbcTemplate.setExceptionTranslator(tr);
}
public void updateShippingCharge(long orderId, long pct) {
// Ushbu yangilash uchun tayyorlangan JdbcTemplate'dan foydalanamiz
this.jdbcTemplate.update("update orders" +
" set shipping_charge = shipping_charge * ? / 100" +
" where id = ?", pct, orderId);
}
// JdbcTemplate yaratamiz va ma'lumotlar manbasini o'rnatamiz
private val jdbcTemplate = JdbcTemplate(dataSource).apply {
// Maxsus tarjimonni yaratamiz va ma'lumotlar manbasini standarta tarjimani qidirish uchun o'rnatamiz
exceptionTranslator = CustomSQLErrorCodesTranslator().apply {
this.dataSource = dataSource
}
}
fun updateShippingCharge(orderId: Long, pct: Long) {
// Ushbu yangilash uchun tayyorlangan JdbcTemplate'dan foydalanamiz
this.jdbcTemplate!!.update("update orders" +
" set shipping_charge = shipping_charge * ? / 100" +
" where id = ?", pct, orderId)
}
Maxsus tarjimon sql-error-codes.xml dan xatolik kodlarini qidirish uchun ma'lumotlar manbasini qabul qiladi.
GO TO FULL VERSION