JavaRush /Kurslar /All lectures for UZ purposes /SQLExceptionTranslator'dan foydalanish

SQLExceptionTranslator'dan foydalanish

All lectures for UZ purposes
Daraja, Dars
Mavjud

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:

  1. Har qanday maxsus o'zgartirish, subklass tomonidan amalga oshirilgan. Odatda, aniq SQLErrorCodeSQLExceptionTranslator ishlatiladi, shuning uchun ushbu qoida qo'llanilmaydi. Bu qoida faqat siz haqiqatan ham subklassni amalga oshirishni taqdim etganingizda qo'llaniladi.

  2. SQLErrorCodes sinfining customSqlExceptionTranslator xususiyatlari sifatida taqdim etilgan SQLExceptionTranslator interfeysining har qanday maxsus realizatsiyasi.

  3. SQLErrorCodes sinfining customTranslations uchun taqdim etilgan CustomSQLErrorCodesTranslation sinfi misollar ro'yxatida moslik izlash.

  4. Xatolik kodlarini moslashtirish qo'llaniladi.

  5. Qaytariladigan translator (tarjimon) qo'llaniladi. SQLExceptionSubclassTranslator standart tarjimon bo'lib, agar bu tarjima mavjud bo'lmasa, keyingi qaytariladigan tarjimon SQLStateSQLExceptionTranslator bo'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:

Java
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;
    }
}
Kotlin
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:

Java
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);
}
Kotlin
// 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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION