JavaRush /Java Blogu /Random-AZ /Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə gir...
Макс
Səviyyə

Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (3-cü hissə)

Qrupda dərc edilmişdir
Günortanız Xeyir. Bu yazıda sadə CRUD tətbiqi yaratma prosesində Maven, Spring, Hibernate, MySQL və Tomcat kimi şeylərlə ilk tanışlığımı bölüşmək istərdim. Bu, 4-cü hissənin üçüncü hissəsidir. Məqalə ilk növbədə burada 30-40 səviyyəni tamamlamış, lakin hələ təmiz Java-dan kənara çıxmamış və açıq dünyaya yeni başlayanlar (və ya başlamaq üzrə olanlar) üçün nəzərdə tutulub. bütün bu texnologiyalar, çərçivələr və digər tanış olmayan sözlər. Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (3-cü hissə) - 1Bu, "Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş" məqaləsinin üçüncü hissəsidir. Əvvəlki hissələrə aşağıdakı linklərdən baxmaq olar:

Məzmun:

Verilənlər bazasının yaradılması və qoşulması

Yaxşı, verilənlər bazası üzərində işə başlamağın vaxtı gəldi. Hibernate- ə qoşulmadan və orada hamısının necə işləməsi barədə düşünmədən əvvəl əvvəlcə verilənlər bazasının özünə baxaq, yəni. Onu yaradaq, birləşdirək, düzəldək və işarəni dolduraq. Biz DBMS (Verilənlər Bazasının İdarəetmə Sistemi) MySQL-dən istifadə edəcəyik (əlbəttə ki, ilk öncə yükləməlisiniz və quraşdırmalısınız). SQL (Structured Query Language) relational verilənlər bazasında verilənlərin yaradılması, dəyişdirilməsi və manipulyasiyası üçün istifadə olunan deklarativ proqramlaşdırma dilidir. Belə verilənlər bazalarında verilənlər cədvəllər şəklində saxlanılır. Tətbiq verilənlər bazası ilə necə əlaqə qurur (SQL sorğularının verilənlər bazasına ötürülməsi və nəticələrin qaytarılması). Bunun üçün Java-da JDBC (Java DataBase Connectivity) kimi bir şey var ki, bu da sadəcə olaraq verilənlər bazası ilə işləmək üçün interfeyslər və siniflər toplusudur. Verilənlər bazası ilə qarşılıqlı əlaqə yaratmaq üçün bir əlaqə yaratmalısınız, bunun üçün paketdə java.sqlbir sinif var Connection. Bağlantı qurmağın bir neçə yolu var, məsələn, getConnectionsinif metodundan istifadə edə bilərsiniz DriverManager. Bununla belə, verilənlər bazası ilə qarşılıqlı əlaqə birbaşa həyata keçirilmir, çünki çoxlu verilənlər bazası var və onlar müxtəlifdir. Belə ki, onların hər biri üçün öz JDBC Driver var.Bu drayverdən istifadə etməklə verilənlər bazası ilə əlaqə qurulur. Buna görə də, bundan sonra diqqətinizi yayındırmamaq üçün ilk növbədə MySQL sürücüsünü quraşdıraq . Aşağıdakı asılılığı əlavə edək pom.xml:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
İndi verilənlər bazasını yaradaq. View -> Tool Windows -> Database - verilənlər bazası paneli açılacaq. Yeni (yaşıl +) -> Məlumat Mənbəsi -> MySQL - istifadəçi adı və şifrənizi göstərməyiniz lazım olan bir pəncərə açılacaq, biz onları MySQL quraşdırarkən təyin edirik (məsələn, kök və kökdən istifadə etdim). Port (MySQL 3306 üçün standart), ad və s. olduğu kimi buraxın. " Bağlantı testi " düyməsini istifadə edərək əlaqəni yoxlaya bilərsiniz . OKMaven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (3-cü hissə) - 2 düyməsini basın və indi MySQL serverinə qoşulmuşuq. Sonra verilənlər bazası yaradaq. Bunu etmək üçün, açılan konsolda bir skript yaza bilərsiniz:
CREATE DATABASE test
Execute düyməsini sıxın və verilənlər bazası hazırdır, indi siz onu qoşa bilərsiniz.Bunun üçün Data Source Properties-ə qayıdın və Database sahəsinə verilənlər bazası adını (test) daxil edin, sonra istifadəçi adı və parolu yenidən daxil edin və OK düyməsini sıxın. İndi bir masa düzəltməliyik. Qrafik vasitələrdən istifadə edə bilərsiniz, lakin ilk dəfədir ki, onun necə göründüyünü görmək üçün əl ilə skript yazmağa dəyər:
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);
filmsSütunlu adla cədvəl yaradılır və s id. titleHər bir sütun üçün növ göstərilir (mötərizədə maksimum çıxış ölçüsü).
  • PRIMARY KEY- bu, cədvəldəki qeydi unikal şəkildə müəyyən etmək üçün istifadə olunan əsas açardır (bu, unikallığı nəzərdə tutur)
  • AUTO_INCREMENT— dəyər avtomatik olaraq yaradılacaq (əlbəttə ki, sıfırdan fərqli olacaq, ona görə də bunu qeyd etmək lazım deyil)
  • NOT NULL- burada da hər şey göz qabağındadır, boş ola bilməz
  • DEFAULT— standart dəyəri təyin edin
  • COLLATE- kodlaşdırma
  • CREATE UNIQUE INDEX- sahəni unikal etmək
  • INSERT INTO— cədvələ qeyd əlavə edin
Nəticə belə bir işarədir: Bəlkə də veb tətbiqimizdən ayrı olaraq, hələlik ona qoşulmağa çalışmağa dəyər. Bəs bununla bağlı bəzi problemlər yaranarsa, dərhal həll edəcəyik. Əks təqdirdə, daha sonra Hibernate- ə qoşulacağıq , bir şey edəcəyik, konfiqurasiya edəcəyik, tənzimləyəcəyik və bir yerdə qarışıqlıq etsək, heç olmasa problemin burada olmadığını biləcəyik. Yaxşı, əlaqəni yoxlamaq üçün bir üsul yaradaq main, müvəqqəti. Prinsipcə, onu istənilən yerə qoya bilərsiniz, hətta nəzarətçi sinfində, hətta modeldə və ya konfiqurasiyada, fərqi yoxdur, sadəcə əlaqə ilə hər şeyin qaydasında olduğundan əmin olmaq üçün ondan istifadə etməlisiniz və onu silə bilərsiniz. Ancaq daha diqqətli olmaq üçün bunun üçün ayrıca bir sinif yaradaq 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();
        }
    }
}
Burada hər şey sadədir, əlaqə parametrlərini verilənlər bazamıza təyin edirik və əlaqə yaratmağa çalışırıq. Gəlin bunu işə salaq mainvə bir nəzər salaq. Beləliklə, bir istisna, bəzi vaxt qurşağı problemləri və SSL ilə bağlı başqa xəbərdarlıq aldım. İnternetə baxdıqdan sonra bunun kifayət qədər ümumi problem olduğunu öyrənə bilərsiniz və sürücünün müxtəlif versiyalarından (mysql-connector-java) istifadə edərkən, fərqli söyüşlər edə bilər. Məsələn, mən eksperimental olaraq öyrəndim ki, 5.1.47 versiyasından istifadə edərkən saat qurşağına görə heç bir istisna yoxdur, əlaqə normal yaradılır, lakin SSL xəbərdarlığı hələ də açılır. Bəzi digər versiyalarda SSL ilə bağlı yalnız bir xəbərdarlıq deyil, bir istisna olduğu görünürdü. Tamam, məsələ bu deyil. Siz bu məsələ ilə ayrıca məşğul olmağa cəhd edə bilərsiniz, lakin biz indi buna girməyəcəyik. Bunun həlli olduqca sadədir, url- də əlavə parametrləri göstərməlisiniz , yəni serverTimezoneproblem saat qurşağındadırsa və useSSLproblem SSL ilədirsə:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
İndi saat qurşağını təyin etdik və SSL-i söndürdük. Biz onu yenidən işə salırıq mainvə voila - Bağlantı uğurludur! Yaxşı, əla, əlaqə yaratmağın yollarını anladıq. Sinif Mainəsasən öz tapşırığını tamamladı, onu silə bilərsiniz.

ORM və JPA

Yaxşı mənada, daha yaxşı başa düşmək üçün, heç bir qışlama və digər şeylər olmadan əvvəldən verilənlər bazası ilə tanış olmağa başlamaq daha yaxşıdır. Ona görə də yaxşı olardı ki, bəzi bələdçilər tapıb əvvəlcə JDBC sinifləri ilə işləməyə, SQL sorğularını əl ilə yazmağa və s. Yaxşı, gəlin dərhal ORM modelinə keçək. Bu nə deməkdir? Əlbəttə ki, yenə də bu barədə ayrıca oxumaq məsləhətdir, amma qısaca təsvir etməyə çalışacağam. ORM (Object-Relational Mapping və ya obyekt-relational mapping) obyektlərin əlaqəli verilənlər bazası strukturlarına xəritələşdirilməsi texnologiyasıdır, yəni. Java obyektimizi cədvəl sırası kimi təqdim etmək. ORM sayəsində siz SQL skriptlərinin yazılması ilə bağlı narahat olmağa və diqqətinizi obyektlərlə işləməyə yönəltməyə ehtiyac yoxdur. Onu necə istifadə etmək olar. Javanın başqa bir əla xüsusiyyəti var, ORM konsepsiyasını həyata keçirən JPA (Java Persistence API). JPA belə bir spesifikasiyadır, obyektlərə olan tələbləri təsvir edir, verilənlər bazası ilə işləmək üçün müxtəlif interfeysləri və annotasiyaları müəyyən edir. JPA mahiyyətcə təsvir, standartdır. Buna görə də, bir çox xüsusi tətbiqlər var, onlardan biri (və ən populyarlarından biri) bu çərçivənin mahiyyəti olan Hibernate-dir. Hibernate, obyektlə əlaqəli xəritələşdirmə (ORM) problemlərini həll etmək üçün hazırlanmış JPA spesifikasiyasının tətbiqidir. Bütün bunları layihəmizə bağlamalıyıq. Bundan əlavə, Baharımızın kənarda dayanmaması və verilənlər bazası ilə bütün bu hərəkətdə iştirak etməsi üçün daha bir neçə modulu birləşdirməliyik, çünki Spring-webmvc asılılığından əldə etdiyimiz hər şey artıq bunun üçün kifayət deyil. Bizə həmçinin verilənlər bazası ilə işləmək üçün spring-jdbc , tranzaksiyaları dəstəkləmək üçün spring-tx və Hibernate ilə işləmək üçün spring-orm lazımdır . Aşağıdakılara asılılıqlar əlavə edək 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>
Bu iki asılılıq kifayətdir. hibernate-core , spring-jdbcspring-tx ilə birlikdə spring-ormjavax.persistence-api ilə birlikdə gələcək .

Müəssisə

Beləliklə, biz istəyirik ki, sinif obyektləri Filmverilənlər bazasında saxlanıla bilsin. Bunun üçün sinif bir sıra şərtləri yerinə yetirməlidir. JPA-da bunun üçün Müəssisə kimi bir şey var . Müəssisə sinfi adi POJO sinfidir, şəxsi sahələr və onlar üçün alıcı və təyinedicilər var. Parametrləri olmayan (və ya standart konstruktor) qeyri-şəxsi konstruktora malik olmalıdır və onun əsas açarı olmalıdır, yəni. verilənlər bazasında bu sinfin hər bir qeydini unikal şəkildə müəyyən edəcək bir şey. Belə bir sinif üçün bütün tələblər haqqında ayrıca oxuya bilərsiniz. Gəlin sinifimizi FilmJPA annotasiyalarından istifadə edən obyekt halına gətirək:
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- bu sinfin bir varlıq olduğunu göstərir.
  • @Table- bu obyekti göstərmək üçün xüsusi cədvələ işarə edir.
  • @Id— bu sahənin əsas açar olduğunu göstərir, yəni. bu əmlak hər bir unikal girişi müəyyən etmək üçün istifadə olunacaq.
  • @Column— sahəni cədvəl sütunu ilə əlaqələndirir. Sahə və cədvəl sütun adları eynidirsə, onları buraxa bilərsiniz.
  • @GeneratedValue— xüsusiyyət avtomatik olaraq yaradılacaq, mötərizədə necə olduğunu göstərə bilərsiniz. İndi fərqli strategiyaların necə işlədiyini başa düşməyəcəyik. Bu halda hər yeni dəyərin əvvəlkindən 1 artacağını bilmək kifayətdir.
Hər bir əmlak üçün əlavə olaraq bir çox başqa şeyləri təyin edə bilərsiniz, məsələn, sıfırdan fərqli və ya unikal olan, standart dəyəri, maksimum ölçüsü və s. Bu sinfə əsaslanan cədvəl yaratmaq lazımdırsa, bu faydalı olacaq; Hibernate-də bu seçim var. Amma biz artıq özümüz cədvəl yaratmışıq və bütün xüsusiyyətləri konfiqurasiya etmişik, ona görə də onsuz da edə bilərik. Kiçik bir qeyd.Hibernate sənədləri qeydləri sahələrdə deyil, alıcılarda istifadə etməyi tövsiyə edir. Bununla belə, bu yanaşmalar arasındakı fərq olduqca incədir və bizim sadə tətbiqimizdə bunun heç bir təsiri olmayacaq. Üstəlik, əksər insanlar onsuz da sahələrin üstünə qeydlər qoyurlar. Ona görə də belə buraxaq, daha səliqəli görünür.

Gözləmə Xüsusiyyətləri

Yaxşı, indi Qış rejimimizi qurmağa başlayaq. Və ilk növbədə, istifadəçi adı və parol, url və başqa bir şey kimi bəzi məlumatları ayrıca fayla yerləşdirək. String username = "root";Siz, əlbəttə ki, biz əlaqəni yoxladığımız zaman etdiyimiz kimi ( sonra onu əlaqə yaratmaq metoduna keçirdik) birbaşa sinifdə onları müntəzəm xətt kimi göstərə bilərsiniz . Ancaq bu cür statik məlumatları hansısa faylda saxlamaq daha düzgündür property. Və əgər, məsələn, verilənlər bazasını dəyişmək lazımdırsa, onda bütün sinifləri keçib onun harada istifadə olunduğunu axtarmaq lazım olmayacaq, bu fayldakı dəyəri bir dəfə dəyişmək kifayət edəcək. Resurslar kataloqunda db.properties faylı yaradaq :
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
Yaxşı, yuxarıdan hər şey aydındır, verilənlər bazasına qoşulma parametrləri, yəni. sürücü sinfinin adı, url, istifadəçi adı və parol. hibernate.dialect- bu xüsusiyyət Hibernate üçün SQL dilinin hansı xüsusi versiyasının istifadə edildiyini göstərmək üçün lazımdır. Fakt budur ki, hər bir DBMS-də imkanları genişləndirmək, bəzi funksionallıq əlavə etmək və ya nəyisə optimallaşdırmaq üçün adətən dili bir qədər modernləşdirirlər. Nəticədə məlum olur ki, hər bir DBMS-in öz SQL ləhcəsi var. Bu, ingilis dilində olduğu kimi, dil eyni kimi görünür, lakin Avstraliya, ABŞ və ya Britaniyada bir az fərqli olacaq və bəzi sözlərin fərqli mənaları ola bilər. Anlayışla bağlı hər hansı problemin qarşısını almaq üçün Hibernate-ə onun nə ilə məşğul olduğunu birbaşa söyləməlisiniz. hibernate.show_sql— bu xüsusiyyət sayəsində verilənlər bazasına sorğular konsolda göstəriləcək. Bu lazım deyil, amma bu şeylə ən azı baş verənlərə baxa bilərsiniz, əks halda Hibernate bir növ sehr edir. Bəli, əlbəttə ki, göstərmək üçün tamamilə aydın olmayacaq; bunun üçün bir növ logger istifadə etmək daha yaxşıdır, amma bu başqa vaxt üçün bir şeydir, hələlik bunu edəcək.

Hibernate konfiqurasiyası

Konfiqurasiyanın qurulmasına keçək. Paketdə configbir sinif yaradaq 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;
    }
}
Burada kifayət qədər yeni şeylər var, ona görə də hər bir element haqqında əlavə olaraq müxtəlif mənbələrdə məlumat axtarmaq daha yaxşıdır. Gəlin burada qısaca danışaq.
  • @ConfigurationArtıq @ComponentScandərsi keçəndə anladıq WebConfig.
  • @EnableTransactionManagementTransactionManager— əməliyyatları idarə etmək üçün ondan istifadə etməyə imkan verir . Hibernate əməliyyatlardan istifadə edərək verilənlər bazası ilə işləyir; onlar müəyyən əməliyyatlar toplusunun vahid bütövlükdə yerinə yetirilməsi üçün lazımdır, yəni. metodun hər hansı bir əməliyyatla bağlı problemləri varsa, o zaman bütün digərləri yerinə yetirilməyəcək ki, bu, klassik pul köçürmə nümunəsindəki kimi, bir hesabdan pul çıxarma əməliyyatı başa çatdıqda baş verməsin, lakin başqasına yazma əməliyyatı nəticə vermədi, nəticədə pul yoxa çıxdı.
  • @PropertySource— bu yaxınlarda yaratdığımız xüsusiyyətlər faylını birləşdirərək.
  • Environmentproperty- fayldan xassələri əldə etmək üçün .
  • hibernateProperties- bu üsul Hibernate xassələrini Properties obyekti kimi təqdim etmək üçün lazımdır
  • DataSource— verilənlər bazası ilə əlaqə yaratmaq üçün istifadə olunur. Bu DriverManager- ə alternativdir , biz əvvəllər main. Sənədlərdə deyilir ki, DataSourceistifadə etmək daha yaxşıdır. Fərq və üstünlüklərin nə olduğunu İnternetdə oxumağı unutmadan, əlbəttə ki, edəcəyik. Xüsusilə üstünlüklərdən biri Database Connection Pool (DBCP) yaratmaq imkanıdır.
  • sessionFactory— obyekt obyektləri ilə əməliyyatların həyata keçirildiyi seanslar yaratmaq. Burada məlumat mənbəyini, Hibernate xüsusiyyətlərini və obyekt siniflərini hansı paketdə axtarmalı olduğumuzu təyin edirik.
  • transactionManager— əməliyyat menecerini konfiqurasiya etmək.
haqqında kiçik bir qeyd DataSource. Sənədlərdə deyilir ki, standart tətbiqdən istifadə etmək DriverManagerDataSourcetövsiyə edilmir, çünki o, yalnız normal əlaqənin birləşdirilməsini əvəz edir və ümumiyyətlə yalnız testlər və sair üçün uyğundur. Normal bir proqram üçün bir növ DBCP kitabxanasından istifadə etmək üstünlük təşkil edir. Tətbiqimiz üçün, əlbəttə ki, əlimizdə olanlar kifayətdir, amma şəkli tamamlamaq üçün məsləhət görüldüyü kimi yenə də başqa bir tətbiqdən istifadə edəcəyik. Aşağıdakı asılılığı əlavə edək pom.xml:
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
dataSourcesinif metodunda onu paketdən biri ilə HibernateConfigəvəz edirik : DriverManagerDataSourceBasicDataSourceorg.apache.tomcat.dbcp.dbcp2
BasicDataSource dataSource = new BasicDataSource();
Yaxşı, hər şey hazır görünür, konfiqurasiya hazırdır, onu AppInitializer -ə əlavə etmək qalır :
protected Class<?>[] getRootConfigClasses() {
        return new Class[]{HibernateConfig.class};
    }

Məlumata giriş təbəqəsi

Nəhayət, DAO ilə işə başlamağın vaxtı gəldi. Biz dərsə gedirik FilmDAOImplvə ilk növbədə sınaq siyahısını oradan silirik, daha bizə lazım deyil. Sessiya fabriki əlavə edək və onun üzərində işləyək.
private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
Başlamaq üçün, filmlərin siyahısı olan bir səhifə göstərmək üçün bir üsul yaradacağıq, orada bir seans alacağıq və verilənlər bazasına sorğu göndərəcəyik (bütün qeydləri çıxarıb siyahı yaratmaq):
public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }
Burada 2 xal var. Əvvəlcə xəbərdarlıq göstərildi. Bu onunla bağlıdır ki, biz parametrləşdirilmiş List<Film>, lakin metod geri qayıdır, Listçünki kompilyasiya zamanı sorğunun hansı növə qaytarılacağı məlum deyil. Beləliklə, bu fikir bizə təhlükəli çevrilmə etdiyimiz barədə xəbərdarlıq edir və bu, problemlə nəticələnə bilər. Belə bir sual yaranmaması üçün bunun daha bir neçə düzgün yolu var. İnternetdə məlumat axtara bilərsiniz. Amma indi bununla məşğul olmayaq. Fakt budur ki, hansı növün qaytarılacağını dəqiq bilirik, ona görə də burada heç bir problem yaranmayacaq, sadəcə xəbərdarlığa məhəl qoymamaq olar. Ancaq gözləriniz göz qamaşdırmasın deyə metodun üstündən annotasiya asa bilərsiniz @SupressWarning("unchecked"). Bunu etməklə, biz tərtibçiyə deyirik ki, narahatlığınız üçün təşəkkür edirəm, dostum, amma mən nə etdiyimi bilirəm və hər şey nəzarət altındadır, buna görə rahatlaya və bu üsuldan narahat olmayasınız. İkincisi, fikir qırmızı " from Film" ilə vurğulanır. Bu, sadəcə HQL (Hibernate Query Language) sorğusudur və fikir hər şeyin düzgün olub-olmadığını və ya xətanın olduğunu anlamır. Siz ideya parametrlərinə keçə və hər şeyi əl ilə tənzimləyə bilərsiniz (maraqlandığınız təqdirdə İnternetə baxın). Yaxud siz sadəcə olaraq Hibernate çərçivəsi üçün dəstək əlavə edə bilərsiniz, bunu etmək üçün layihənin üzərinə sağ klikləyin, Çərçivə Dəstəyi Əlavə et seçin, Hazırda Qalmaq üçün qutuyu seçin və OK düyməsini basın. Bundan sonra, çox güman ki, obyekt sinfində ( Film) çox şey qırmızı rənglə vurğulanacaq, məsələn, annotasiyanın @Table(name = "films")xəbərdarlıq verdiyi yerdə "filmlər" cədvəlini həll edə bilməzsiniz . Yenə də burada səhv bir şey yoxdur, bu dizayn səhvi deyil, hər şey yığılacaq və işləyəcək. İdeya bizim bazamız haqqında heç nə bilmədiyi üçün vurğulanır. Bunu düzəltmək üçün ideyanı verilənlər bazası ilə birləşdirək. Görün -> Alət Windows -> Davamlı (tab açılacaq) -> siçanın sağ düyməsi, Məlumat Mənbəsində Məlumat Mənbələrini Təyin et -> seçin, verilənlər bazası ilə əlaqəni təyin edin və OK düyməsini basın . Bütün bunlar düzələndə hələ bir şey qalırdı. Gəlin daha yüksək səviyyəyə, xidmətə keçək. Sinifdə yaz metodunu annotasiya ilə qeyd edirik , bu metodun əməliyyatda yerinə yetirilməli olduğunu göstərəcək (bunsuz Hibernate işləməkdən imtina edəcək): Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (3-cü hissə) - 3FilmServiceImplallFilms@Transactional
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
Beləliklə, burada hər şey hazırdır, nəzarətçidə heç bir şeyə toxunmaq lazım deyil. Yaxşı, deyəsən, həqiqət anı gəldi, Run düyməsini basın və nə baş verdiyini görün. Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (3-cü hissə) - 4Budur, əlamətimiz və bu dəfə özümüzün dərsdə düzəltdiyimiz siyahıdan deyil, verilənlər bazasından əldə edildi. Əla, deyəsən hər şey işləyir. İndi biz bütün digər CRUD əməliyyatlarını sessiya metodlarından istifadə edərək eyni şəkildə edirik. Nəticə sinfi belə görünür:
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);
    }
}
İndi qalan şey xidmətə getməyi və üsullara annotasiya əlavə etməyi unutmamaqdır @Transactional. Budur, hazırdır. İndi qaçıb yoxlaya bilərsiniz. Bağlantıları və düymələri klikləyin, girişləri əlavə etməyə/silməyə/redaktə etməyə çalışın. Hər şey düzgün aparılırsa, işləməlidir. İndi bu, Hibernate, Spring, MySQL istifadə edən tam hüquqlu CRUD proqramıdır. Davamı olacaq... Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinin təqdimatı (1-ci hissə) Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinin təqdimatı (2-ci hissə) Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqi (3-cü hissə) Maven, Spring, MySQL, Hibernate-ə giriş və ilk CRUD tətbiqi (4-cü hissə)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION