Нимирӯзи ба хайр. Дар ин мақола ман мехоҳам аввалин вохӯрии худро бо чизҳое ба монанди Maven, Spring, Hibernate, MySQL ва Tomcat дар раванди эҷоди як барномаи оддии CRUD мубодила кунам. Ин қисми сеюми 4 аст. Мақола пеш аз ҳама барои онҳое пешбинӣ шудааст, ки дар ин ҷо аллакай 30-40 сатҳро хатм кардаанд, вале то ҳол берун аз Java-и холис ҳаракат накардаанд ва ҳоло ба ҷаҳони кушод бо ҳамаи ин технологияҳо, чаҳорчӯбаҳо ва дигар калимаҳои ношинос.
Ин қисми сеюми мақолаи "Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD" мебошад. Қисмҳои қаблиро тавассути истиноди зерин дидан мумкин аст:
пахш кунед ва ҳоло мо ба serverи MySQL пайвастем. Минбаъд, биёед базаи маълумотро эҷод кунем. Барои ин, шумо метавонед дар консоле, ки кушода мешавад, скрипт нависед:
Шояд барои пайваст шудан ба он кӯшиш кардан лозим аст, танҳо дар айни замон, алоҳида аз веб-барномаи мо. Чӣ мешавад, агар баъзе мушкилот бо ин ба миён оянд, мо онро фавран ҳал мекунем. Дар акси ҳол, дертар мо Hibernate -ро пайваст мекунем , коре мекунем, танзим мекунем, кор мекунем ва агар дар ҷое бесарусомонӣ кунем, ҳадди аққал мо медонем, ки мушкилот дар ин ҷо нест. Хуб, барои тафтиши пайвастшавӣ, биёед як усули
Вақте ки ҳамаи ин ислоҳ шуд, ҳанӯз чизе боқӣ монд. Биёед, ба зинаи баландтар, ба хизмат. Дар синф,
Ва ин аст, аломати мо ва ин дафъа он на аз рӯйхате, ки худи мо дар синф дуруст карда будем, балки аз пойгоҳи додаҳо ба даст омад. Аҷоиб, ҳама чиз кор мекунад. Ҳоло мо ҳама амалиёти дигари CRUD-ро бо истифода аз усулҳои сессия иҷро мекунем. Синфи натиҷавӣ чунин менамояд:
- Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 1)
- Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 2)
Мундариҷа:
- Эҷод ва пайваст кардани пойгоҳи додаҳо
- ORM ва JPA
- Муассиса
- Хосиятҳои интизорӣ
- Конфигуратсияи интизорӣ
- Қабати дастрасии маълумот
Эҷод ва пайваст кардани пойгоҳи додаҳо
Хуб, вақти он расидааст, ки ба базаи маълумот оғоз кунед. Пеш аз пайваст кардани Hibernate ва дар бораи он фикр кунед, ки он чӣ гуна бояд кор кунад, аввал биёед ба худи базаи маълумот назар кунем, яъне. Биёед онро эҷод кунем, пайваст кунем, созем ва аломатро пур кунем. Мо DBMS (Системаи идоракунии пойгоҳи додаҳо) 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 муқаррар мекунем (масалан, ман реша ва решаро истифода кардам). Порт (пешфарз барои MySQL 3306), ном ва ғайра. онро тавре гузоред. Шумо метавонед пайвастро бо истифода аз тугмаи " Пайвастшавиро санҷед ". OK-ро![Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 3) - 2](https://cdn.javarush.com/images/article/eb55246c-ef67-4688-8dbd-7cd082800b4f/1024.jpeg)
CREATE DATABASE test
"Иҷро кардан" -ро пахш кунед ва базаи маълумот омода аст, акнун шумо метавонед онро пайваст кунед.Барои ин ба "Хусусиятҳои манбаи додаҳо" баргардед ва номи базаи маълумотро (test) дар майдони Database ворид кунед, пас номи корбар ва паролро дубора ворид кунед ва 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
- рамзгузорӣCREATE UNIQUE INDEX
— майдонро бехамто гардонадINSERT INTO
— ба ҷадвал сабт илова кунед
![](https://cdn.javarush.com/images/article/802cab24-6052-4a17-b983-199ebae33af4/1024.jpeg)
main
муваккатан созем. Аслан, шумо метавонед онро дар ҳама ҷо ҷойгир кунед, ҳатто дар синфи контроллер, ҳатто дар модел ё конфигуратсия, муҳим нест, шумо танҳо бояд онро истифода баред, то боварӣ ҳосил кунед, ки ҳама чиз бо пайвастшавӣ хуб аст ва шумо метавонед онро нест кунед. Аммо барои бештар эҳтиёткор будан, биёед барои он як синфи алоҳида эҷод кунем Main
:
package testgroup.filmography;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "root";
System.out.println("Connecting...");
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("Connection successful!");
} catch (SQLException e) {
System.out.println("Connection failed!");
e.printStackTrace();
}
}
}
Дар ин ҷо ҳама чиз оддӣ аст, мо параметрҳои пайвастшавиро ба базаи худ насб мекунем ва кӯшиш мекунем, ки пайвастшавӣ эҷод кунем. Биёед инро оғоз кунем main
ва бубинем. Ҳамин тавр, ман як истисно, баъзе мушкилоти минтақаи вақт ва огоҳии дигар дар бораи SSL гирифтам. Пас аз дидани Интернет, шумо метавонед фаҳмед, ки ин як мушкилоти хеле маъмул аст ва ҳангоми истифодаи versionҳои гуногуни драйвер (mysql-connector-java), он метавонад ба таври дигар қасам хӯрад. Масалан, ман ба таври таҷрибавӣ фаҳмидам, ки ҳангоми истифодаи versionи 5.1.47 аз сабаби минтақаи вақт ягон истисно вуҷуд надорад, пайвастшавӣ ба таври муқаррарӣ сохта мешавад, аммо огоҳии SSL ҳоло ҳам пайдо мешавад. Бо баъзе versionҳои дигар ба назар чунин менамуд, ки дар мавриди SSL истисно вуҷуд дорад, на танҳо огоҳӣ. Хуб, гап дар ин нест. Шумо метавонед кӯшиш кунед, ки ин масъаларо алоҳида ҳал кунед, аммо мо ҳоло ба он намеравем. Ҳалли ин ҳама хеле оддӣ аст, шумо бояд параметрҳои иловагиро дар url муайян кунед , яъне serverTimezone
агар мушкилот дар минтақаи вақт бошад ва useSSL
агар мушкилот бо SSL бошад:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
Ҳоло мо минтақаи вақтро муқаррар кардем ва SSL-ро ғайрифаъол кардем. Мо онро дубора оғоз мекунем main
ва воило - Пайвастшавӣ муваффақ аст! Хуб, олиҷаноб, мо фаҳмидем, ки чӣ гуна пайвастшавӣ эҷод кунем. Синф Main
вазифаи худро асосан иҷро кардааст, шумо метавонед онро нест кунед.
ORM ва JPA
Ба таври хуб, барои беҳтар фаҳмидани он, беҳтар аст, ки шиносоӣ бо базаҳои маълумотро бо тартиб, аз аввал, бидуни ҳеҷ гуна хобгоҳҳо ва чизҳои дигар оғоз кунед. Аз ин рӯ, хуб мебуд, ки якчанд роҳнамо пайдо кунед ва аввал кӯшиш кунед, ки бо синфҳои JDBC кор кунед, дархостҳои SQL-ро дастӣ нависед ва ғайра. Хуб, биёед фавран ба модели ORM гузарем . Ин чӣ маъно дорад? Албатта, бори дигар тавсия дода мешавад, ки дар ин бора алоҳида хонед, аммо ман кӯшиш мекунам, ки онро мухтасар тавсиф кунам. ORM (Object-Relational Mapping ё харитасозии an object-релятсионӣ) технологияест барои харитасозии an objectҳо ба сохторҳои пойгоҳи додаҳои релятсионӣ, яъне. an objectи Java-и моро ҳамчун сатри ҷадвал муаррифӣ кунад. Бо шарофати ORM, ба шумо лозим нест, ки дар бораи навиштани скриптҳои SQL хавотир шавед ва ба кор бо an objectҳо диққат диҳед. Чӣ тавр истифода бурдани он. Java боз як чизи бузург дорад, JPA (Java Persistence API), ки консепсияи ORM-ро амалӣ мекунад. JPA чунин мушаххасот аст; он талаботро ба an objectҳо тавсиф мекунад, интерфейсҳо ва эзоҳҳои гуногунро барои кор бо пойгоҳи додаҳо муайян мекунад. JPA аслан тавсиф, стандарт аст. Аз ин рӯ, бисёр татбиқҳои мушаххас мавҷуданд, ки яке аз онҳо (ва яке аз маъмултарин) Hibernate мебошад, ки моҳияти ин чаҳорчӯба мебошад. Hibernate як амалисозии мушаххасоти JPA мебошад, ки барои ҳалли мушкилоти харитасозии an objectӣ (ORM) пешбинӣ шудааст. Мо бояд ин ҳама чизро ба лоиҳаи худ пайваст кунем. Илова бар ин, барои он ки Баҳори мо дар канор наистад ва инчунин дар ин ҳаракат бо пойгоҳи додаҳо иштирок кунад, мо бояд боз якчанд модулро пайваст кунем, зеро хамаи он чизе, ки мо аз вобастагии бахор-webmvc ба даст овардем , дигар барои ин кифоя нест. Ба мо инчунин барои кор бо пойгоҳи додаҳо spring-jdbc , барои дастгирии транзаксияҳо spring-tx ва барои кор бо Hibernate spring-orm лозим мешавад . Биёед вобастагиҳоро баpom.xml
:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
</dependency>
Ин ду вобастагӣ кофӣ аст. ҳамроҳ бо hibernate-core , ва spring-jdbc ва spring-tx дар баробари spring-ormjavax.persistence-api
меоянд .
Муассиса
Ҳамин тавр, мо мехоҳем, ки an objectҳои синфӣFilm
дар пойгоҳи додаҳо нигоҳ дошта шаванд. Барои ин синф бояд як қатор шартҳоро қонеъ гардонад. Дар JPA чунин чизе ба монанди субъект барои ин вуҷуд дорад . Синфи an object як синфи оддии POJO буда , дорои майдонҳои хусусӣ ва гирандагон ва танзимкунандагон барои онҳо мебошад. Он бояд як созандаи ғайрихусусӣ бидуни параметрҳо (ё созандаи пешфарз) дошта бошад ва он бояд калиди ибтидоӣ дошта бошад, яъне. чизе, ки ҳар як сабти ин синфро дар пойгоҳи додаҳо беназир муайян мекунад. Шумо инчунин метавонед дар бораи ҳамаи талаботҳо барои чунин синф алоҳида хонед. Биёед синфи худро Film
бо истифода аз annotationҳои JPA ба як an object табдил диҳем:
package testgroup.filmography.model;
import javax.persistence.*;
@Entity
@Table(name = "films")
public class Film {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "title")
private String title;
@Column(name = "year")
private int year;
@Column(name = "genre")
private String genre;
@Column(name = "watched")
private boolean watched;
// + getters and setters
}
@Entity
- нишон медиҳад, ки ин синф an object аст.@Table
- барои нишон додани ин an object ба ҷадвали мушаххас ишора мекунад.@Id
— нишон медиҳад, ки ин майдон калиди ибтидоӣ мебошад, яъне. ин амвол барои муайян кардани ҳар як вурудоти беназир истифода мешавад.@Column
— майдонро ба сутуни чадвал пайваст мекунад. Агар номҳои сутуни майдон ва ҷадвал якхела бошанд, шумо метавонед онҳоро тарк кунед.@GeneratedValue
— моликият ба таври худкор тавлид мешавад; шумо метавонед дар қавс муайян кунед. Мо ҳоло намефаҳмем, ки стратегияҳои гуногун чӣ гуна кор мекунанд. Фаҳмидани он кифоя аст, ки дар ин ҳолат ҳар як арзиши нав аз арзиши қаблӣ 1 зиёд мешавад.
Хосиятҳои интизорӣ
Хуб, биёед ба танзими Hibernate оғоз кунем. Ва пеш аз ҳама, биёед баъзе маълумотро, аз қабor номи корбар ва парол, url ва чизи дигарро дар як файли алоҳида ҷойгир кунем. Шумо метавонед, албатта, онҳоро ҳамчун хати муқаррарӣ бевосита дар синф муайян кунед, чунон ки мо ҳангоми тафтиш кардани пайвастшавӣ (String username = "root";
ва баъд онро ба усули эҷоди пайваст гузарондем). Аммо нигоҳ доштани чунин маълумоти статикӣ дар ягон файл дурусттар аст property
. Ва агар, масалан, ба шумо лозим аст, ки пойгоҳи додаҳоро тағир диҳед, пас ба шумо лозим нест, ки аз тамоми синфҳо гузаред ва дар куҷо истифода шудани онро ҷустуҷӯ кунед; як маротиба тағир додани арзиши ин файл кифоя хоҳад буд. Биёед дар директорияи захираҳо файли db.properties эҷод кунем :
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false
jdbc.username=root
jdbc.password=root
hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
hibernate.show_sql=true
Хуб, ҳама чиз аз боло равшан аст, параметрҳо барои пайвастшавӣ ба пойгоҳи додаҳо, яъне. номи синфи ронанда, URL, номи корбар ва парол. hibernate.dialect
- ин хосият барои нишон додан ба Hibernate лозим аст, ки кадом versionи мушаххаси забони SQL истифода мешавад. Гап дар он аст, ки дар ҳар як DBMS, барои васеъ кардани қобorятҳо, илова кардани баъзе функсияҳо ё оптимизатсия кардани чизе, онҳо одатан забонро каме навсозӣ мекунанд. Дар натиҷа, маълум мешавад, ки ҳар як DBMS лаҳҷаи SQL-и худро дорад. Ин мисли забони англисӣ аст, ба назар чунин менамояд, ки забон як аст, аммо дар Австралия, ИМА ё Бритониё он каме фарқ мекунад ва баъзе калимаҳо метавонанд маъноҳои гуногун дошта бошанд. Ва барои пешгирӣ кардани мушкилот дар фаҳмиш, шумо бояд мустақиман ба Hibernate бигӯед, ки он маҳз бо чӣ кор кардан лозим аст. 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
барои идоракунии транзаксияҳо истифода баред. Hibernate бо истифода аз транзаксияҳо бо пойгоҳи додаҳо кор мекунад; онҳо барои маҷмӯи муайяни амалиётҳо лозиманд, ки дар як маҷмӯъ иҷро карда шаванд, яъне. агар усул бо ягон амалиёт мушкилӣ дошта бошад, пас ҳамаи амалҳои дигар иҷро намешаванд, то он мисли мисоли классикӣ бо интиқоли пул, вақте ки амалиёти гирифтани пул аз як суратҳисоб анҷом ёфт, рӯй надиҳад. амалиёти ба дигараш навиштан кор на-кард, дар натича пул гайб зад.@PropertySource
— пайваст кардани файли хосиятҳое, ки мо ба наздикӣ офаридаем.Environment
- барои гирифтани хосиятҳо азproperty
файл.hibernateProperties
- ин усул барои муаррифии хосиятҳои Hibernate ҳамчун an objectи Хусусиятҳо лозим астDataSource
— барои сохтани пайвастшавӣ ба базаи маълумот истифода мешавад. Ин алтернатива ба DriverManager аст , ки мо қаблан ҳангоми сохтаниmain
. Ҳуҷҷатҳо мегӯянд, киDataSource
истифодаи он афзалтар аст. Ин аст он чизе ки мо албатта мекунем, фаромӯш накунем, ки дар Интернет хонед, ки фарқият ва бартариҳо чист. Як бартарият махсусан ин қобorяти эҷоди ҳавзи пайвасти пойгоҳи додаҳо (DBCP) мебошад.sessionFactory
— ташкor сеансхое, ки бо ёрии онхо амалиёт бо an objectхои субъектхо анчом дода мешавад. Дар ин ҷо мо манбаи маълумот, хосиятҳои Hibernate ва дар кадом баста мо бояд синфҳои 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;
}
Барои оғоз кардан, мо усули намоиши саҳифаро бо рӯйхати филмҳо эҷод мекунем, дар он мо сеанс мегирем ва ба базаи маълумот дархост медиҳем (барои ҳама сабтҳо ва ташкor рӯйхат):
public List<Film> allFilms() {
Session session = sessionFactory.getCurrentSession();
return session.createQuery("from Film").list();
}
Дар ин ҷо 2 хол мавҷуд аст. Аввалан, огоҳӣ нишон дода шуд. Ин аз он сабаб аст, ки мо мехоҳем параметри гирифтанро гирем List<Film>
, аммо усул танҳо аз он List
сабаб бармегардад, ки дар вақти компилясия маълум нест, ки кадом навъи дархост бармегардад. Ҳамин тавр, идея моро огоҳ мекунад, ки мо табдor хатарнокро анҷом медиҳем, ки метавонад боиси мушкилот гардад. Якчанд роҳҳои дурусти ин кор вуҷуд доранд, то чунин савол ба миён наояд. Шумо метавонед маълумотро дар Интернет ҷустуҷӯ кунед. Аммо биёед акнун ба ин кор назанем. Гап дар он аст, ки мо аниқ медонем, ки кадом навъи он баргардонида мешавад, бинобар ин дар ин ҷо ягон мушкилот ба миён намеояд, шумо метавонед танҳо огоҳиро сарфи назар кунед. Аммо, то ки чашмони шумо дарди чашм набошанд, шумо метавонед эзоҳро дар болои усул овезон кунед @SupressWarning("unchecked")
. Бо ин кор, мо ба тартибдиҳанда мегӯем, ташаккур, рафиқ, барои нигаронии шумо, аммо ман медонам, ки ман чӣ кор карда истодаам ва ҳама чизро зери назорат дорам, то шумо метавонед истироҳат кунед ва аз ин усул хавотир нашавед. Сониян, ин идея бо ранги сурх " " ишора шудааст from Film
. Ин танҳо як дархости HQL (Забони интизории дархост) аст ва идея намефаҳмад, ки ҳама чиз дуруст аст ё хатогӣ вуҷуд дорад. Шумо метавонед ба танзимоти идея равед ва ҳама чизро дастӣ танзим кунед (агар манфиатдор бошед, ба Интернет нигаред). Ё шумо метавонед танҳо дастгирии чаҳорчӯбаи Hibernate -ро илова кунед, барои ин кор, бо тугмаи рости лоиҳа клик кунед, Иловаи Дастгирии чаҳорчӯба ро интихоб кунед , қуттии интизорӣ ва OK -ро пахш кунед. Баъд аз ин, эҳтимоли зиёд дар синфи an object ( Film
) бисёр чизҳо низ бо ранги сурх қайд карда мешаванд, масалан, дар он ҷо эзоҳ @Table(name = "films")
огоҳӣ медиҳад, ки Ҷадвали "филмҳо" -ро ҳал карда наметавонад . Боз ҳам, дар ин ҷо ҳеҷ бадӣ нест, ин хатои тарроҳӣ нест, ҳама чиз ҷамъоварӣ ва кор хоҳад кард. Идея аз он сабаб таъкид мешавад, ки вай дар бораи базаи мо чизе намедонад. Барои ислоҳ кардани ин, биёед идеяро бо базаи маълумот муттаҳид кунем. Намоиш -> Воситаи Windows -> Пойдор (ҷадвал кушода мешавад) -> тугмаи рости муш, Таъин кардани манбаъҳои додаҳо -> дар Манбаи маълумот ро интихоб кунед, пайвастшавиро ба пойгоҳи додаҳо муайян кунед ва OK -ро пахш кунед . ![Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 3) - 3](https://cdn.javarush.com/images/article/405085ea-a1df-410d-a53a-20d0af6b187f/1024.jpeg)
FilmServiceImpl
мо allFilms
усули баҳорро бо эзоҳ қайд мекунем @Transactional
, ки он нишон медиҳад, ки усул бояд дар транзаксия иҷро карда шавад (бе ин, Hibernate кор карданро рад мекунад):
@Transactional
public List<Film> allFilms() {
return filmDAO.allFilms();
}
Ҳамин тавр, ҳама чиз дар ин ҷо омода аст, ба шумо лозим нест, ки чизе дар контроллер ламс кунед. Хуб, ба назар чунин мерасад, ки лаҳзаи ҳақиқат фаро расидааст, Иҷро карданро клик кунед ва бубинед, ки чӣ мешавад. ![Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 3) - 4](https://cdn.javarush.com/images/article/e459debd-1973-4671-b065-9a92fb419e5e/1024.jpeg)
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);
}
}
Ҳоло танҳо боқӣ мемонад, ки фаромӯш накунед, ки ба хидмат равед ва ба усулҳо эзоҳ илова кунед @Transactional
. Хамин аст, тайёр. Шумо ҳоло метавонед давида ва тафтиш кунед. Истинодҳо ва тугмаҳоро клик кунед, кӯшиш кунед, ки воридотҳоро илова кунед/тоза кунед/таҳрир кунед. Агар ҳама чиз дуруст анҷом дода шавад, он бояд кор кунад. Ҳоло ин як барномаи мукаммали CRUD бо истифода аз Hibernate, Spring, MySQL мебошад. Давомаш... Муаррифии 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