JavaRush /Kurslar /All lectures for UZ purposes /Spring va Data Access Object (DAO)

Spring va Data Access Object (DAO)

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring'da ma'lumotlarga kirish obyekti (Data Access Object/DAO) qo'llab-quvvatlashi ma'lumotlarga kirish texnologiyalari bilan ishlashni soddalashtirishga qaratilgan (JDBC, Hibernate yoki JPA kabi). Bu yuqorida aytilgan doimiy saqlash texnologiyalari orasida oson almashish imkonini beradi va har bir texnologiyaga xos bo'lgan istisnolarni tutib olish haqida qayg'urishga hojat qoldirmaydi.

Izchil istisnolar iyerarhiyasi

Spring texnologiyaga xos bo'lgan istisnolar, masalan, SQLException dan o'zining istisnolar sinflari iyerarhiyasiga o'tishni osonlashtiradi, bu yerda asosiy istisno DataAccessException hisoblanadi. Ushbu istisnolar asl istisnoni qamrab oladi, shuning uchun nima noto'g'ri ketganligi haqida ma'lumot yo'qotish xavfi yo'q.

JDBC istisnolariga qo'shimcha ravishda, Spring JPA va Hibernate'ga xos istisnolarni ham qamrab olib, ularni tashkil etilgan istisnolar to'plamiga aylantiradi. Bu doimiy saqlashning ko'p yaroqsiz istisnolarini mos darajalarda ishlash imkonini beradi, DAO'laringizda klassik "catch-and-throw" bloklari va istisnolar e'lonlaridan qochishga imkon beradi. (Ammo, kerak bo'lganda, har joyda istisnolarni tutish va ishlash mumkin). Yuqorida aytilganidek, JDBC istisnolari (ma'lumotlar bazasiga xos dialektlar ham qo'shilgan) ham shu iyerarxiyaga o'tkaziladi, ya'ni siz JDBC bilan dasturiy modellar doirasida ba'zi operatsiyalarni bajarishingiz mumkin.

Yuqumli izohlar, Springni turli ORM-freymlar uchun qo'llab-quvvatlash vositalarida turli shablon sinflarga ham taalluqlidir. Agar siz interceptorlarga asoslangan sinflardan foydalansangiz, ilova HibernateExceptions va PersistenceExceptions ni o'zi ishlashi kerak, afzal convertHibernateAccessException(..) yoki convertJpaAccessException(..) usullari orqali SessionFactoryUtils vositalariga topshiradi. Ushbu usullar istisnolarni org.springframework.dao istisnolar iyerarxiyasi bilan mos keladigan istisnolarga aylantiradi. PersistenceExceptions tekshirilmaydi, shuning uchun ular ham yaratilishi mumkin (garchi bu holatda DAO istisnolar qamrab olish turli qismlariga tuzilgan holda yo'qotilsa-da).

Quyidagi rasmdan Spring tomonidan taklif etilgan istisnolar iyerarxiyasini ko'rishingiz mumkin. (Rasmdagi klass iyerarxiyasi, faqat DataAccessException umumiy iyerarxiyasining bir qismini ko'rsatadi).

DAO yoki repozitoriy sinflarini sozlash uchun ishlatiladigan annotatsiyalar

Ma'lumotlarga kirish obyekti (DAO) yoki repozitoriylaringiz istisnolarni albatta o'zgartirish (tarjima qilish) qilishini ta'minlashning eng yaxshi yo'li @Repository annotatsiyasidan foydalanishdir. Ushbu annotatsiya, komponentlarni skanerlash vositalariga sizning DAO va repozitoriylaringizni topish va sozlash imkonini beradi, ularga XML konfiguratsiya yozuvlarini taqdim etishga hojat yo'q. Quyidagi misolda, @Repository annotatsiyasidan qanday foydalanishni ko'rsatadi:

Java
@Repository 
public class SomeMovieFinder implements MovieFinder {
    // ...
}
  1. @Repository annotatsiyasi.
Kotlin
@Repository 
class SomeMovieFinder : MovieFinder {
    // ...
}
  1. @Repository annotatsiyasi.

DAO yoki repozitoriyaning har qanday amalga oshirilishi doimiy saqlash texnologiyasiga bog'liq holda doimiy saqlash resursiga kirish imkoniyatiga ega bo'lishi kerak. Masalan, JDBC asosidagi repozitoriy JDBC DataSource'ga kirish kerak, JPA asosidagi saqlash EntityManager'ga kirish kerak. Buning eng oddiy yo'li @Autowired, @Inject, @Resource yoki @PersistenceContext annotatsiyalaridan birini yordamida resursga bog'liqlikni kirgizishdir. Quyidagi misol JPA repozitoriyasiga nisbatan ishlaydi:

Java
@Repository
public class JpaMovieFinder implements MovieFinder {
    @PersistenceContext
    private EntityManager entityManager;
    // ...
}
Kotlin
@Repository
class JpaMovieFinder : MovieFinder {
    @PersistenceContext
    private lateinit var entityManager: EntityManager
    // ...
}

Agar klassik Hibernate API-lari ishlatilsa, SessionFactory'ni quyidagi misolda ko'rsatilganidek kirgizish mumkin:

Java
@Repository
public class HibernateMovieFinder implements MovieFinder {
    private SessionFactory sessionFactory;
    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    // ...
}
Kotlin
@Repository
class HibernateMovieFinder(private val sessionFactory: SessionFactory) : MovieFinder {
    // ...
}

So'nggi misol, biz tipik JDBC qo'llab-quvvatlash vositasiga tegishli. DataSource ini ob'ekt yaratish yoki konstruktor orqali kirgizish mumkin, bu yerda siz JdbcTemplate va boshqa ma'lumotlarga kirish qo'llab-quvvatlash sinflarini (masalan, SimpleJdbcCall va boshqalar), ushbu DataSource dan foydalanib, yaratasiz. Quyidagi misolda DataSource avtomatik ravishda topiladi va bog'lanadi:

Java
@Repository
public class JdbcMovieFinder implements MovieFinder {
    private JdbcTemplate jdbcTemplate;
    @Autowired
    public void init(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    // ...
}
Kotlin
@Repository
class JdbcMovieFinder(dataSource: DataSource) : MovieFinder {
    private val jdbcTemplate = JdbcTemplate(dataSource)
    // ...
}
Ushbu annotatsiyalar afzalliklaridan foydalanish uchun ilova kontekstini qanday sozlash haqida qo'shimcha ma'lumot olish uchun doimiy saqlash texnologiyalarining har biriga oid maxsus tavsiflarga qarang.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION