Қайырлы күн. Бұл мақалада мен қарапайым CRUD қосымшасын жасау процесінде Maven, Spring, Hibernate, MySQL және Tomcat сияқты нәрселермен алғашқы кездесуіммен бөліскім келеді. Бұл 4-ші бөлімнің үшінші бөлімі. Мақала негізінен мұнда 30-40 деңгейді аяқтаған, бірақ әлі таза Java-дан асып кетпеген және ашық әлемге енді ғана кіруді бастаған (немесе бастағалы жатқан) адамдарға арналған. барлық осы технологиялар, фреймворктар және басқа да бейтаныс сөздер. Бұл «Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе» мақаласының үшінші бөлімі. Алдыңғы бөлімдерді мына сілтемелер арқылы көруге болады:
- Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (1 бөлім)
- Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (2 бөлім)
Мазмұны:
- Мәліметтер қорын құру және қосу
- ORM және JPA
- Нысан
- Күту сипаттары
- Күту конфигурациясы
- Деректерге қол жеткізу деңгейі
Мәліметтер қорын құру және қосу
Мәліметтер базасында жұмысты бастау уақыты келді. Күту күйіне қосылмас бұрын және оның бәрі сонда қалай жұмыс істейтінін ойластырмас бұрын, алдымен дерекқордың өзін қарастырайық, яғни. Оны жасайық, оны байланыстырайық, оны жасап, белгіні толтырайық. Біз ДҚБЖ (Дерекқорды басқару жүйесі) 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 үшін әдепкі), аты, т.б. сол күйінде қалдырыңыз. « Қосылымды тексеру » түймесін пайдаланып қосылымды тексеруге болады . OK түймесін басыңыз , енді біз 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 сыныбы болып табылады. Оның параметрлері жоқ жеке емес конструктор (немесе әдепкі конструктор) болуы керек және оның бастапқы кілті болуы керек, яғни. дерекқордағы осы сыныптың әрбір жазбасын бірегей түрде анықтайтын нәрсе. Сондай-ақ, мұндай сыныпқа қойылатын барлық талаптар туралы бөлек оқуға болады. Film
JPA 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-ге артады деп білу жеткілікті.
Күту сипаттары
Кәне, күту күйін орнатуды бастайық. Ең алдымен, пайдаланушы аты мен құпия сөз, 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
анықтадық .@ComponentScan
WebConfig
@EnableTransactionManagement
— транзакцияларды басқару үшін пайдалануға мүмкіндік бередіTransactionManager
. Күту режимі транзакцияларды пайдалана отырып, дерекқормен жұмыс істейді; олар белгілі бір операциялар жиынтығын біртұтас ретінде орындау үшін қажет, яғни. егер әдіс кез келген бір операцияда ақаулықтарға тап болса, онда қалғандарының бәрі орындалмайды, осылайша ол бір шоттан ақша алу операциясы аяқталған кезде, ақшаны аударудың классикалық мысалындағыдай болмайды. басқаға хат жазу операциясы нәтиже бермей, нәтижесінде ақша жоғалып кеткен.@PropertySource
— жақында жасаған сипаттар файлын қосу.Environment
property
- файлдан қасиеттерді алу үшін .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
ауыстырамыз : DriverManagerDataSource
BasicDataSource
org.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 жұмыс істеуден бас тартады): FilmServiceImpl
allFilms
@Transactional
@Transactional
public List<Film> allFilms() {
return filmDAO.allFilms();
}
Сонымен, мұнда бәрі дайын, контроллерде ештеңеге қол тигізудің қажеті жоқ. Шындықтың сәті келген сияқты, «Іске қосу» түймесін басып , не болғанын көріңіз. Міне, бұл біздің белгі, және бұл жолы ол өзіміз сабақта жасаған тізімнен емес, дерекқордан алынды. Керемет, бәрі жұмыс істеп тұрған сияқты. Енді біз барлық басқа 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-бөлім)
GO TO FULL VERSION