JavaRush /Java блогы /Random-KK /Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданб...
Макс
Деңгей

Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (3 бөлім)

Топта жарияланған
Қайырлы күн. Бұл мақалада мен қарапайым CRUD қосымшасын жасау процесінде Maven, Spring, Hibernate, MySQL және Tomcat сияқты нәрселермен алғашқы кездесуіммен бөліскім келеді. Бұл 4-ші бөлімнің үшінші бөлімі. Мақала негізінен мұнда 30-40 деңгейді аяқтаған, бірақ әлі таза Java-дан асып кетпеген және ашық әлемге енді ғана кіруді бастаған (немесе бастағалы жатқан) адамдарға арналған. барлық осы технологиялар, фреймворктар және басқа да бейтаныс сөздер. Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (3 бөлім) - 1Бұл «Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе» мақаласының үшінші бөлімі. Алдыңғы бөлімдерді мына сілтемелер арқылы көруге болады:

Мазмұны:

Мәліметтер қорын құру және қосу

Мәліметтер базасында жұмысты бастау уақыты келді. Күту күйіне қосылмас бұрын және оның бәрі сонда қалай жұмыс істейтінін ойластырмас бұрын, алдымен дерекқордың өзін қарастырайық, яғни. Оны жасайық, оны байланыстырайық, оны жасап, белгіні толтырайық. Біз ДҚБЖ (Дерекқорды басқару жүйесі) MySQL қолданамыз (әрине, алдымен жүктеп алып, орнату керек). SQL (Structured Query Language) – реляциялық дерекқордағы деректерді құру, өзгерту және өңдеу үшін қолданылатын декларативті бағдарламалау тілі. Мұндай мәліметтер қорларында мәліметтер кесте түрінде сақталады. Қолданба дерекқормен қалай байланысады (SQL сұрауларын дерекқорға жіберу және нәтижелерді қайтару). Ол үшін Java-да JDBC (Java DataBase Connectivity) сияқты нәрсе бар , ол қарапайым тілмен айтқанда, дерекқорлармен жұмыс істеуге арналған интерфейстер мен сыныптардың жиынтығы. Дерекқормен әрекеттесу үшін қосылым жасау керек, ол үшін пакетте 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 үшін әдепкі), аты, т.б. сол күйінде қалдырыңыз. « Қосылымды тексеру » түймесін пайдаланып қосылымды тексеруге болады . OKMaven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (3 бөлім) - 2 түймесін басыңыз , енді біз MySQL serverіне қосылдық. Әрі қарай мәліметтер базасын жасайық. Мұны істеу үшін ашылатын консольде сценарий жазуға болады:
CREATE DATABASE test
Орындау түймешігін басыңыз және деректер базасы дайын, енді оны қосуға болады.Ол үшін Деректер көзі сипаттары бөліміне оралыңыз және Дерекқор өрісіне дерекқор атын (сынауын) енгізіңіз, содан кейін пайдаланушы аты мен құпия сөзді қайтадан енгізіңіз және OK түймесін басыңыз. Енді біз кесте жасауымыз керек. Сіз графикалық құралдарды пайдалана аласыз, бірақ бірінші рет оның қалай көрінетінін көру үшін сценарийді қолмен жазу керек шығар:
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- бұл кестедегі жазбаны бірегей анықтау үшін қолданылатын негізгі кілт (бірегейлікті білдіреді)
  • AUTO_INCREMENT— мән автоматты түрде жасалады (әрине ол нөлге тең болмайды, сондықтан оны көрсетудің қажеті жоқ)
  • NOT NULL- мұнда да бәрі анық, бос болуы мүмкін емес
  • DEFAULT— әдепкі мәнді орнатыңыз
  • COLLATE- codeтау
  • CREATE UNIQUE INDEX— өрісті бірегей ету
  • INSERT INTO— кестеге жазба қосу
Нәтиже келесідей белгі болып табылады: мүмкін оған біздің веб-қосымшамыздан бөлек қосылуға тырысу керек шығар. Осыған байланысты қандай да бір мәселелер туындаса ше, біз оны бірден шешеміз. Әйтпесе, кейінірек біз Күту режимін қосамыз , бірдеңе жасаймыз, конфигурациялаймыз, өңдейміз және егер біз бір жерде шатассақ, кем дегенде мәселе бұл жерде емес екенін білеміз. 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 туралы басқа ескертулер бар. Интернетті шолғаннан кейін сіз бұл өте кең таралған мәселе екенін біле аласыз және драйвердің әртүрлі нұсқаларын (mysql-connector-java) пайдаланған кезде ол басқаша ант беруі мүмкін. Мысалы, мен эксперименталды түрде 5.1.47 нұсқасын пайдаланған кезде уақыт белдеуіне байланысты ерекшеліктер жоқ екенін, байланыс қалыпты түрде жасалғанын, бірақ SSL ескертуі әлі де шығатынын білдім. Кейбір басқа нұсқаларда тек ескерту емес, SSL-ге қатысты ерекшелік бар сияқты көрінді. Жарайды, мәселе бұл емес. Сіз бұл мәселені бөлек шешуге тырысуға болады, бірақ біз оны қазір қарастырмаймыз. Мұның шешімі өте қарапайым, url- де қосымша параметрлерді көрсету керек , атап айтқанда serverTimezone, мәселе уақыт белдеуінде болса және useSSLмәселе SSL-де болса:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
Енді біз уақыт белдеуін орнаттық және SSL өшірілді. Біз оны қайтадан іске қосамыз mainжәне voila - Қосылым сәтті! Жақсы, біз қосылымды қалай құру керектігін түсіндік. Сынып Mainнегізінен өз тапсырмасын орындады, оны жоюға болады.

ORM және JPA

Жақсы мағынада, жақсырақ түсіну үшін, ең басынан бастап, ешқандай күту және басқа нәрселерсіз мәліметтер базасымен танысуды бастаған дұрыс. Сондықтан, кейбір нұсқаулықтарды тауып, алдымен JDBC сыныптарымен жұмыс істеуге тырысу, SQL сұрауларын қолмен жазу және т.б. Енді бірден ORM үлгісіне көшейік . Бұл нені білдіреді? Әрине, бұл туралы тағы да бөлек оқыған жөн, бірақ мен оны қысқаша сипаттауға тырысамын. ORM (Object-Relational Mapping немесе Object-Relational Mapping) – an objectілерді дерекқордың реляциялық құрылымдарына салыстыру технологиясы, яғни. Java нысанын кесте жолы ретінде көрсету үшін. ORM арқасында сіз SQL сценарийлерін жазу туралы алаңдамайсыз және нысандармен жұмыс істеуге назар аударасыз. Оны қалай пайдалануға болады. Java-да ORM тұжырымдамасын жүзеге асыратын JPA (Java Persistence API) тағы бір керемет нәрсе бар. JPA осындай спецификация; ол an objectілерге қойылатын талаптарды сипаттайды, мәліметтер қорымен жұмыс істеу үшін әртүрлі интерфейстер мен annotationларды анықтайды. JPA мәні бойынша сипаттама, стандарт болып табылады. Сондықтан көптеген нақты іске асырулар бар, олардың бірі (және ең танымалдарының бірі) Күту күйі болып табылады, бұл осы құрылымның мәні болып табылады. Күту күйі – an objectілік қатынасты салыстыру (ORM) мәселелерін шешуге арналған JPA спецификациясының жүзеге асырылуы. Біз осының бәрін жобамызбен байланыстыруымыз керек. Сонымен қатар, біздің Көктем шетте қалмауы және деректер базасымен осы қозғалыстың барлығына қатысуы үшін бізге тағы бірнеше модульді қосу керек, өйткені Spring-webmvc тәуелділігінен алғанымыздың бәрі енді бұл үшін жеткіліксіз. Сондай-ақ бізге дерекқормен жұмыс істеу үшін spring-jdbc , транзакцияларды қолдау үшін spring-tx және күту режимімен жұмыс істеу үшін 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-core , және spring-jdbc және spring-tx және spring-orm бірге javax.persistence-apiкеледі .

Нысан

Сондықтан біз сынып an objectілерінің Filmдерекқорда сақталуын қалаймыз. Ол үшін сынып бірқатар шарттарды қанағаттандыруы керек. JPA-де бұл үшін Ұйым сияқты нәрсе бар . Нысан класы жеке өрістері және олар үшін қабылдағыштары мен орнатушылары бар қарапайым POJO сыныбы болып табылады. Оның параметрлері жоқ жеке емес конструктор (немесе әдепкі конструктор) болуы керек және оның бастапқы кілті болуы керек, яғни. дерекқордағы осы сыныптың әрбір жазбасын бірегей түрде анықтайтын нәрсе. Сондай-ақ, мұндай сыныпқа қойылатын барлық талаптар туралы бөлек оқуға болады. FilmJPA annotationларын қолданатын сыныпты нысанға айналдырайық :
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- осы нысанды көрсету үшін арнайы кестені көрсетеді.
  • @Id— бұл өрістің бастапқы кілт екенін көрсетеді, яғни. бұл сипат әрбір бірегей жазбаны анықтау үшін пайдаланылады.
  • @Column— өрісті кесте бағанына қосады. Өріс пен кесте бағандарының атаулары бірдей болса, оларды өткізіп жіберуге болады.
  • @GeneratedValue— сипат автоматты түрде жасалады, жақшаның ішінде қалай көрсетуге болады. Біз қазір әртүрлі стратегиялардың қалай жұмыс істейтінін түсінбейміз. Бұл жағдайда әрбір жаңа мән алдыңғысынан 1-ге артады деп білу жеткілікті.
Әрбір сипат үшін сіз көптеген басқа нәрселерді қосымша көрсете аласыз, мысалы, не нөл емес немесе бірегей болуы керек, әдепкі мәнді, ең үлкен өлшемді және т.б. көрсетіңіз. Бұл осы сыныпқа негізделген кестені жасау қажет болса пайдалы болады; Күту режимінде бұл опция бар. Бірақ біз кестені өзіміз жасап, барлық қасиеттерді конфигурациялап қойдық, сондықтан онсыз да жасай аламыз. Шағын жазба.Күту режимі құжаттамасы 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- бұл сипат Күту күйіне SQL тілінің қандай нұсқасы қолданылатынын көрсету үшін қажет. Әрбір ДҚБЖ мүмкіндіктерін кеңейту, кейбір функционалдылықты қосу немесе бір нәрсені оңтайландыру үшін олар әдетте тілді аздап модернизациялайды. Нәтижесінде, әрбір ДҚБЖ өзіндік SQL диалектісі бар екені белгілі болды. Бұл ағылшын тіліндегі сияқты, тіл бірдей сияқты, бірақ Австралияда, АҚШ-та немесе Ұлыбританияда ол сәл өзгеше болады және кейбір сөздердің әртүрлі мағыналары болуы мүмкін. Түсінуде қандай да бір қиындықтарды болдырмау үшін күту күйіне нақты немен айналысу керектігін тікелей айту керек. hibernate.show_sql— осы сипаттың арқасында мәліметтер базасына сұраныстар консольде көрсетіледі. Бұл қажет емес, бірақ бұл нәрсемен сіз кем дегенде не болып жатқанын көре аласыз, әйтпесе Hibernate қандай да бір сиқыр жасап жатқан сияқты көрінуі мүмкін. Әрине, оны көрсету мүлдем түсініксіз болады; бұл үшін тіркеушінің қандай да бір түрін пайдаланған дұрыс, бірақ бұл басқа уақытта нәрсе, әзірше ол жасайды.

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

Конфигурацияны орнатуға көшейік. Пакетте 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. Күту режимі транзакцияларды пайдалана отырып, дерекқормен жұмыс істейді; олар белгілі бір операциялар жиынтығын біртұтас ретінде орындау үшін қажет, яғни. егер әдіс кез келген бір операцияда ақаулықтарға тап болса, онда қалғандарының бәрі орындалмайды, осылайша ол бір шоттан ақша алу операциясы аяқталған кезде, ақшаны аударудың классикалық мысалындағыдай болмайды. басқаға хат жазу операциясы нәтиже бермей, нәтижесінде ақша жоғалып кеткен.
  • @PropertySource— жақында жасаған сипаттар файлын қосу.
  • Environmentproperty- файлдан қасиеттерді алу үшін .
  • hibernateProperties- бұл әдіс Күту күйінің сипаттарын Properties нысаны ретінде көрсету үшін қажет
  • DataSource— мәліметтер қорымен байланыс құру үшін қолданылады. Бұл DriverManager бағдарламасына балама , оны біз бұрын жасаған кезде қолдандық main. Құжаттамада DataSourceоны қолданған дұрыс деп жазылған. Біз мұны істейміз, әрине, Интернеттен айырмашылығы мен артықшылықтарын оқуды ұмытпаймыз. Атап айтқанда, бір артықшылық - Дерекқорға қосылу пулын (DBCP) жасау мүмкіндігі.
  • sessionFactory— Сеанстарды құру, олардың көмегімен субъект an objectілерімен операциялар жүзеге асырылады. Мұнда біз деректер көзін, күту режимін және қай пакетте нысан сыныптарын іздеу керектігін орнатамыз.
  • transactionManager— транзакция менеджерін конфигурациялау үшін.
туралы шағын ескерту DataSource. Құжаттамада стандартты енгізуді пайдалану DriverManagerDataSourceұсынылмайды, өйткені ол тек қалыпты қосылымды біріктіруді алмастырады және әдетте тек сынақтар және т.б. үшін жарамды. Қалыпты қолданба үшін DBCP кітапханасының қандай да бір түрін пайдаланған жөн. Біздің қосымшамыз үшін, әрине, бізде бар нәрсе жеткілікті, бірақ суретті аяқтау үшін, мүмкін, біз кеңес бергендей басқа іске асыруды қолданамыз. Келесі тәуелділікті қосамыз pom.xml:
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
Ал dataSourceкласс әдісінде біз оны бумадағы біреуімен HibernateConfigауыстырамыз : DriverManagerDataSourceBasicDataSourceorg.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себебі компиляция уақытында сұраудың қай түрін қайтаратыны белгісіз. Сондықтан бұл идея бізге қауіпті түрлендіруді орындап жатқанымызды ескертеді, бұл қиындыққа әкелуі мүмкін. Мұндай сұрақ туындамас үшін мұны істеудің бірнеше дұрыс жолы бар. Интернеттен ақпаратты іздеуге болады. Бірақ, енді бұл мәселеге алаңдамай-ақ қояйық. Өйткені, біз қай түрдің қайтарылатынын нақты білеміз, сондықтан мұнда ешқандай проблемалар туындамайды, сіз жай ғана ескертуді елемеуіңізге болады. Бірақ, сіздің көзіңіз ауырмас үшін, әдістің үстіне annotationны іліп қоюға болады @SupressWarning("unchecked"). Мұны істеу арқылы біз компиляторға айтамыз, досым, алаңдағаныңыз үшін рахмет, бірақ мен не істеп жатқанымды білемін және барлығын бақылаудамын, осылайша сіз демалуға және бұл әдіс туралы алаңдамайсыз. Екіншіден, идеяның асты қызыл түспен сызылған « from Film». Бұл жай ғана HQL (күту режиміндегі сұрау тілі) сұрауы және идея бәрі дұрыс немесе қате бар-жоғын түсінбейді. Сіз идея параметрлеріне өтіп, бәрін қолмен реттей аласыз (қызықтырсаңыз Интернеттен қараңыз). Немесе күту режиміне қолдауды қосуға болады, бұл әрекетті орындау үшін жобаны тінтуірдің оң жақ түймешігімен басып, « Жақтау қолдауын қосу» опциясын таңдап, Күту күйіне құсбелгі қойып , «ОК» түймесін басыңыз. Осыдан кейін нысан сыныбында ( Film) көп нәрсе қызыл түспен сызылады, мысалы, annotation «фильмдер» кестесін шеше алмайды деген@Table(name = "films") ескертуді береді . Тағы да, мұнда қате жоқ, бұл дизайн қатесі емес, бәрі құрастырылады және жұмыс істейді. Бұл идея біздің базамыз туралы ештеңе білмейтіндіктен баса айтылды. Мұны түзету үшін идеяны дерекқормен біріктірейік. Көрініс -> Құрал Windows -> Тұрақты (қойынды ашылады) -> тінтуірдің оң жақ түймешігі, Деректер көзінде Деректер көздерін тағайындау -> тармағын таңдаңыз , дерекқорға қосылымды көрсетіңіз және OK түймесін басыңыз . Мұның бәрі түзетілгенде, әлі де бір нәрсе қалды. Жоғары деңгейге, қызметке барайық. Сыныпта біз көктем әдісін annotationмен белгілейміз , ол әдіс транзакцияда орындалуы керек екенін көрсетеді (мұнсыз Hibernate жұмыс істеуден бас тартады): Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (3 бөлім) - 3FilmServiceImplallFilms@Transactional
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
Сонымен, мұнда бәрі дайын, контроллерде ештеңеге қол тигізудің қажеті жоқ. Шындықтың сәті келген сияқты, «Іске қосу» түймесін басып , не болғанын көріңіз. 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