JavaRush /Java blogi /Random-UZ /Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasig...
Макс
Daraja

Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (3-qism)

Guruhda nashr etilgan
Hayrli kun. Ushbu maqolada men oddiy CRUD ilovasini yaratish jarayonida Maven, Spring, Hibernate, MySQL va Tomcat kabi narsalar bilan birinchi uchrashuvimni baham ko'rmoqchiman. Bu 4-ning uchinchi qismi. Maqola, birinchi navbatda, bu yerda 30-40 darajani tamomlagan, lekin hali sof Java-dan tashqariga chiqmagan va endigina ochiq dunyoga kirishni boshlayotgan (yoki boshlamoqchi bo'lgan)lar uchun mo'ljallangan. bu barcha texnologiyalar, ramkalar va boshqa notanish so'zlar. Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (3-qism) - 1Bu “Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish” maqolasining uchinchi qismi. Oldingi qismlarni quyidagi havolalar orqali ko'rish mumkin:

Tarkib:

Ma'lumotlar bazasini yaratish va ulash

Xo'sh, ma'lumotlar bazasida ishlashni boshlash vaqti keldi. Hibernate- ni ulashdan va u erda qanday ishlashi kerakligi haqida o'ylashdan oldin , avval ma'lumotlar bazasining o'zini ko'rib chiqaylik, ya'ni. Keling, uni yaratamiz, bog'laymiz, qilamiz va belgini to'ldiramiz. Biz DBMS (Ma'lumotlar bazasini boshqarish tizimi) MySQL dan foydalanamiz (albatta, siz avval yuklab olishingiz va o'rnatishingiz kerak). SQL (Structured Query Language) - relyatsion ma'lumotlar bazasida ma'lumotlarni yaratish, o'zgartirish va manipulyatsiya qilish uchun ishlatiladigan deklarativ dasturlash tili. Bunday ma'lumotlar bazalarida ma'lumotlar jadval shaklida saqlanadi. Ilova ma'lumotlar bazasi bilan qanday bog'lanadi (SQL so'rovlarini ma'lumotlar bazasiga uzatish va natijalarni qaytarish). Buning uchun Java-da JDBC (Java DataBase Connectivity) kabi narsa bor , bu oddiy qilib aytganda, ma'lumotlar bazalari bilan ishlash uchun interfeyslar va sinflar to'plamidir. Ma'lumotlar bazasi bilan o'zaro ishlash uchun siz ulanishni yaratishingiz kerak, buning uchun paketda java.sqlsinf mavjud Connection. Ulanishni o'rnatishning bir necha yo'li mavjud, masalan, getConnectionsinf usulidan foydalanishingiz mumkin DriverManager. Biroq, ma'lumotlar bazasi bilan o'zaro aloqa to'g'ridan-to'g'ri amalga oshirilmaydi, chunki ma'lumotlar bazalari ko'p va ular har xil. Shunday qilib, ularning har biri uchun o'z JDBC drayveri mavjud.Ushbu drayver yordamida ma'lumotlar bazasiga ulanish o'rnatiladi. Shuning uchun, avvalambor, keyinroq chalg'imaslik uchun MySQL drayverini o'rnatamiz . Keling, pom.xmlquyidagi bog'liqlikni qo'shamiz:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
Endi ma'lumotlar bazasini yaratamiz. View -> Tool Windows -> Database - ma'lumotlar bazasi paneli ochiladi. Yangi (yashil +) -> Ma'lumotlar manbai -> MySQL - foydalanuvchi nomi va parolni ko'rsatishingiz kerak bo'lgan oyna ochiladi, biz ularni MySQL ni o'rnatishda o'rnatamiz (masalan, men root va root ishlatganman). Port (MySQL 3306 uchun standart), nom va h.k. xuddi shunday qoldiring. " Ulanishni sinab ko'rish " tugmasi yordamida ulanishni tekshirishingiz mumkin . OKMaven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (3-qism) - 2 tugmasini bosing va endi biz MySQL serveriga ulandik. Keyin ma'lumotlar bazasini yaratamiz. Buni amalga oshirish uchun siz ochilgan konsolda skript yozishingiz mumkin:
CREATE DATABASE test
Execute tugmasini bosing va ma'lumotlar bazasi tayyor, endi siz uni ulashingiz mumkin.Buni amalga oshirish uchun Data Source Properties ga qayting va Database maydoniga ma'lumotlar bazasi nomini (test) kiriting, so'ng yana foydalanuvchi nomi va parolni kiriting va OK tugmasini bosing. Endi biz stol yasashimiz kerak. Siz grafik vositalardan foydalanishingiz mumkin, lekin birinchi marta uning qanday ko'rinishini ko'rish uchun skriptni qo'lda yozishga arziydi:
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);
filmsUstunlar va boshqalar bilan idnom titlebilan jadval tuziladi. Har bir ustun uchun tur ko'rsatilgan (qavslar ichida maksimal chiqish hajmi).
  • PRIMARY KEY- bu jadvaldagi yozuvni yagona aniqlash uchun ishlatiladigan asosiy kalit (bu o'ziga xoslikni bildiradi)
  • AUTO_INCREMENT— qiymat avtomatik ravishda hosil bo'ladi (albatta u nolga teng bo'lmaydi, shuning uchun buni ko'rsatish shart emas)
  • NOT NULL- bu erda ham hamma narsa aniq, bo'sh bo'lishi mumkin emas
  • DEFAULT— standart qiymatni o'rnating
  • COLLATE- kodlash
  • CREATE UNIQUE INDEX- maydonni noyob qilish
  • INSERT INTO— jadvalga yozuv qo‘shish
Natija shunday belgidir: Ehtimol, bizning veb-ilovamizdan alohida, hozircha unga ulanishga harakat qilish kerak. Agar bu bilan ba'zi muammolar yuzaga kelsa, biz buni darhol hal qilamiz. Aks holda, keyinroq biz Hibernate ni ulaymiz , biror narsa qilamiz, sozlaymiz, tinker qilamiz va agar biz biror joyda chalkashlik qilsak, hech bo'lmaganda muammo bu erda emasligini bilib olamiz. Xo'sh, ulanishni tekshirish uchun, keling, mainvaqtinchalik usul yarataylik. Printsipial jihatdan siz uni istalgan joyga, hatto kontroller sinfida ham, model yoki konfiguratsiyada ham qo'yishingiz mumkin, bu muhim emas, faqat ulanish bilan hamma narsa yaxshi ekanligiga ishonch hosil qilish uchun uni ishlatishingiz kerak va uni o'chirishingiz mumkin. Ammo ehtiyot bo'lish uchun keling, buning uchun alohida sinf yarataylik 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();
        }
    }
}
Bu erda hamma narsa oddiy, biz ma'lumotlar bazasiga ulanish parametrlarini o'rnatamiz va ulanishni yaratishga harakat qilamiz. Keling, buni ishga tushiramiz mainva ko'rib chiqamiz. Shunday qilib, menda istisno, vaqt mintaqasi muammolari va SSL haqida boshqa ogohlantirishlar bor. Internetni ko'rib chiqqandan so'ng, bu juda keng tarqalgan muammo ekanligini bilib olishingiz mumkin va drayverning turli versiyalaridan (mysql-connector-java) foydalanganda, u boshqacha qasam ichishi mumkin. Misol uchun, men 5.1.47 versiyasidan foydalanilganda, vaqt mintaqasi tufayli istisnolar yo'qligini, ulanish an'anaviy tarzda yaratilganligini, ammo SSL ogohlantirishi hali ham paydo bo'lishini eksperimental ravishda aniqladim. Ba'zi boshqa versiyalar bilan SSL bilan bog'liq istisno bordek tuyuldi, shunchaki ogohlantirish emas. Mayli, gap bu emas. Siz bu masalani alohida hal qilishga urinib ko'rishingiz mumkin, ammo biz hozir unga kirmaymiz. Buning yechimi juda oddiy, siz url- da qo'shimcha parametrlarni ko'rsatishingiz kerak , ya'ni serverTimezonemuammo vaqt mintaqasida bo'lsa va useSSLmuammo SSL bilan bog'liq bo'lsa:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
Endi biz vaqt mintaqasini o'rnatdik va SSL-ni o'chirib qo'ydik. Biz uni yana ishga tushiramiz mainva voila - Ulanish muvaffaqiyatli! Xo'sh, ajoyib, biz aloqani qanday yaratishni aniqladik. Sinf Mainasosan o'z vazifasini bajardi, uni o'chirishingiz mumkin.

ORM va JPA

Yaxshi ma'noda, yaxshiroq tushunish uchun ma'lumotlar bazalari bilan tartib bilan, boshidanoq, hech qanday kutish va boshqa narsalarsiz tanishishni boshlash yaxshiroqdir. Shuning uchun, ba'zi yo'riqnomalarni topib, birinchi navbatda JDBC sinflari bilan ishlashga harakat qilish, SQL so'rovlarini qo'lda yozish va hokazo. Keling, darhol ORM modeliga o'tamiz . Bu qanday ma'nono bildiradi? Albatta, bu haqda yana alohida o'qish tavsiya etiladi, lekin men buni qisqacha tasvirlashga harakat qilaman. ORM (Object-Relational Mapping yoki Object-Relational Mapping) - ob'ektlarni relyatsion ma'lumotlar bazasi tuzilmalariga solishtirish texnologiyasi, ya'ni. Java ob'ektimizni jadval qatori sifatida ko'rsatish uchun. ORM tufayli siz SQL skriptlarini yozish haqida tashvishlanishingiz va ob'ektlar bilan ishlashga e'tiboringizni qaratishingiz shart emas. Uni qanday ishlatish kerak. Java-da yana bir ajoyib narsa bor, JPA (Java Persistence API), u ORM kontseptsiyasini amalga oshiradi. JPA shunday spetsifikatsiya bo'lib, u ob'ektlarga qo'yiladigan talablarni tavsiflaydi, ma'lumotlar bazasi bilan ishlash uchun turli xil interfeyslar va izohlarni belgilaydi. JPA mohiyatan tavsif, standartdir. Shuning uchun, ko'plab o'ziga xos ilovalar mavjud, ulardan biri (va eng mashhurlaridan biri) Hibernate bo'lib, bu ramkaning mohiyatidir. Hibernate - JPA spetsifikatsiyasining ob'ekt bilan bog'liq xaritalash (ORM) muammolarini hal qilish uchun mo'ljallangan amalga oshirilishi. Biz bularning barchasini loyihamiz bilan bog'lashimiz kerak. Bundan tashqari, bizning bahorimiz chetda turmasligi va ma'lumotlar bazalari bilan ushbu harakatda ishtirok etmasligi uchun biz yana bir nechta modullarni ulashimiz kerak, chunki Bahor-webmvc qaramligidan olgan barcha narsamiz endi buning uchun etarli emas. Shuningdek, bizga ma'lumotlar bazasi bilan ishlash uchun spring-jdbc , tranzaktsiyalarni qo'llab-quvvatlash uchun spring-tx va Hibernate bilan ishlash uchun spring-orm kerak bo'ladi . Quyidagilarga bog'liqliklarni qo'shamiz 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>
Ushbu ikkita bog'liqlik etarli. hibernate-core , va spring-jdbc va spring-tx bilan birga spring-ormjavax.persistence-api bilan birga keladi .

Tashkilot

Shunday qilib, biz sinf ob'ektlari Filmma'lumotlar bazasida saqlanishini xohlaymiz. Buning uchun sinf bir qator shartlarni qondirishi kerak. JPA'da buning uchun ob'ekt kabi narsa mavjud . Ob'ekt klassi oddiy POJO klassi bo'lib, ular uchun shaxsiy maydonlar va qabul qiluvchilar va sozlagichlar mavjud. U parametrlarsiz (yoki standart konstruktor) xususiy bo'lmagan konstruktorga ega bo'lishi kerak va u asosiy kalitga ega bo'lishi kerak, ya'ni. ma'lumotlar bazasida ushbu sinfning har bir yozuvini noyob tarzda aniqlaydigan narsa. Bundan tashqari, bunday sinf uchun barcha talablar haqida alohida o'qishingiz mumkin. Keling, sinfimizni FilmJPA izohlari yordamida ob'ektga aylantiraylik:
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 sinf ob'ekt ekanligini ko'rsatadi.
  • @Table- ushbu ob'ektni ko'rsatish uchun ma'lum bir jadvalga ishora qiladi.
  • @Id— bu maydon asosiy kalit ekanligini ko'rsatadi, ya'ni. bu xususiyat har bir noyob yozuvni aniqlash uchun ishlatiladi.
  • @Column— maydonni jadval ustuniga bog‘laydi. Agar maydon va jadval ustunlari nomlari bir xil bo'lsa, ularni o'tkazib yuborishingiz mumkin.
  • @GeneratedValue— xususiyat avtomatik tarzda yaratiladi, qanday qilib qavs ichida belgilashingiz mumkin. Endi biz turli xil strategiyalar qanday ishlashini tushunolmaymiz. Bu holda har bir yangi qiymat avvalgisidan 1 ga oshishini bilish kifoya.
Har bir xususiyat uchun siz boshqa ko'plab narsalarni qo'shimcha ravishda belgilashingiz mumkin, masalan, nol bo'lmagan yoki noyob bo'lishi kerak bo'lgan narsa, standart qiymatni, maksimal o'lchamni va hk. Agar siz ushbu sinf asosida jadval yaratishingiz kerak bo'lsa, bu foydali bo'ladi; Hibernate rejimida bunday imkoniyat mavjud. Lekin biz allaqachon jadvalni o'zimiz yaratdik va barcha xususiyatlarni sozladik, shuning uchun biz usiz ham qila olamiz. Kichik eslatma.Hibernate hujjatlari izohlarni maydonlarda emas, balki qabul qiluvchilarda ishlatishni tavsiya qiladi. Biroq, bu yondashuvlar orasidagi farq juda nozik va bizning oddiy dasturimizda bu hech qanday ta'sir qilmaydi. Bundan tashqari, ko'pchilik baribir maydonlarga izoh qo'yadi. Shuning uchun, keling, uni shunday qoldiraylik, u yanada toza ko'rinadi.

Kutish xususiyatlari

Keling, kutish rejimini sozlashni boshlaylik. Va birinchi navbatda, foydalanuvchi nomi va parol, url va boshqa ma'lumotlarni alohida faylga joylashtiramiz. Siz, albatta, ularni to'g'ridan-to'g'ri sinfda oddiy chiziq sifatida belgilashingiz mumkin, chunki biz ulanishni tekshirganimizda ( String username = "root";va keyin uni ulanishni yaratish usuliga o'tkazgan edik). Ammo bunday statik ma'lumotlarni qandaydir faylda saqlash to'g'riroq property. Va agar, masalan, ma'lumotlar bazasini o'zgartirish kerak bo'lsa, unda siz barcha sinflarni ko'rib chiqishingiz va u qayerda ishlatilishini qidirishingiz shart emas, bu fayldagi qiymatni bir marta o'zgartirish kifoya qiladi. Resurslar katalogida db.properties faylini yaratamiz :
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
Xo'sh, hamma narsa yuqoridan aniq, ma'lumotlar bazasiga ulanish parametrlari, ya'ni. haydovchi sinfi nomi, url, foydalanuvchi nomi va parol. hibernate.dialect- bu xususiyat Kutish rejimiga SQL tilining qaysi versiyasi ishlatilishini ko'rsatish uchun kerak. Gap shundaki, har bir DBMSda imkoniyatlarni kengaytirish, ba'zi funksiyalarni qo'shish yoki biror narsani optimallashtirish uchun ular odatda tilni biroz modernizatsiya qilishadi. Natijada, ma'lum bo'lishicha, har bir DBMS o'z SQL dialektiga ega. Ingliz tiliga o'xshab, til bir xilga o'xshaydi, lekin Avstraliya, AQSh yoki Britaniyada u biroz boshqacha bo'ladi va ba'zi so'zlar boshqacha ma'noga ega bo'lishi mumkin. Tushunish bilan bog'liq muammolarga yo'l qo'ymaslik uchun siz Hibernate-ga nima bilan shug'ullanishi kerakligini to'g'ridan-to'g'ri aytishingiz kerak. hibernate.show_sql— ushbu xususiyat tufayli ma'lumotlar bazasiga so'rovlar konsolda ko'rsatiladi. Bu shart emas, lekin bu narsa bilan siz hech bo'lmaganda nima bo'layotganiga qarashingiz mumkin, aks holda Hibernate qandaydir sehrgarlik qilayotgandek tuyulishi mumkin. Albatta, buni ko'rsatish aniq bo'lmaydi; buning uchun qandaydir loggerdan foydalangan ma'qul, lekin bu boshqa vaqt uchun, hozircha shunday bo'ladi.

Kutish konfiguratsiyasi

Keling, konfiguratsiyani o'rnatishga o'tamiz. Paketda configsinf yaratamiz 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;
    }
}
Bu erda juda ko'p yangi narsalar mavjud, shuning uchun har bir element bo'yicha ma'lumotni turli manbalarda qo'shimcha ravishda izlash yaxshidir. Keling, bu erda qisqacha to'xtalib o'tamiz.
  • Biz darsni qachon o'tkazganimizni @Configurationallaqachon tushundik .@ComponentScanWebConfig
  • @EnableTransactionManagement— tranzaktsiyalarni boshqarish uchun foydalanish imkonini beradi TransactionManager. Hibernate ma'lumotlar bazasi bilan tranzaktsiyalar yordamida ishlaydi; ular ma'lum bir operatsiyalar to'plamini bir butun sifatida bajarish uchun kerak, ya'ni. agar usul biron bir operatsiya bilan bog'liq muammolarga duch kelsa, qolganlari bajarilmaydi, shuning uchun pul o'tkazishning klassik misolidagi kabi, bitta hisobdan pul olish operatsiyasi tugallanganda sodir bo'lmaydi, lekin boshqasiga yozish operatsiyasi ish bermadi, natijada pul yo'qoldi.
  • @PropertySource— yaqinda yaratgan xususiyatlar faylini ulash.
  • Environmentproperty- fayldan xossalarni olish uchun .
  • hibernateProperties- bu usul Hibernate xususiyatlarini Properties ob'ekti sifatida ko'rsatish uchun kerak
  • DataSource— maʼlumotlar bazasiga ulanishni yaratish uchun foydalaniladi. Bu DriverManager dasturiga muqobil bo'lib , biz avvalroq yaratganimizda undan foydalanganmiz main. Hujjatlar shuni ko'rsatadiki, DataSourceundan foydalanish afzalroqdir. Biz buni qilamiz, albatta, Internetda qanday farq va afzalliklarni o'qishni unutmang. Ayniqsa, afzalliklardan biri bu ma'lumotlar bazasi ulanish hovuzini (DBCP) yaratish qobiliyatidir.
  • sessionFactory— sub'yekt ob'ektlari bilan operatsiyalar amalga oshiriladigan seanslarni yaratish. Bu erda biz ma'lumotlar manbasini, Hibernate xususiyatlarini va ob'ektlar sinflarini qaysi paketda izlashimiz kerakligini o'rnatamiz.
  • transactionManager— tranzaksiya menejerini sozlash uchun.
haqida kichik eslatma DataSource. Hujjatlarda aytilishicha, standart dasturdan foydalanish DriverManagerDataSourcetavsiya etilmaydi, chunki u faqat oddiy ulanishni birlashtirishning o'rnini bosadi va odatda faqat sinovlar va shunga o'xshashlar uchun javob beradi. Oddiy dastur uchun qandaydir DBCP kutubxonasidan foydalanish afzalroqdir. Xo'sh, bizning arizamiz uchun, albatta, bizda mavjud bo'lgan narsa etarli, ammo rasmni to'ldirish uchun, ehtimol, biz tavsiya etilgan boshqa dasturdan foydalanamiz. Keling, pom.xmlquyidagi bog'liqlikni qo'shamiz:
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
Va dataSourcesinf usulida HibernateConfigbiz uni paketdan biri DriverManagerDataSourcebilan almashtiramiz : BasicDataSourceorg.apache.tomcat.dbcp.dbcp2
BasicDataSource dataSource = new BasicDataSource();
Xo'sh, hamma narsa tayyor ko'rinadi, konfiguratsiya tayyor, uni AppInitializer- ga qo'shish qoladi :
protected Class<?>[] getRootConfigClasses() {
        return new Class[]{HibernateConfig.class};
    }

Ma'lumotlarga kirish qatlami

Nihoyat DAO bilan ishlashni boshlash vaqti keldi. Biz sinfga boramiz FilmDAOImplva birinchi navbatda u erdan sinov ro'yxatini o'chirib tashlaymiz, endi bizga kerak emas. Keling, sessiya zavodini qo'shamiz va u orqali ishlaymiz.
private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
Boshlash uchun biz filmlar ro'yxati bilan sahifani ko'rsatish usulini yaratamiz, unda biz seans olamiz va ma'lumotlar bazasiga so'rov yuboramiz (barcha yozuvlarni chiqarib, ro'yxatni shakllantirish):
public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }
Bu erda 2 ball bor. Birinchidan, ogohlantirish paydo bo'ldi. Buning sababi, biz parametrlangan ni olishni xohlaymiz List<Film>, lekin usul shunchaki qaytib keladi List, chunki kompilyatsiya vaqtida so'rov qaysi turdagi qaytarilishi noma'lum. Shunday qilib, g'oya bizni xavfli konvertatsiya qilayotganimizdan ogohlantiradi, bu esa muammoga olib kelishi mumkin. Bunday savol tug'ilmasligi uchun buni qilishning yana bir qancha to'g'ri usullari mavjud. Internetda ma'lumot qidirishingiz mumkin. Ammo endi bu bilan bezovta qilmaylik. Haqiqat shundaki, biz qaysi turdagi qaytarilishini aniq bilamiz, shuning uchun bu erda hech qanday muammo yuzaga kelmaydi, siz shunchaki ogohlantirishni e'tiborsiz qoldirishingiz mumkin. Ammo, ko'zlaringiz ko'zni qamashtirmasligi uchun siz usulning ustiga izoh osib qo'yishingiz mumkin @SupressWarning("unchecked"). Shunday qilib, biz kompilyatorga aytamiz, tashvishingiz uchun rahmat, do'stim, lekin men nima qilayotganimni bilaman va hamma narsa nazorat ostida, shuning uchun siz dam olishingiz va bu usul haqida tashvishlanmasligingiz mumkin. Ikkinchidan, g'oya qizil rangda " from Film" bilan chizilgan. Bu shunchaki HQL (Hibernate Query Language) so'rovi va fikr hamma narsa to'g'ri yoki xato borligini tushunmaydi. Siz g'oya sozlamalariga o'tishingiz va hamma narsani qo'lda sozlashingiz mumkin (agar qiziqsangiz Internetga qarang). Yoki siz shunchaki Kutish rejimi uchun qo'llab-quvvatlashni qo'shishingiz mumkin, buning uchun loyihani o'ng tugmasini bosing, Framework yordamini qo'shish-ni tanlang, Kutish uchun katakchani belgilang va OK tugmasini bosing. Shundan so'ng, ob'ekt sinfida ( Film) ko'p narsalar qizil rang bilan ta'kidlanadi, masalan, izohda "filmlar" jadvalini hal qila olmaydi@Table(name = "films") degan ogohlantirish paydo bo'ladi . Shunga qaramay, bu erda hech qanday yomon narsa yo'q, bu dizayn xatosi emas, hamma narsa kompilyatsiya qilinadi va ishlaydi. Bizning bazamiz haqida hech narsa bilmagani uchun g'oya ta'kidlangan. Buni tuzatish uchun keling, g'oyani ma'lumotlar bazasi bilan birlashtiramiz. Ko'rish -> Asbob Windows -> Doimiy (yorliq ochiladi) -> sichqonchaning o'ng tugmasi, Ma'lumotlar manbasida Ma'lumotlar manbalarini tayinlash -> ni tanlang , ma'lumotlar bazasiga ulanishni belgilang va OK tugmasini bosing . Bularning barchasi tuzatilganda, hali biror narsa qolgan edi. Keling, yuqori darajaga, xizmatga o'taylik. Sinfda biz bahor usulini izoh bilan belgilaymiz , bu usul tranzaktsiyada bajarilishi kerakligini ko'rsatadi (busiz Hibernate ishlashni rad etadi): Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (3-qism) - 3FilmServiceImplallFilms@Transactional
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
Shunday qilib, bu erda hamma narsa tayyor, siz boshqaruvchida hech narsaga tegishingiz shart emas. Xo'sh, haqiqat vaqti kelganga o'xshaydi, Run tugmasini bosing va nima bo'lishini ko'ring. Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (3-qism) - 4Mana, bizning belgimiz va bu safar biz o'zimiz sinfda tuzgan ro'yxatdan emas, balki ma'lumotlar bazasidan olingan. Ajoyib, hamma narsa ishlayotganga o'xshaydi. Endi biz barcha boshqa CRUD operatsiyalarini seans usullaridan foydalangan holda bajaramiz. Olingan sinf quyidagicha ko'rinadi:
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);
    }
}
Endi xizmatga borishni unutmaslik va usullarga izoh qo'shish qoladi @Transactional. Hammasi tayyor. Endi siz ishga tushirishingiz va tekshirishingiz mumkin. Havolalar va tugmalarni bosing, yozuvlarni qo'shish/o'chirish/tahrirlashga harakat qiling. Agar hamma narsa to'g'ri bajarilgan bo'lsa, u ishlashi kerak. Endi bu Hibernate, Spring, MySQL-dan foydalanadigan to'liq huquqli CRUD ilovasi. Davomi... Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasi bilan tanishtirish (1-qism) Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasi bilan tanishtirish (2-qism) Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasi (3-qism) Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (4-qism)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION