JavaRush /Курстар /All lectures for KY purposes /Spring жана Data Access Object (DAO)

Spring жана Data Access Object (DAO)

All lectures for KY purposes
Деңгээл , Сабак
жеткиликтүү

Spring'деги маалыматка жетүү объектине (Data Access Object/DAO) колдоо көрсөтүү маалыматка жетүү технологиялары менен иштөөнү жеңилдетүүгө багытталган (мисалы, JDBC, Hibernate же JPA). Бул туруктуу сактоо технологияларынын арасында оңой которулууга мүмкүндүк берет жана ар бир технологияга мүнөздүү болгон ката кармоого кабатыр болуунун кереги жок.

Каталардын бирдей иерархиясы

Spring технологияга мүнөздүү каталардан, мисалы SQLException сыяктуу, өзүңдүн каталар иерархиясына өтүү мүмкүнчүлүгүн берет, мында негизги ката DataAccessException болуп эсептелет. Бул каталар баштапкы катаны оройт, ошондуктан кайсы бир маалыматты жоготуп алуу коркунучу жок.

JDBC каталарына кошумча, Spring JPA жана Hibernate өзгөчө каталарын дагы ороп, аларды уюшулган каталар топтомуна өзгөртө алат. Бул туруктуу сактоо калыбына келтирилгис каталарын тиешелүү деңгээлдерде гана иштеп чыгууга мүмкүндүк берет, "catch-and-throw" стереотиптүү блокторуна кайрылбастан жана DAO'нузда каталарды жарыялоодон качууга жардам берет. (Бирок, сиз каалаган жерде каталарды кармап жана иштеп чыгууга дагы да болот). Жогоруда айтылгандай, JDBC каталары (маалымат базасына мүнөздүү диалекттерди кошкондо) дагы ошол эле иерархияга айландырылат, демек, сиз JDBC боюнча бир нече операцияларды бирдей программалоо моделинде ишке ашыра аласыз.

Өткөн түшүндүрмө ар түрдүү ORM фреймворкторундагы Spring колдоо куралдарындагы класстарга дагы тиешелүү. Эгерде сиз перехватчи класстарын колдонсоңуз, колдонмо HibernateExceptions жана PersistenceExceptions иштеп чыгуу менен өзү алектенет, аны SessionFactoryUtils утилитасынын convertHibernateAccessException(..) же convertJpaAccessException(..) методдоруна тапшырган артык. Бул ыкмалар каталарды org.springframework.dao каталар иерархиясына шайкеш келген каталарга айландырат. PersistenceExceptions текшерилбегендиктен, алар дагы да генерацияланышы мүмкүн (мында, чындыгында, DAO каталар типтештирилген абстракциясынан курмандык чалуу болот).

Кийинки сүрөттө Spring сунуш кылган каталардын иерархиясы көрсөтүлгөн. (Сүрөттө көрсөтүлгөн класстар иерархиясы DataAccessException иерархиясынын бир гана бөлүгүн көрсөтөт).

DAO класс же репозиторийлердин конфигурациясы үчүн колдонулуучу аннотациялар

Объекттериңиздин (DAO) же репозиторийлериңиздин каталарды трансляциялоосун камсыз кылуунун эң жакшы жолу @Repository аннотациясын колдонуу. Бул аннотация компоненттерди сканерлөө колдоо куралдарыңыз DAO жана репозиторийлериңизди табууга жана конфигурациялоого XML конфигурация жазууларысыз мүмкүндүк берет. Төмөнкү мисалда @Repository аннотациясын колдонуу көрсөтүлгөн:

Java
@Repository 
public class SomeMovieFinder implements MovieFinder {
    // ...
}
  1. @Repository аннотациясы.
Kotlin
@Repository 
class SomeMovieFinder : MovieFinder {
    // ...
}
  1. @Repository аннотациясы.

DAO же репозиторийдин каалаган имплементациясына туруктуу сактоо ресурсуна жетүү талап кылынат, колдонулган туруктуу сактоо технологиясына жараша. Мисалы, JDBC негизиндеги репозиторийге JDBC'деги DataSource'го жетүү талап кылынат, ал эми JPA негизиндеги сактоочуга EntityManager'ге. Бул жетишүү үчүн эң жөнөкөй жолу @Autowired, @Inject, @Resource же @PersistenceContext аннотацияларынын бирин колдонуу менен ресурстун көз карандысын инъекция кылуу. Төмөнкү мисал JPA репозиторийине байланыштуу иштейт:

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

Эгерде классикалык Hibernate API интерфейстерин колдонсоңуз, SessionFactory инъекция кылса болот, төмөнкү мисалда көрсөтүлгөндөй:

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 {
    // ...
}

Акыркы мисал типтүү JDBC колдоо куралына тиешелүү. DataSource инициализация методуна же конструкторго инъекция кылына алат, анда сиз JdbcTemplate жана башка маалыматка жетүү колдоо класстарын (мисалы, SimpleJdbcCall ж.б.) түзөсүз, бул DataSource'ту колдонуу менен. Төмөнкү мисалда DataSource'ту автоматтык түрдө табуу жана байланыш жасоо:

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)
    // ...
}
Бул аннотациялардын артыкчылыктарын колдонуу үчүн колдонмо контекстин кантип конфигурациялоо керектиги боюнча толук маалыматка туруктуу сактоо технологиясынын ар биринин өзгөчө сүрөттөмөсүн караңыз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION