JavaRush /Blog Jawa /Random-JV /Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplika...
Макс
tingkat

Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3)

Diterbitake ing grup
sugeng sonten. Ing artikel iki aku pengin nuduhake ketemu pisanan karo bab kaya Maven, Spring, Hibernate, MySQL lan Tomcat ing proses nggawe aplikasi CRUD prasaja. Iki minangka bagean katelu saka 4. Artikel kasebut utamane kanggo wong-wong sing wis ngrampungake 30-40 tingkat ing kene, nanging durung ngupayakake ngluwihi Jawa murni lan lagi wae diwiwiti (utawa bakal diwiwiti) kanggo mlebu ing jagad terbuka kanthi kabeh teknologi iki, frameworks lan tembung ora pati ngerti. Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3) - 1Iki minangka bagean katelu saka artikel "Introduction to Maven, Spring, MySQL, Hibernate and the first CRUD application." Bagean sadurunge bisa dideleng kanthi ngetutake tautan:

Isi:

Nggawe lan nyambungake database

Inggih, iku wektu kanggo miwiti nggarap database. Sadurunge nyambungake Hibernate lan mikir babagan cara kerjane kabeh, ayo goleki database dhewe, yaiku. Ayo nggawe, nyambung, nggawe lan isi tandha. Kita bakal nggunakake DBMS (Sistem Manajemen Database) MySQL (mesthi, sampeyan kudu ngundhuh lan nginstal dhisik). SQL (Structured Query Language) minangka basa pamrograman deklaratif sing digunakake kanggo nggawe, ngowahi, lan ngapusi data ing basis data relasional. Ing basis data kasebut, data disimpen ing wangun tabel. Kepiye carane aplikasi komunikasi karo database (ngirim pitakon SQL menyang database lan ngasilake asil). Kanggo iki, Jawa duwe perkara kaya JDBC (Java DataBase Connectivity) , sing, kanthi gampang, minangka set antarmuka lan kelas kanggo nggarap database. Kanggo sesambungan karo database, sampeyan kudu nggawe sambungan; kanggo iki, paket java.sqlduwe kelas Connection. Ana sawetara cara kanggo nggawe sambungan, contone, sampeyan bisa nggunakake metode getConnectionkelas DriverManager. Nanging, interaksi karo database ora digawa metu langsung, amarga ana akeh database, lan padha beda. Dadi kanggo saben wong ana Driver JDBC dhewe. Nggunakake driver iki, sambungan menyang database digawe. Mula, luwih dhisik, supaya ora keganggu mengko, ayo nginstal driver MySQL . Ayo ditambahake pom.xmldependensi ing ngisor iki:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
Saiki ayo nggawe database. View -> Tool Windows -> Database - panel database bakal mbukak. Anyar (ijo +) -> Sumber Data -> MySQL - jendhela bakal mbukak sing sampeyan kudu nemtokake jeneng pangguna lan sandhi, kita nyetel nalika nginstal MySQL (contone, aku nggunakake root lan root). Port (standar kanggo MySQL 3306), jeneng, lsp. ninggalake iku minangka. Sampeyan bisa nyoba sambungan nggunakake tombol " Tes Sambungan ". Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3) - 2Klik OK lan saiki kita disambungake menyang server MySQL. Sabanjure, ayo nggawe database. Kanggo nindakake iki, sampeyan bisa nulis skrip ing console sing mbukak:
CREATE DATABASE test
Klik Execute lan database wis siyap, saiki sampeyan bisa nyambungake. Kanggo nindakake iki, bali menyang Data Source Properties lan ketik jeneng database (test) ing kolom Database, banjur ketik jeneng pangguna lan sandhi maneh banjur klik OK. Saiki kita kudu nggawe meja. Sampeyan bisa nggunakake alat grafis, nanging kanggo pisanan, sampeyan kudu nulis skrip kanthi tangan kanggo ndeleng kaya apa:
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);
Tabel digawe kanthi jeneng filmskanthi kolom id, titlelsp. Kanggo saben kolom, jinis dituduhake (ukuran output maksimal ing kurung).
  • PRIMARY KEY- iki minangka kunci utama, digunakake kanggo ngenali rekaman ing tabel kanthi unik (sing nuduhake keunikan)
  • AUTO_INCREMENT- Nilai bakal digawe kanthi otomatis (mesthi bakal ora nol, dadi sampeyan ora kudu nemtokake iki)
  • NOT NULL- kene kabeh uga ketok, iku ora bisa kosong
  • DEFAULT- nyetel nilai standar
  • COLLATE- enkoding
  • CREATE UNIQUE INDEX- nggawe lapangan unik
  • INSERT INTO- nambah rekaman menyang meja
Asil kasebut minangka tandha kaya iki: Mbok menawa sampeyan kudu nyoba nyambungake, mung saiki, kanthi kapisah saka aplikasi web kita. Apa yen ana masalah karo iki, banjur kita bakal langsung ngrampungake. Yen ora, mengko kita bakal nyambung Hibernate , nindakake soko, ngatur, tinker, lan yen kita kekacoan munggah nang endi wae, banjur paling kita bakal ngerti sing masalah ora kene. Inggih, kanggo mriksa sambungan, ayo nggawe cara main, sementara. Ing asas, sampeyan bisa sijine iku ngendi wae, malah ing kelas controller, malah ing model utawa konfigurasi, iku ora Matter, sampeyan mung kudu nggunakake kanggo mesthekake yen kabeh iku nggoleki karo sambungan lan sampeyan bisa mbusak. Nanging supaya luwih ati-ati, ayo nggawe kelas sing kapisah 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();
        }
    }
}
Kabeh iku prasaja ing kene, kita nyetel paramèter sambungan menyang database kita lan nyoba kanggo nggawe sambungan. Ayo diluncurake iki mainlan delengen. Dadi, aku entuk pangecualian, sawetara masalah zona wektu, lan sawetara bebaya liyane babagan SSL. Sawise browsing Internet, sampeyan bisa mangerteni sing iki masalah cukup umum, lan nalika nggunakake versi beda saka driver (mysql-konektor-Java), bisa sumpah beda. Contone, aku nemokake kanthi eksperimen yen nggunakake versi 5.1.47 ora ana pangecualian amarga zona wektu, sambungan kasebut digawe kanthi normal, nanging bebaya SSL isih muncul. Kanthi sawetara versi liyane, katon ana pangecualian babagan SSL, lan ora mung bebaya. Oke, dudu titik kasebut. Sampeyan bisa nyoba ngatasi masalah iki kanthi kapisah, nanging saiki ora bakal ditindakake. Solusi kanggo iki kabeh cukup prasaja, sampeyan kudu nemtokake paramèter tambahan ing url , yaiku serverTimezone, yen masalah karo zona wektu, lan useSSLyen masalah karo SSL:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
Saiki kita wis nyetel zona wektu lan mateni SSL. Kita miwiti maneh mainlan voila - Sambungan sukses! Inggih, apik, kita ngerti carane nggawe sambungan. Kelas Mainwis rampung tugas, sampeyan bisa mbusak.

ORM lan JPA

Kanthi cara sing apik, kanggo pangerten sing luwih apik, luwih becik miwiti kenal karo database kanthi urutan, saka wiwitan, tanpa hibernasi lan liya-liyane. Mulane, iku bakal dadi apike golek sawetara Panuntun lan pisanan nyoba kanggo nggarap kelas JDBC, nulis pitakon SQL kanthi manual lan ing. Inggih, ayo pindhah menyang model ORM langsung. Apa tegese iki? Mesthi wae, luwih becik maca babagan iki kanthi kapisah, nanging aku bakal nyoba njlèntrèhaké kanthi ringkes. ORM (Object-Relational Mapping utawa object-relational mapping) minangka teknologi kanggo pemetaan obyek menyang struktur basis data relasional, yaiku. kanggo makili obyek Jawa minangka baris tabel. Thanks kanggo ORM, sampeyan ora perlu kuwatir babagan nulis skrip SQL lan fokus nggarap obyek. Carane nggunakake. Jawa nduweni bab gedhe liyane, JPA (Java Persistence API), sing ngetrapake konsep ORM. JPA minangka spesifikasi kasebut; nggambarake syarat kanggo obyek, nemtokake macem-macem antarmuka lan anotasi kanggo nggarap database. JPA sejatine minangka deskripsi, standar. Mulane, ana akeh implementasine khusus, salah sijine (lan salah siji sing paling populer) yaiku Hibernate, sing dadi inti saka kerangka iki. Hibernate minangka implementasi saka spesifikasi JPA sing dirancang kanggo ngatasi masalah pemetaan obyek-relasional (ORM). Kita kudu nyambungake kabeh iki menyang proyek kita. Kajaba iku, supaya Spring kita ora ngadeg ing pinggir lan uga melu ing kabeh gerakan iki karo database, kita kudu nyambungake sawetara modul liyane, amarga kabeh sing kita entuk saka ketergantungan spring-webmvc ora cukup kanggo iki. Kita uga mbutuhake spring-jdbc kanggo nggarap database, spring-tx kanggo ndhukung transaksi, lan spring-orm kanggo nggarap Hibernate. Ayo nambah dependensi menyang 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>
Loro dependensi iki cukup. javax.persistence-apibakal teka bebarengan karo hibernate-inti , lan spring-jdbc lan spring-tx bebarengan karo spring-orm .

Entitas

Dadi, kita pengin obyek kelas Filmbisa disimpen ing database. Kanggo nindakake iki, kelas kudu nyukupi sawetara syarat. Ing JPA ana Entitas kanggo iki . Kelas entitas minangka kelas POJO biasa , kanthi lapangan pribadi lan getter lan setter kanggo dheweke. Iku kudu konstruktor non-pribadi tanpa paramèter (utawa konstruktor gawan), lan kudu tombol utami, i.e. soko sing unik bakal ngenali saben rekaman kelas iki ing database. Sampeyan uga bisa maca babagan kabeh syarat kanggo kelas kasebut kanthi kapisah. Ayo dadi Filmentitas kelas kita nggunakake anotasi JPA:
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- nuduhake yen kelas iki minangka entitas.
  • @Table- nuduhake tabel tartamtu kanggo nampilake entitas iki.
  • @Id- nuduhake yen kolom iki minangka kunci utama, yaiku. sifat iki bakal digunakake kanggo ngenali saben entri unik.
  • @Column- nyambungake lapangan menyang kolom tabel. Yen kolom lan jeneng kolom tabel padha, sampeyan bisa ngilangi.
  • @GeneratedValue- properti bakal digawe kanthi otomatis; sampeyan bisa nemtokake cara ing kurung. Saiki kita ora bakal ngerti kepiye strategi sing beda-beda. Cukup ngerti yen ing kasus iki saben nilai anyar bakal nambah 1 saka sing sadurunge.
Kanggo saben properti, sampeyan uga bisa nemtokake akeh liyane, contone, apa sing kudu non-nol utawa unik, nemtokake nilai standar, ukuran maksimum, etc. Iki bakal migunani yen sampeyan kudu nggawe tabel adhedhasar kelas iki; Hibernate duwe pilihan iki. Nanging kita wis nggawe meja dhewe lan ngatur kabeh sifat, supaya kita bisa nindakake tanpa iku. Cathetan cilik.Dokumentasi Hibernate nyaranake nggunakake anotasi ora ing lapangan, nanging ing getter. Nanging, prabédan antarane pendekatan iki cukup subtle lan ing aplikasi prasaja kita iki ora bakal duwe efek. Kajaba iku, umume wong sijine anotasi ing ndhuwur kolom. Mula ya ditinggal kaya mangkene, katon luwih rapi.

Properti Hibernate

Inggih, ayo miwiti nyetel Hibernate kita. Lan pisanan, ayo sijine sawetara informasi, kayata jeneng pangguna lan sandhi, url lan liya-liyane menyang file sing kapisah. Sampeyan bisa, mesthi, nemtokake minangka baris biasa langsung ing kelas, kaya nalika kita mriksa sambungan ( String username = "root";lan banjur liwati menyang cara kanggo nggawe sambungan). Nanging isih luwih bener kanggo nyimpen data statis kasebut ing sawetara propertyfile. Lan yen, umpamane, sampeyan kudu ngganti database, sampeyan ora kudu ngliwati kabeh kelas lan goleki ngendi digunakake, cukup kanggo ngganti nilai ing file iki sapisan. Ayo nggawe file db.properties ing direktori sumber daya :
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
Inggih, kabeh cetha saka ndhuwur, paramèter kanggo nyambung menyang database, i.e. jeneng kelas driver, url, jeneng pangguna lan sandhi. hibernate.dialect- sifat iki perlu kanggo nunjukaké kanggo Hibernate versi tartamtu saka basa SQL digunakake. Kasunyatane yaiku ing saben DBMS, kanggo nggedhekake kemampuan, nambah sawetara fungsi utawa ngoptimalake apa wae, biasane rada modernisasi basa kasebut. Akibaté, saben DBMS duwe dialek SQL dhewe. Kaya ing basa Inggris, kayane basa kasebut padha, nanging ing Australia, AS utawa Inggris bakal rada beda, lan sawetara tembung bisa uga duwe makna sing beda. Lan supaya ora ana masalah karo pangerten, sampeyan kudu langsung ngandhani Hibernate apa sing kudu ditindakake. hibernate.show_sql- thanks kanggo sifat iki, pitakon kanggo database bakal ditampilake ing console. Iki ora perlu, nanging karo bab iki, sampeyan bisa paling ora katon ing apa kedados, digunakake bisa koyone sing Hibernate nindakake sawetara jenis sihir. Ya, mesthi, ora bakal ditampilake kanthi jelas; luwih becik nggunakake sawetara jinis logger kanggo iki, nanging iki bakal ditindakake ing wektu liyane, saiki bakal ditindakake.

Konfigurasi hibernate

Ayo dadi pindhah menyang nyetel konfigurasi. configAyo nggawe kelas ing paket 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;
    }
}
Ana cukup akeh barang anyar ing kene, mula luwih becik goleki informasi babagan saben item ing macem-macem sumber. Ayo dirembug sedhela ing kene.
  • Kita @Configurationwis @ComponentScanngerti nalika nindakake kelas WebConfig.
  • @EnableTransactionManagement- ngidini sampeyan nggunakake TransactionManagerkanggo ngatur transaksi. Hibernate dianggo karo database nggunakake transaksi; padha dibutuhake kanggo pesawat tartamtu saka operasi kanggo nindakake minangka kabèh siji, i.e. yen metode kasebut duwe masalah karo operasi siji, mula kabeh liyane ora bakal ditindakake, supaya ora kedadeyan kaya ing conto klasik kanthi transfer dhuwit, nalika operasi penarikan dhuwit saka siji akun rampung, nanging operasi nulis kanggo liyane ora bisa, minangka asil dhuwit ilang.
  • @PropertySource- nyambungake file properti sing bubar digawe.
  • Environment- kanggo entuk properti saka propertyfile.
  • hibernateProperties- cara iki dibutuhake kanggo makili sifat Hibernate minangka obyek Properties
  • DataSource- digunakake kanggo nggawe sambungan menyang database. Iki minangka alternatif kanggo DriverManager , sing digunakake sadurunge nalika nggawe file main. Dokumentasi ujar manawa DataSourceluwih becik digunakake. Sing bakal kita tindakake, mesthi, ora lali kanggo maca ing Internet apa prabédan lan kaluwihan. Siji keuntungan utamane yaiku kemampuan kanggo nggawe Kolam Sambungan Database (DBCP).
  • sessionFactory- kanggo nggawe sesi kanthi bantuan operasi karo obyek entitas sing ditindakake. Ing kene kita nyetel sumber data, sifat Hibernate lan ing paket sing kudu kita goleki kelas entitas.
  • transactionManager- kanggo ngatur manager transaksi.
Cathetan cilik babagan DataSource. Dokumentasi kasebut nyatakake yen nggunakake implementasi standar, yaiku DriverManagerDataSource, ora dianjurake, amarga iku mung panggantos kanggo pooling sambungan normal lan umume mung cocok kanggo tes lan kuwi. Kanggo aplikasi normal, luwih becik nggunakake sawetara jinis perpustakaan DBCP. Inggih, kanggo aplikasi kita, mesthi, apa sing kita duwe cukup, nanging kanggo ngrampungake gambar, mbok menawa kita isih bakal nggunakake implementasine liyane kaya sing disaranake. Ayo ditambahake pom.xmldependensi ing ngisor iki:
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
Lan ing metode dataSourcekelas HibernateConfigkita ngganti DriverManagerDataSourcekaro BasicDataSourcesiji saka paket org.apache.tomcat.dbcp.dbcp2:
BasicDataSource dataSource = new BasicDataSource();
Ya, kabeh katon wis siyap, konfigurasi wis siyap, sing isih ana yaiku nambahake menyang AppInitializer :
protected Class<?>[] getRootConfigClasses() {
        return new Class[]{HibernateConfig.class};
    }

Lapisan akses data

Iki wektu kanggo miwiti DAO kita. We menyang kelas FilmDAOImpllan pisanan kabeh kita mbusak dhaftar nyoba saka ing kono, kita ora perlu maneh. Ayo nambah pabrik sesi lan ngupayakake.
private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
Kanggo miwiti, kita bakal nggawe cara kanggo nampilake kaca kanthi dhaptar film, ing kono kita bakal nampa sesi lan njaluk panjaluk menyang database (narik kabeh cathetan lan nggawe dhaptar):
public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }
Ana 2 titik ing kene. Pisanan, bebaya ditampilake. Iki amarga kasunyatan sing kita pengin nampa parameterized List<Film>, nanging cara bali mung Listamarga ing wektu kompilasi ora ngerti apa jinis panjalukan bakal bali. Dadi ide kasebut ngelingake yen kita nindakake konversi sing ora aman, sing bisa nyebabake masalah. Ana sawetara cara sing luwih bener kanggo nindakake iki supaya pitakonan kasebut ora muncul. Sampeyan bisa nggoleki informasi ing Internet. Nanging ayo saiki ora keganggu. Kasunyatane yaiku kita ngerti persis apa jinis sing bakal bali, mula ora ana masalah ing kene, sampeyan mung bisa nglirwakake bebaya kasebut. Nanging, supaya mripatmu ora ngrusak mripat, sampeyan bisa nyelehake anotasi ing ndhuwur metode kasebut @SupressWarning("unchecked"). Kanthi mengkono, kita jenis marang compiler, matur nuwun, konco, kanggo badhan, nanging aku ngerti apa aku lan duwe kabeh ing kontrol, supaya sampeyan bisa ngendhokke lan ora padha sumelang ing bab cara iki. Kapindho, ide kasebut digarisi abang " from Film". Iku mung pitakonan HQL (Hibernate Query Language) lan ide ora ngerti apa kabeh bener utawa ana kesalahan. Sampeyan bisa pindhah menyang setelan idea lan kanthi manual nyetel kabeh (katon ing Internet yen kasengsem). Utawa sampeyan mung bisa nambah dhukungan kanggo framework Hibernate, kanggo nindakake iki, klik-tengen ing project, pilih Tambah Dhukungan Framework , mriksa kothak kanggo Hibernate lan klik OK. Sawise iki, paling kamungkinan ing kelas entitas ( Film) akeh bab uga bakal digarisi abang, contone, ngendi anotasi @Table(name = "films")bakal nerbitake bebaya Ora bisa mutusake masalah tabel 'film' . Maneh, ora ana sing salah ing kene, iki dudu kesalahan desain, kabeh bakal dikompilasi lan bisa digunakake. Ide kasebut ditekanake amarga ora ngerti apa-apa babagan basis kita. Kanggo ndandani iki, ayo nggabungake ide kasebut karo database. View -> Tool Windows -> Persistense (tab bakal mbukak) -> tombol mouse tengen, pilih Assign Data Sources -> ing Data Source, nemtokake sambungan menyang database banjur klik OK . Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3) - 3Nalika kabeh iki didandani, isih ana sing isih ana. Ayo menyang tingkat sing luwih dhuwur, menyang layanan. Ing kelas, FilmServiceImplkita menehi tandha allFilmsmetode musim semi kanthi anotasi @Transactional, sing bakal nuduhake manawa metode kasebut kudu ditindakake ing transaksi (tanpa iki, Hibernate ora bakal bisa digunakake):
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
Dadi, kabeh wis siyap ing kene, sampeyan ora perlu ndemek apa wae ing pengontrol. Inggih, katon kaya wayahe bebener wis teka, klik Run lan ndeleng apa sing kedadeyan. Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3) - 4Lan ing kene, tandha kita, lan wektu iki dipikolehi ora saka dhaptar sing digawe dhewe ing kelas, nanging saka database. Apik, kabeh katon kerjane. Saiki kita nindakake kabeh operasi CRUD liyane kanthi cara sing padha nggunakake metode sesi. Kelas asil katon kaya iki:
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);
    }
}
Saiki sing isih ana yaiku aja lali pindhah menyang layanan lan nambah anotasi kanggo metode kasebut @Transactional. Wis, siap. Sampeyan saiki bisa mbukak lan mriksa. Klik link lan tombol, coba nambah / mbusak / ngowahi entri. Yen kabeh wis rampung kanthi bener, mesthine bisa. Saiki iki aplikasi CRUD lengkap nggunakake Hibernate, Spring, MySQL. Diterusake ... Ngenalake Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) Ngenalake Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 2) Ngenalake Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3) Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 4)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION