JavaRush /Java блогу /Random-KY /Maven, Spring, MySQL, Hibernate жана биринчи CRUD тиркеме...
Макс
Деңгээл

Maven, Spring, MySQL, Hibernate жана биринчи CRUD тиркемесине киришүү (3-бөлүк)

Группада жарыяланган
Кутмандуу күнүң менен. Бул макалада мен жөнөкөй CRUD тиркемесин түзүү процессинде Maven, Spring, Hibernate, MySQL жана Tomcat сыяктуу нерселер менен болгон биринчи жолугушуум менен бөлүшкүм келет. Бул 4-бөлүмүнүн үчүнчү бөлүгү. Макала биринчи кезекте бул жерде 30-40 деңгээлди бүтүргөн, бирок таза Java тилкесинин чегинен чыга элек жана ачык дүйнөгө кирүү үчүн жаңыдан баштаган (же баштайын деп жаткан) үчүн арналган. бардык бул технологиялар, алHowтар ​​жана башка бейтааныш сөздөр. Maven, Spring, MySQL, Hibernate жана биринчи CRUD колдонмосуна киришүү (3-бөлүк) - 1Бул макаланын үчүнчү бөлүгү "Maven, Spring, MySQL, Hibernate жана биринчи CRUD колдонмосуна киришүү." Мурунку бөлүктөрдү төмөнкү шилтемелер аркылуу көрүүгө болот:

Мазмуну:

Маалымат базасын түзүү жана туташтыруу

Ооба, маалымат базасында иштөөгө убакыт жетти. Гибернатты туташтыруудан жана ал жерде баары кантип иштеши керектиги жөнүндө ойлонуудан мурун, адегенде маалымат базасынын өзүн карап көрөлү, б.а. Аны жаратып, бириктирип, жасап, белгини толтуралы. Биз DBMS (Database Management System) MySQL колдонобуз (албетте, алгач жүктөп алып, орнотуу керек). SQL (Structured Query Language) – реляциялык маалымат базасында маалыматтарды түзүү, өзгөртүү жана манипуляциялоо үчүн колдонулган декларативдик программалоо тor. Мындай маалымат базаларында маалыматтар table түрүндө сакталат. Колдонмо маалымат базасы менен кантип байланышат (SQL сурамдарын маалымат базасына өткөрүп берүү жана натыйжаларды кайтаруу). Бул үчүн Java-да JDBC (Java DataBase Connectivity) сыяктуу нерсе бар , ал жөнөкөй тил менен айтканда, маалымат базалары менен иштөө үчүн интерфейстердин жана класстардын жыйындысы. Берorштер базасы менен иштешүү үчүн сиз байланыш түзүшүңүз керек, бул үчүн пакетте java.sqlкласс бар Connection. Байланышты орнотуунун бир нече жолу бар, мисалы getConnectionкласс ыкмасын колдонсоңуз болот DriverManager. Бирок маалымат базасы менен өз ара аракеттенүү түздөн-түз жүргүзүлбөйт, анткени маалымат базалары көп жана алар ар түрдүү. Ошентип, алардын ар бири үчүн өзүнүн JDBC драйвери бар.Бул драйверди колдонуу менен маалымат базасына байланыш түзүлөт. Ошондуктан, биринчи кезекте, кийинчерээк бул нерсеге алаксып калбоо үчүн, MySQL драйверин орнотуп алалы . Төмөнкү көз карандылыкты кошолу pom.xml:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
Эми базаны түзөлү. Көрүү -> Курал Windows -> Маалыматтар базасы - маалымат базасы панели ачылат. Жаңы (жашыл +) -> Маалымат булагы -> MySQL - терезе ачылат, анда колдонуучу атын жана паролду көрсөтүү керек, биз аларды MySQLди орнотуп жатканда орноттук (мисалы, мен root жана root колдондум). Порт (MySQL 3306 үчүн демейки), аты ж.б. ошол бойдон калтыр. Сиз байланышты " Test Connection " баскычын колдонуп текшере аласыз. OKMaven, Spring, MySQL, Hibernate жана биринчи CRUD колдонмосуна киришүү (3-бөлүк) - 2 баскычын чыкылдатыңыз жана азыр биз MySQL serverине туташтырдык. Андан кийин, маалымат базасын түзөлү. Бул үчүн, сиз ачылган консолдо сценарий жаза аласыз:
CREATE DATABASE test
"Аткаруу" баскычын чыкылдатыңыз жана маалымат базасы даяр, эми аны туташтырсаңыз болот.Бул үчүн, Берorштер булагынын касиеттерине кайтып барыңыз жана Берorштер базасы талаасына маалымат базасынын атын (тест) киргизиңиз, андан кийин колдонуучунун атын жана паролду кайра киргизиңиз жана "ОК" баскычын басыңыз. Эми үстөлдү жасашыбыз керек. Сиз графикалык куралдарды колдонсоңуз болот, бирок биринчи жолу анын кандай экенин көрүү үчүн скриптти кол менен жазуу керек:
USE test;

CREATE TABLE films
(
  id int(10) PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  year int(4),
  genre VARCHAR(20),
  watched BIT DEFAULT false  NOT NULL
)
COLLATE='utf8_general_ci';
CREATE UNIQUE INDEX films_title_uindex ON films (title);

INSERT INTO `films` (`title`,`year`,`genre`, watched)
VALUES
  ("Inception", 2010, "sci-fi", 1),
  ("The Lord of the Rings: The Fellowship of the Ring", 2001, "fantasy", 1),
  ("Tag", 2018, "comedy", 0),
  ("Gunfight at the O.K. Corral", 1957, "western", 0),
  ("Die Hard", 1988, "action", 1);
filmsТаблица мамычалар менен аты менен түзүлөт id, titleж.б. Ар бир тилке үчүн түрү көрсөтүлөт (кашадагы эң жогорку чыгаруу өлчөмү).
  • PRIMARY KEY- бул tableдагы жазууну уникалдуу аныктоо үчүн колдонулган негизги ачкыч (бул уникалдуулукту билдирет)
  • AUTO_INCREMENT— маани автоматтык түрдө түзүлөт (албетте, нөл эмес, андыктан муну көрсөтүүнүн кереги жок)
  • NOT NULL- Бул жерде да баары ачык көрүнүп турат, бош болушу мүмкүн эмес
  • DEFAULT— демейки маанини коюу
  • COLLATE- codeдоо
  • CREATE UNIQUE INDEX— талааны уникалдуу кылуу
  • INSERT INTO— tableга жазуу кошуу
Натыйжа мындай белги: Балким, биздин веб-тиркемеден өзүнчө, азыр эле ага туташууга аракет кылуу керек. Бул менен кандайдыр бир көйгөйлөр пайда болсо, анда биз дароо чечебиз. Болбосо, кийинчерээк биз Күтүү режимин туташтырабыз , бир нерсе жасайбыз, конфигурациялайбыз, кылдаттык менен жасайбыз жана эгер биз бир жерде баш аламандык кылсак, анда жок дегенде көйгөй бул жерде эмес экенин билебиз. Ооба, байланышты текшерүү үчүн, келгиле, mainубактылуу ыкманы түзөлү. Негизи, сиз аны каалаган жерге кое аласыз, атүгүл контроллер классында, ал тургай моделде же конфигурацияда да, эч кандай мааниге ээ эмес, сиз жөн гана туташууда баары жакшы экенине ынануу үчүн аны колдонушуңуз керек жана аны жок кыла аласыз. Бирок этият болуу үчүн, ал үчүн өзүнчө класс түзөлү Main:
package testgroup.filmography;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "root";
        System.out.println("Connecting...");

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            System.out.println("Connection successful!");
        } catch (SQLException e) {
            System.out.println("Connection failed!");
            e.printStackTrace();
        }
    }
}
Бул жерде баары жөнөкөй, биз маалымат базасына байланыш параметрлерин коюп, байланыш түзүүгө аракет кылабыз. Келгиле, муну ишке киргизип main, карап көрөлү. Ошентип, менде өзгөчөлүк, убакыт алкагындагы көйгөйлөр жана SSL жөнүндө башка эскертүүлөр бар. Интернетти карап чыккандан кийин, бул өтө кеңири таралган көйгөй экенин биле аласыз жана драйвердин ар кандай versionларын (mysql-connector-java) колдонгондо, ал башкача ант бериши мүмкүн. Мисалы, мен эксперименталдык түрдө 5.1.47 versionсын колдонууда убакыт алкагынан эч кандай өзгөчөлүктөр жок экенин, туташуу кадимкидей түзүлгөнүн, бирок SSL эскертүүсү дагы эле пайда болоорун билдим. Кээ бир башка versionлар менен SSLге байланыштуу өзгөчөлүк бар окшойт, жөн гана эскертүү эмес. Макул, кеп анда эмес. Бул маселени өзүнчө чечүүгө аракет кылсаңыз болот, бирок биз азыр ага кирбейбиз. Мунун баары абдан жөнөкөй, сиз url дарегинде кошумча параметрлерди көрсөтүшүңүз керек , атап айтканда serverTimezone, эгер көйгөй саат алкагында болсо жана useSSLкөйгөй SSLде болсо:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
Азыр биз убакыт алкагын койдук жана SSL өчүрүлдү. Биз аны кайра ишке киргизебиз mainжана voila - Туташуу ийгorктүү болду! Ооба, сонун, биз байланышты кантип түзүүнү чечтик. Класс Mainнегизинен тапшырмасын аткарды, сиз аны өчүрө аласыз.

ORM жана JPA

Жакшы сөз менен айтканда, жакшыраак түшүнүү үчүн, эч кандай күтүү жана башка нерселерсиз, эң башынан бери маалымат базалары менен тааныша баштаганыңыз жакшы. Ошондуктан, кээ бир гиддерди таап, алгач JDBC класстары менен иштөөгө аракет кылуу, SQL сурамдарын кол менен жазуу жана башкалар жакшы болмок. Келгиле, дароо ORM моделине өтөбүз . Бул эмнени түшүндүрөт? Албетте, бул жөнүндө өзүнчө окуу дагы жөндүү, бирок мен аны кыскача сүрөттөп берүүгө аракет кылам. ORM (Object-Relational Mapping or object-relational mapping) – an objectтерди реляциялык маалыматтар базасынын структураларына түшүрүү технологиясы, б.а. биздин Java an objectибизди table катары көрсөтүү үчүн. ORM аркасында сиз SQL скрипттерин жазуу жөнүндө кабатырланбайсыз жана an objectтер менен иштөөгө көңүл бурбайсыз. Аны кантип колдонуу керек. Java дагы бир сонун нерсеге ээ, JPA (Java Persistence API), ал ORM концепциясын ишке ашырат. JPA мындай спецификация; ал an objectтерге болгон талаптарды сүрөттөйт, маалымат базасы менен иштөө үчүн ар кандай интерфейстерди жана annotationларды аныктайт. JPA негизинен сүрөттөмө, стандарт болуп саналат. Ошондуктан, көптөгөн конкреттүү ишке ашыруулар бар, алардын бири (жана эң популярдууларынын бири) бул алHowтын маңызы болгон Hibernate. Hibernate - бул JPA спецификациясынын ишке ашырылышы, an object менен байланыштык карта түзүү (ORM) көйгөйлөрүн чечүү үчүн иштелип чыккан. Биз мунун баарын биздин долбоорго байланыштырышыбыз керек. Мындан тышкары, биздин Жаз четте турбашы үчүн жана ошондой эле маалымат базалары менен бул кыймылга катышпаш үчүн, биз дагы бир нече модулдарды туташтырышыбыз керек, анткени яз-webmvc гарашлылыгындан алнан затларыц хеммеси мунун учин инди етерлик дэл. Бизге маалымат базасы менен иштөө үчүн spring-jdbc , транзакцияларды колдоо үчүн spring-tx жана Hibernate менен иштөө үчүн spring-orm керек болот . Төмөнкүгө көз карандылыктарды кошолу pom.xml:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.1.1.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.3.7.Final</version>
</dependency>
Бул эки көз карандылык жетиштүү. hibernate-corejavax.persistence-api менен бирге келет , жана жаз-jdbc жана жаз-tx жаз-orm менен бирге келет .

Объект

Ошентип, биз класс an objectилери Filmмаалымат базасында сакталышын каалайбыз. Бул үчүн класс бир катар шарттарды канааттандырышы керек. JPAда бул үчүн субъект сыяктуу нерсе бар . Объект классы - бул кадимки POJO классы, алар үчүн жеке талаалары жана алуучулары жана орнотуучулары бар. Анын параметрлери жок жеке эмес конструктор (же демейки конструктор) болушу керек жана анын негизги ачкычы болушу керек, б.а. маалымат базасында бул класстын ар бир жазуусун уникалдуу аныктай турган нерсе. Ошондой эле, мындай класстын бардык талаптары жөнүндө өзүнчө окуй аласыз. Келгиле, классыбызды FilmJPA annotationларын колдонуп an object кылалы:
package testgroup.filmography.model;

import javax.persistence.*;

@Entity
@Table(name = "films")
public class Film {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "title")
    private String title;

    @Column(name = "year")
    private int year;

    @Column(name = "genre")
    private String genre;

    @Column(name = "watched")
    private boolean watched;

    // + getters and setters
}
  • @Entity- бул класс субъект экенин көрсөтөт.
  • @Table- бул an objectти көрсөтүү үчүн белгилүү бир tableга көрсөтөт.
  • @Id— бул талаанын негизги ачкыч экенин көрсөтөт, б.а. бул касиет ар бир уникалдуу жазууну аныктоо үчүн колдонулат.
  • @Column— талааны table мамычасына бириктирет. Эгер талаа жана table тилкелеринин аталыштары бирдей болсо, аларды өткөрүп жиберсеңиз болот.
  • @GeneratedValue— касиет автоматтык түрдө түзүлөт, кашаанын ичинде кантип көрсөтө аласыз. Биз азыр так ар кандай стратегиялар кантип иштээрин түшүнө албайбыз. Бул учурда ар бир жаңы маани мурункусунан 1ге көбөйөрүн билүү жетиштүү.
Ар бир менчик үчүн, сиз кошумча башка көптөгөн нерселерди белгилей аласыз, мисалы, нөл эмес же уникалдуу болушу керек, демейки маанини, максималдуу өлчөмүн ж.б. Бул класстын негизинде table түзүү керек болсо, бул пайдалуу болот; Күтүү режиминде бул параметр бар. Бирок биз tableны өзүбүз түзүп, бардык касиеттерин конфигурациялаганбыз, ансыз деле жасай алабыз. Кичинекей эскертүү.Hibernate documentтери annotationларды талааларда эмес, алуучуларда колдонууну сунуштайт. Бирок, бул ыкмалардын ортосундагы айырма абдан тымызын жана биздин жөнөкөй колдонууда бул эч кандай таасир тийгизбейт. Мындан тышкары, көпчүлүк адамдар annotationларды талаалардын үстүнө коюшат. Ошондуктан, мындай калтыралы, тыкан көрүнөт.

Күтүү касиеттери

Келиңиз, Күтүү режимибизди орнотуп баштайлы. Биринчиден, логин жана пароль, url жана башка бир нерселерди өзүнчө файлга салалы. Сиз, албетте, аларды класста кадимки сызык катары көрсөтсөңүз болот, биз байланышты текшергенибиздей ( String username = "root";андан кийин аны байланышты түзүү ыкмасына өткөрүп бергенбиз). Бирок мындай статикалык маалыматтарды кандайдыр бир файлда сактоо дагы туура property. Ал эми, мисалы, маалымат базасын өзгөртүү керек болсо, анда бардык класстарды карап чыгып, анын кайда колдонуларын издөөнүн кереги жок, бул файлдагы маанини бир жолу өзгөртүү жетиштүү болот. Келгиле, ресурстар каталогунда db.properties файлын түзөлү :
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false
jdbc.username=root
jdbc.password=root

hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
hibernate.show_sql=true
Ооба, бардыгы жогорудан түшүнүктүү, маалымат базасына туташуу үчүн параметрлер, б.а. айдоочу классынын аты, url, колдонуучунун аты жана сырсөз. hibernate.dialect- бул касиет Hibernate үчүн SQL тorнин кайсы versionсы колдонулганын көрсөтүү үчүн керек. Чындыгында, ар бир DBMS, мүмкүнчүлүктөрдү кеңейтүү, кандайдыр бир функцияларды кошуу же бир нерсени оптималдаштыруу үчүн, адатта, тилди бир аз модернизациялашат. Натыйжада, ар бир DBMS өзүнүн SQL диалектиси бар экени белгилүү болду. Бул англис тorндегидей, бул тил бирдей окшойт, бирок Австралияда, АКШда же Британияда ал бир аз башкача болот жана кээ бир сөздөр ар кандай мааниге ээ болушу мүмкүн. Жана түшүнүү менен кандайдыр бир көйгөйлөрдү болтурбоо үчүн, сиз Hibernate'ге так эмне менен күрөшүүгө туура келерин түз айтышыңыз керек. hibernate.show_sql— бул касиеттин аркасында маалымат базасына суроо консолдо көрсөтүлөт. Бул зарыл эмес, бирок бул нерсе менен сиз жок дегенде эмне болуп жатканын карап көрсөңүз болот, антпесе Hibernate кандайдыр бир сыйкырчылык кылып жаткандай сезorши мүмкүн. Албетте, аны көрсөтүү үчүн такыр түшүнүксүз болот; бул үчүн кандайдыр бир логгерди колдонгон жакшы, бирок бул башка учур, азыр ал жасайт.

Күтүү конфигурациясы

Конфигурацияны орнотууга өтөлү. Пакетте configкласс түзөлү HibernateConfig:
package testgroup.filmography.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@ComponentScan(basePackages = " testgroup.filmography")
@EnableTransactionManagement
@PropertySource(value = "classpath:db.properties")
public class HibernateConfig {
    private Environment environment;

    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        return properties;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("testgroup.filmography.model");
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }
}
Бул жерде бир топ жаңы нерселер бар, андыктан ар бир пункт боюнча маалыматты ар кандай булактардан издегениңиз жакшы. Келгиле, бул жерде кыскача токтоло кетели.
  • Класс жасаганыбызда @Configurationбуга чейин түшүнгөнбүз .@ComponentScanWebConfig
  • @EnableTransactionManagement— транзакцияларды башкаруу үчүн пайдаланууга мүмкүндүк берет TransactionManager. Hibernate транзакцияларды колдонуу менен маалымат базасы менен иштейт; алар бир бүтүн катары аткарылуучу операциялардын белгилүү бир топтому үчүн керек, б.а. эгерде методдо кандайдыр бир операцияда көйгөйлөр бар болсо, анда калгандарынын баары аткарылbyte, андыктан бул классикалык мисалдагыдай болуп, бир эсептен акча алуу операциясы аяктаганда, бирок башкага жазуу операциясы иштебей, натыйжада акча жок болуп кеткен.
  • @PropertySource— биз жакында түзгөн касиеттер файлын туташтыруу.
  • Environmentproperty- файлдан касиеттерди алуу үчүн .
  • hibernateProperties- бул ыкма Hibernate касиеттерин Properties an objectи катары көрсөтүү үчүн керек
  • DataSource— маалымат базасына байланыш түзүү үчүн колдонулат. Бул DriverManagerге альтернатива болуп саналат , аны биз мурда биз жаратканда колдонгон main. Документте DataSourceаны колдонуу артыкчылыгы айтылган. Бул биз эмне кылабыз, албетте, Интернеттен айырмасы жана артыкчылыктары эмнеде экенин окууну унутпайбыз. Айрыкча, бир артыкчылыгы - маалымат базасын туташтыруу бассейнин (DBCP) түзүү.
  • sessionFactory— сессияларды түзүүгө, анын жардамы менен субъекттин an objectтери менен операциялар жүргүзүлөт. Бул жерде биз маалымат булагын, күтүү касиеттерин жана an object класстарын кайсы пакеттен издешибиз керектигин белгилейбиз.
  • transactionManager— транзакция менеджерин конфигурациялоо.
жөнүндө кичинекей эскертүү DataSource. Документте стандарттык ишке ашырууну колдонуу DriverManagerDataSourceсунушталbyte, анткени бул кадимки туташууларды бириктирүү үчүн гана алмаштыруу жана жалпысынан тесттер жана ушул сыяктуулар үчүн гана ылайыктуу. Кадимки колдонмо үчүн DBCP китепканасынын кандайдыр бир түрүн колдонуу артык. Ооба, биздин колдонуу үчүн, албетте, бизде бар нерсе жетиштүү, бирок сүрөттү аягына чыгаруу үчүн, балким, биз дагы эле кеңеш бергендей башка ишке ашырууну колдонобуз. Төмөнкү көз карандылыкты кошолу pom.xml:
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
Ал эми dataSourceкласстык методдо HibernateConfigбиз аны пакеттеги бирине DriverManagerDataSourceалмаштырабыз : BasicDataSourceorg.apache.tomcat.dbcp.dbcp2
BasicDataSource dataSource = new BasicDataSource();
Баары даяр окшойт, конфигурация даяр, болгону аны AppInitializer га кошуу гана калды :
protected Class<?>[] getRootConfigClasses() {
        return new Class[]{HibernateConfig.class};
    }

Маалыматтарга кирүү катмары

Акыры биздин DAO менен баштоого убакыт келди. Биз класска барабыз FilmDAOImplжана биринчи кезекте ал жерден сыноо тизмесин өчүрөбүз, бизге кереги жок. Сеанс фабрикасын кошуп алалы.
private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
Баштоо үчүн, биз тасмалардын тизмеси бар баракты көрсөтүү ыкмасын түзөбүз, анда биз сессияны кабыл алабыз жана маалымат базасына суроо-талап кылабыз (бардык жазууларды чыгарып, тизмени түзүү):
public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }
Бул жерде 2 упай бар. Биринчиден, эскертүү көрсөтүлдү. Бул параметрди алгыбыз келгендигине байланыштуу List<Film>, бирок ыкма жөн гана кайтып келет List, анткени компиляция убагында сурамдын кайсы түрү кайтып келери белгисиз. Демек, бул идея кооптуу конversion жасап жатканыбызды эскертет, бул көйгөйгө алып келиши мүмкүн. Мындай суроо пайда болбошу үчүн муну жасоонун дагы бир нече туура жолдору бар. Интернеттен маалымат издесеңиз болот. Бирок муну менен азыр убара болбойлу. Чындыгында, биз кайсы түрдү кайтарып берерин так билебиз, андыктан бул жерде эч кандай көйгөйлөр болбойт, сиз жөн гана эскертүүгө көңүл бурбай койсоңуз болот. Бирок, көзүңүз ооруп калбашы үчүн, ыкманын үстүнө annotationны orп койсоңуз болот @SupressWarning("unchecked"). Муну менен биз компиляторго айтабыз, досум, тынчсызданганыңыз үчүн рахмат, бирок мен эмне кылып жатканымды билем жана бардыгын көзөмөлдөп турам, ошондуктан сиз эс алып, бул ыкма жөнүндө кабатыр болбоңуз. Экинчиден, идеянын асты кызыл " from Film" менен сызылган. Бул жөн гана HQL (Hibernate Query Language) суроосу жана идея баары туурабы же ката барбы түшүнбөйт. Сиз идея жөндөөлөрүнө өтүп, баарын кол менен тууралай аласыз (кызыктуу болсо Интернеттен караңыз). Же сиз жөн гана Күтүү алкагына колдоо кошо аласыз, бул үчүн долбоорду оң баскыч менен чыкылдатып, алHowтык колдоону кошууну тандаңыз, күтүү үчүн кутучаны белгилеңиз жана OK басыңыз. Андан кийин, кыязы, an object классында ( Film) көп нерселердин асты кызыл түс менен сызылат, мисалы, annotation "тасмаларды" чече алbyte деген@Table(name = "films") эскертүү берет . Дагы бир жолу, бул жерде эч кандай ката жок, бул дизайн катасы эмес, бардыгы түзүлөт жана иштейт. Идея биздин база жөнүндө эч нерсе билбегендиктен баса белгиленет. Муну оңдоо үчүн идеяны маалымат базасы менен бириктирели. Көрүү -> Курал Windows -> Persistense (өтмөк ачылат) -> чычкандын оң баскычы, Маалымат булагында Маалымат булактарын дайындоо -> тандаңыз , маалымат базасына туташууну белгилеңиз жана OK басыңыз . Мунун баары оңдолгондо дагы бир нерсе калды. Андан да жогорку деңгээлге, кызматка чыгалы. Класста биз жазгы ыкманы annotation менен белгилейбиз , ал ыкма транзакцияда аткарылышы керек экенин көрсөтөт (ансыз Hibernate иштөөдөн баш тартат): Maven, Spring, MySQL, Hibernate жана биринчи CRUD тиркемелерине киришүү (3-бөлүк) - 3FilmServiceImplallFilms@Transactional
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
Ошентип, бул жерде баары даяр, контроллерде эч нерсеге тийүүнүн кереги жок. Ооба, чындыктын учуру келди окшойт, Run чыкылдатып , эмне болгонун көрүңүз. Maven, Spring, MySQL, Hibernate жана биринчи CRUD колдонмосуна киришүү (3-бөлүк) - 4Мына, бул биздин белги, жана бул жолу биз класста өзүбүз түзгөн тизмеден эмес, маалымат базасынан алынды. Жакшы, баары иштеп жатат окшойт. Эми биз башка бардык CRUD операцияларын сеанс ыкмаларын колдонуу менен жасайбыз. Натыйжада класс төмөнкүдөй көрүнөт:
package testgroup.filmography.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import testgroup.filmography.model.Film;

import java.util.List;

@Repository
public class FilmDAOImpl implements FilmDAO {
    private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }

    @Override
    public void add(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.persist(film);
    }

    @Override
    public void delete(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.delete(film);
    }

    @Override
    public void edit(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.update(film);
    }

    @Override
    public Film getById(int id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Film.class, id);
    }
}
Эми кызматка барууну жана ыкмаларга annotation кошууну унутпаңыз @Transactional. Болду, даяр. Сиз азыр чуркап, текшере аласыз. Шилтемелерди жана баскычтарды чыкылдатыңыз, жазууларды кошууга/жок кылууга/түзөтүүгө аракет кылыңыз. Эгер баары туура жасалган болсо, ал иштеши керек. Эми бул Hibernate, Spring, MySQL колдонгон толук кандуу CRUD тиркемеси. Улантылуу... Maven, Spring, MySQL, Hibernate жана биринчи CRUD тиркемесин тааныштыруу (1-бөлүк) Maven, Spring, MySQL, Hibernate жана биринчи CRUD тиркемесин тааныштыруу (2-бөлүк) Maven, Spring, MySQL, Hibernate жана биринчи CRUD тиркемеси (3-бөлүк) Maven, Spring, MySQL, Hibernate жана биринчи CRUD колдонмосуна киришүү (4-бөлүк)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION