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. Bu, "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:
- Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (1-ci hissə)
- Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinə giriş (2-ci hissə)
Məzmun:
- Verilənlər bazasının yaradılması və qoşulması
- ORM və JPA
- Müəssisə
- Gözləmə Xüsusiyyətləri
- Hibernate konfiqurasiyası
- Məlumata giriş təbəqəsi
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.sql
bir sinif var Connection
. Bağlantı qurmağın bir neçə yolu var, məsələn, getConnection
sinif 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 . OK 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);
films
Sütunlu adla cədvəl yaradılır və s id
. title
Hə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əzDEFAULT
— standart dəyəri təyin edinCOLLATE
- kodlaşdırmaCREATE UNIQUE INDEX
- sahəni unikal etməkINSERT INTO
— cədvələ qeyd əlavə edin
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 main
və 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 serverTimezone
problem saat qurşağındadırsa və useSSL
problem 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 main
və 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əkpom.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-jdbc və spring-tx ilə birlikdə spring-ormjavax.persistence-api
ilə birlikdə gələcək .
Müəssisə
Beləliklə, biz istəyirik ki, sinif obyektləriFilm
verilə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 Film
JPA 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.
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əconfig
bir 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.
@Configuration
Artıq@ComponentScan
dərsi keçəndə anladıqWebConfig
.@EnableTransactionManagement
TransactionManager
— ə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.Environment
property
- 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ırDataSource
— verilənlər bazası ilə əlaqə yaratmaq üçün istifadə olunur. Bu DriverManager- ə alternativdir , biz əvvəllərmain
. Sənədlərdə deyilir ki,DataSource
istifadə 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.
DataSource
. Sənədlərdə deyilir ki, standart tətbiqdən istifadə etmək DriverManagerDataSource
tö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>
Və dataSource
sinif metodunda onu paketdən biri ilə HibernateConfig
əvəz edirik : DriverManagerDataSource
BasicDataSource
org.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ə gedirikFilmDAOImpl
və 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): FilmServiceImpl
allFilms
@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. Budur, ə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ə)
GO TO FULL VERSION