JavaRush /وبلاگ جاوا /Random-FA /مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنام...
Макс
مرحله

مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 3)

در گروه منتشر شد
عصر بخیر. در این مقاله می‌خواهم اولین برخورد خود را با مواردی مانند Maven، Spring، Hibernate، MySQL و Tomcat در فرآیند ایجاد یک برنامه ساده CRUD به اشتراک بگذارم. این قسمت سوم از 4 است. این مقاله در درجه اول برای کسانی در نظر گرفته شده است که قبلاً 30-40 سطح را در اینجا تکمیل کرده اند، اما هنوز از جاوای خالص فراتر نرفته اند و تازه شروع کرده اند (یا در شرف شروع) برای ورود به دنیای باز با همه این فن آوری ها، چارچوب ها و دیگر کلمات ناآشنا. مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 3) - 1این قسمت سوم مقاله «معرفی Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD» است. قسمت های قبلی را می توانید از طریق لینک های زیر مشاهده کنید:

محتوا:

ایجاد و اتصال پایگاه داده

خوب، زمان شروع کار بر روی پایگاه داده است. قبل از اتصال Hibernate و فکر کردن در مورد نحوه کارکرد آن در آنجا، ابتدا اجازه دهید به خود پایگاه داده نگاهی بیندازیم. بیایید آن را ایجاد کنیم، وصل کنیم، آن را بسازیم و علامت را پر کنیم. ما از DBMS (سیستم مدیریت پایگاه داده) MySQL استفاده خواهیم کرد (البته ابتدا باید دانلود و نصب کنید). SQL (زبان پرس و جوی ساختاریافته) یک زبان برنامه نویسی اعلامی است که برای ایجاد، اصلاح و دستکاری داده ها در پایگاه داده رابطه ای استفاده می شود. در این گونه پایگاه داده ها داده ها در قالب جداول ذخیره می شوند. چگونه برنامه با پایگاه داده ارتباط برقرار می کند (انتقال پرس و جوهای SQL به پایگاه داده و برگرداندن نتایج). برای این کار، جاوا چیزی به نام JDBC (اتصال پایگاه داده جاوا) دارد که به زبان ساده مجموعه ای از رابط ها و کلاس ها برای کار با پایگاه های داده است. برای تعامل با پایگاه داده، باید یک اتصال ایجاد کنید؛ برای این، بسته java.sqlدارای یک کلاس است Connection. راه های مختلفی برای ایجاد یک اتصال وجود دارد، به عنوان مثال می توانید از متد getConnectionکلاس استفاده کنید DriverManager. با این حال، تعامل با پایگاه داده به طور مستقیم انجام نمی شود، زیرا پایگاه های داده بسیاری وجود دارد و آنها متفاوت هستند. بنابراین برای هر یک از آنها JDBC Driver مخصوص به خود وجود دارد با استفاده از این درایور، اتصال به پایگاه داده برقرار می شود. بنابراین، اول از همه، برای اینکه بعداً حواسمان به این موضوع پرت نشود، بیایید درایور MySQL را نصب کنیم . بیایید pom.xmlوابستگی زیر را اضافه کنیم:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
حالا بیایید پایگاه داده را ایجاد کنیم. نمایش -> ابزار ویندوز -> پایگاه داده - پانل پایگاه داده باز می شود. جدید (سبز +) -> منبع داده -> MySQL - پنجره ای باز می شود که در آن باید نام کاربری و رمز عبور را مشخص کنید، ما آنها را هنگام نصب MySQL تنظیم می کنیم (مثلاً من از root و root استفاده کردم). پورت (پیش‌فرض برای MySQL 3306)، نام و غیره. آن را همانطور که هست رها کن می توانید اتصال را با استفاده از دکمه " Test Connection " آزمایش کنید. روی OKمقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 3) - 2 کلیک کنید و اکنون به سرور MySQL متصل هستیم. بعد، بیایید یک پایگاه داده ایجاد کنیم. برای انجام این کار، می توانید یک اسکریپت در کنسولی که باز می شود بنویسید:
CREATE DATABASE test
روی Execute کلیک کنید و دیتابیس آماده است، حالا می توانید آن را متصل کنید، برای این کار به Data Source Properties برگردید و در قسمت Database نام پایگاه داده (test) را وارد کنید، سپس مجددا نام کاربری و رمز عبور را وارد کرده و OK کنید. حالا باید یک جدول درست کنیم. می توانید از ابزارهای گرافیکی استفاده کنید، اما برای اولین بار، احتمالاً ارزش نوشتن یک اسکریپت با دست را دارد تا ببینید چه شکلی است:
USE test;

CREATE TABLE films
(
  id int(10) PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  year int(4),
  genre VARCHAR(20),
  watched BIT DEFAULT false  NOT NULL
)
COLLATE='utf8_general_ci';
CREATE UNIQUE INDEX films_title_uindex ON films (title);

INSERT INTO `films` (`title`,`year`,`genre`, watched)
VALUES
  ("Inception", 2010, "sci-fi", 1),
  ("The Lord of the Rings: The Fellowship of the Ring", 2001, "fantasy", 1),
  ("Tag", 2018, "comedy", 0),
  ("Gunfight at the O.K. Corral", 1957, "western", 0),
  ("Die Hard", 1988, "action", 1);
یک جدول با نام filmsبا ستون ها idو titleغیره ایجاد می شود. برای هر ستون، نوع مشخص شده است (حداکثر اندازه خروجی در پرانتز).
  • PRIMARY KEY- این کلید اصلی است که برای شناسایی منحصر به فرد یک رکورد در جدول استفاده می شود (که دلالت بر منحصر به فرد بودن دارد)
  • AUTO_INCREMENT- مقدار به طور خودکار تولید می شود (البته غیر صفر خواهد بود، بنابراین لازم نیست این را مشخص کنید)
  • NOT NULL- در اینجا همه چیز نیز واضح است، نمی تواند خالی باشد
  • DEFAULT- مقدار پیش فرض را تنظیم کنید
  • COLLATE- رمزگذاری
  • CREATE UNIQUE INDEX- زمینه را منحصر به فرد کنید
  • INSERT INTO- یک رکورد به جدول اضافه کنید
نتیجه علامتی مانند این است: شاید ارزش تلاش برای اتصال به آن را داشته باشد، فقط در حال حاضر، جدا از برنامه وب ما. اگر مشکلاتی در این مورد ایجاد شود، چه می‌شود، بلافاصله آن را حل می‌کنیم. در غیر این صورت، بعداً Hibernate را وصل می‌کنیم، کاری انجام می‌دهیم، پیکربندی می‌کنیم، سرهم‌بندی می‌کنیم و اگر جایی را به هم زدیم، حداقل می‌دانیم که مشکل اینجا نیست. خوب، برای بررسی اتصال، اجازه دهید یک روش main، به طور موقت ایجاد کنیم. در اصل، می توانید آن را در هر جایی قرار دهید، حتی در کلاس کنترلر، حتی در مدل یا پیکربندی، مهم نیست، فقط باید از آن استفاده کنید تا مطمئن شوید که همه چیز با اتصال خوب است و می توانید آن را حذف کنید. اما برای دقت بیشتر، بیایید یک کلاس جداگانه برای آن ایجاد کنیم Main:
package testgroup.filmography;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "root";
        System.out.println("Connecting...");

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            System.out.println("Connection successful!");
        } catch (SQLException e) {
            System.out.println("Connection failed!");
            e.printStackTrace();
        }
    }
}
همه چیز در اینجا ساده است، ما پارامترهای اتصال را به پایگاه داده خود تنظیم می کنیم و سعی می کنیم یک اتصال ایجاد کنیم. بیایید این یکی را راه اندازی کنیم mainو نگاهی بیندازیم. بنابراین، من یک استثنا، برخی مشکلات منطقه زمانی، و برخی هشدارهای دیگر در مورد SSL دریافت کردم. پس از گشت و گذار در اینترنت، می توانید متوجه شوید که این یک مشکل نسبتاً رایج است و هنگام استفاده از نسخه های مختلف درایور (mysql-connector-java)، می تواند به طور متفاوتی قسم بخورد. به عنوان مثال، من به صورت آزمایشی متوجه شدم که هنگام استفاده از نسخه 5.1.47 هیچ استثنایی به دلیل منطقه زمانی وجود ندارد، اتصال به طور معمول ایجاد می شود، اما هشدار SSL همچنان ظاهر می شود. با برخی از نسخه های دیگر به نظر می رسید که در مورد SSL یک استثنا وجود دارد و نه فقط یک هشدار. خوب، این موضوع نیست. می توانید سعی کنید به طور جداگانه با این موضوع برخورد کنید، اما ما اکنون به آن نمی پردازیم. راه حل این همه بسیار ساده است، شما باید پارامترهای اضافی را در url مشخص کنید ، یعنی serverTimezoneاگر مشکل مربوط به منطقه زمانی است، و useSSLاگر مشکل از SSL است:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
اکنون منطقه زمانی را تنظیم کرده و SSL را غیرفعال کرده ایم. ما آن را دوباره راه اندازی کردیم mainو voila - اتصال موفق شد! خوب، عالی، ما متوجه شدیم که چگونه یک اتصال ایجاد کنیم. کلاس Mainاساسا وظیفه خود را انجام داده است، می توانید آن را حذف کنید.

ORM و JPA

به بیان خوب، برای درک بهتر، بهتر است از همان ابتدا و بدون هیبرنیت و موارد دیگر، به ترتیب با پایگاه های داده آشنا شوید. بنابراین، ایده خوبی است که چند راهنما پیدا کنید و ابتدا سعی کنید با کلاس های JDBC کار کنید، پرس و جوهای SQL را به صورت دستی بنویسید و غیره. خوب، بیایید فوراً به سراغ مدل ORM برویم. این یعنی چی؟ البته باز هم توصیه می شود در این مورد جداگانه مطالعه کنید، اما سعی می کنم به اختصار آن را شرح دهم. ORM (نگاشت شی - رابطه یا نگاشت شی - رابطه ای) یک فناوری برای نگاشت اشیاء در ساختارهای پایگاه داده رابطه ای است. برای نشان دادن شی جاوا ما به عنوان یک ردیف جدول. به لطف ORM، لازم نیست نگران نوشتن اسکریپت های SQL باشید و روی کار با اشیا تمرکز کنید. نحوه استفاده از آن. جاوا یک چیز عالی دیگر، JPA (Java Persistence API) دارد که مفهوم ORM را پیاده سازی می کند. JPA چنین مشخصاتی است؛ الزامات اشیاء را توصیف می کند، رابط ها و حاشیه نویسی های مختلفی را برای کار با پایگاه داده تعریف می کند. JPA اساساً یک توصیف، یک استاندارد است. بنابراین، بسیاری از پیاده سازی های خاص وجود دارد که یکی از آنها (و یکی از محبوب ترین آنها) Hibernate است که ماهیت این فریم ورک است. Hibernate یک پیاده سازی از مشخصات JPA است که برای حل مشکلات نگاشت شی رابطه ای (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>
همین دو وابستگی کافی است. javax.persistence-apiهمراه با hibernate-core و Spring-jdbc و Spring-tx به همراه Spring-orm وارد می شود .

وجود، موجودیت

بنابراین ما می خواهیم که اشیاء کلاس Filmبتوانند در پایگاه داده ذخیره شوند. برای انجام این کار، کلاس باید تعدادی از شرایط را برآورده کند. در JPA چیزی به نام Entity برای این وجود دارد . کلاس موجودیت یک کلاس POJO معمولی است که فیلدهای خصوصی و گیرنده و تنظیم کننده برای آنها دارد. باید سازنده غیر خصوصی بدون پارامتر (یا سازنده پیش‌فرض) داشته باشد و باید یک کلید اصلی داشته باشد. چیزی که به طور منحصر به فرد هر رکورد این کلاس را در پایگاه داده شناسایی می کند. شما همچنین می توانید در مورد تمام الزامات چنین کلاسی به طور جداگانه مطالعه کنید. بیایید کلاس خود را Filmبا استفاده از حاشیه نویسی 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- نشان می دهد که این کلاس یک موجودیت است.
  • @Table- برای نمایش این موجودیت به جدول خاصی اشاره می کند.
  • @Id- نشان می دهد که این فیلد یک کلید اصلی است، یعنی. این ویژگی برای شناسایی هر ورودی منحصر به فرد استفاده خواهد شد.
  • @Column- یک فیلد را به یک ستون جدول متصل می کند. اگر نام ستون و فیلد جدول یکسان است، می توانید آنها را حذف کنید.
  • @GeneratedValue- ویژگی به طور خودکار تولید می شود؛ در پرانتز می توانید نحوه تعیین کنید. اکنون متوجه نمی شویم که استراتژی های مختلف دقیقا چگونه کار می کنند. کافی است بدانید که در این حالت هر مقدار جدید نسبت به مقدار قبلی 1 برابر خواهد شد.
برای هر ویژگی، می‌توانید موارد دیگری را نیز مشخص کنید، به عنوان مثال، چه چیزی باید غیرصفر یا منحصر به فرد باشد، مقدار پیش‌فرض، حداکثر اندازه و غیره را مشخص کنید. اگر نیاز به ایجاد جدول بر اساس این کلاس دارید، این کار مفید خواهد بود؛ Hibernate این گزینه را دارد. اما ما قبلا خود جدول را ایجاد کرده ایم و تمام ویژگی ها را پیکربندی کرده ایم، بنابراین می توانیم بدون آن کار کنیم. یک یادداشت کوچکاسناد Hibernate استفاده از حاشیه نویسی را نه در فیلدها، بلکه در گیرنده ها توصیه می کند. با این حال، تفاوت بین این رویکردها کاملاً ظریف است و در برنامه ساده ما این هیچ تأثیری نخواهد داشت. به علاوه، اکثر مردم به هر حال حاشیه نویسی را در بالای فیلدها قرار می دهند. بنابراین، بیایید آن را اینگونه رها کنیم، به نظر تمیزتر می رسد.

Hibernate Properties

خب، بیایید راه اندازی Hibernate خود را شروع کنیم. و اول از همه، اجازه دهید اطلاعاتی مانند نام کاربری و رمز عبور، 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
خوب، همه چیز از بالا مشخص است، پارامترهای اتصال به پایگاه داده، یعنی. نام کلاس راننده، آدرس اینترنتی، نام کاربری و رمز عبور. hibernate.dialect- این ویژگی برای نشان دادن نسخه خاصی از زبان SQL برای Hibernate مورد نیاز است. واقعیت این است که در هر DBMS، به منظور گسترش قابلیت ها، اضافه کردن برخی عملکردها یا بهینه سازی چیزی، معمولاً زبان را کمی مدرن می کنند. در نتیجه، معلوم می شود که هر DBMS گویش SQL مخصوص به خود را دارد. مانند انگلیسی است، به نظر می رسد که زبان یکسان است، اما در استرالیا، ایالات متحده آمریکا یا بریتانیا کمی متفاوت خواهد بود، و برخی از کلمات ممکن است معانی متفاوتی داشته باشند. و برای جلوگیری از هرگونه مشکل در درک، باید مستقیماً به Hibernate بگویید که دقیقاً با چه چیزی سر و کار دارد. hibernate.show_sql- به لطف این ویژگی، پرس و جوهای مربوط به پایگاه داده در کنسول نمایش داده می شود. این لازم نیست، اما با این چیز می توانید حداقل به آنچه در حال رخ دادن است نگاه کنید، در غیر این صورت ممکن است به نظر برسد که Hibernate در حال انجام نوعی جادو است. خوب، البته، نمایش کاملاً واضح نخواهد بود؛ بهتر است از نوعی لاگر برای این کار استفاده کنید، اما این چیزی برای زمان دیگری است، در حال حاضر این کار را انجام می دهد.

تنظیمات 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 به عنوان یک شیء Properties مورد نیاز است
  • DataSource- برای ایجاد اتصال به پایگاه داده استفاده می شود. این جایگزینی برای DriverManager است که قبلاً هنگام ایجاد آن از آن استفاده کردیم main. مستندات می گوید که DataSourceاستفاده از آن ترجیح داده می شود. این کاری است که ما انجام خواهیم داد، البته فراموش نکنیم که در اینترنت بخوانید تفاوت و مزایا. یکی از مزایای خاص این است که توانایی ایجاد یک پایگاه ارتباطی پایگاه داده (DBCP) است.
  • sessionFactory- برای ایجاد جلساتی که به کمک آنها عملیات با اشیاء موجودیت انجام می شود. در اینجا منبع داده، خصوصیات Hibernate را تنظیم می کنیم و در کدام بسته باید به دنبال کلاس های موجودیت بگردیم.
  • transactionManager- برای پیکربندی مدیر تراکنش.
یک یادداشت کوچک در مورد DataSource. مستندات می گوید که استفاده از اجرای استاندارد، یعنی DriverManagerDataSource، توصیه نمی شود، زیرا این تنها جایگزینی برای اتصال معمولی است و به طور کلی فقط برای آزمایش ها و موارد دیگر مناسب است. برای یک برنامه معمولی، ترجیحاً از نوعی کتابخانه DBCP استفاده شود. خوب، برای برنامه ما، البته، آنچه در اختیار داریم کافی است، اما برای تکمیل تصویر، شاید همچنان طبق توصیه از اجرای دیگری استفاده کنیم. بیایید pom.xmlوابستگی زیر را اضافه کنیم:
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
و در متد dataSourceکلاس آن را با یکی از پکیج HibernateConfigجایگزین می کنیم : DriverManagerDataSourceBasicDataSourceorg.apache.tomcat.dbcp.dbcp2
BasicDataSource dataSource = new BasicDataSource();
خوب، به نظر می رسد همه چیز آماده است، پیکربندی آماده است، تنها چیزی که باقی می ماند این است که آن را به AppInitializer خود اضافه کنیم :
protected Class<?>[] getRootConfigClasses() {
        return new Class[]{HibernateConfig.class};
    }

لایه دسترسی به داده

زمان آن است که بالاخره با DAO خود شروع کنیم. به کلاس می رویم FilmDAOImplو اول از همه لیست آزمایشی را از آنجا حذف می کنیم، دیگر نیازی به آن نداریم. بیایید یک کارخانه جلسه اضافه کنیم و از طریق آن کار کنیم.
private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
برای شروع، ما روشی برای نمایش یک صفحه با لیستی از فیلم ها ایجاد می کنیم، در آن یک جلسه دریافت می کنیم و درخواستی را به پایگاه داده می دهیم (با بیرون کشیدن تمام رکوردها و تشکیل یک لیست):
public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }
در اینجا 2 نکته وجود دارد. ابتدا یک هشدار نمایش داده شد. این به این دلیل است که ما می‌خواهیم پارامتری را دریافت کنیم List<Film>، اما روش صرفاً به Listاین دلیل برمی‌گردد که در زمان کامپایل مشخص نیست که درخواست چه نوع درخواستی را برمی‌گرداند. بنابراین این ایده به ما هشدار می دهد که در حال انجام یک تبدیل ناامن هستیم که ممکن است منجر به مشکل شود. چندین روش صحیح دیگر برای این کار وجود دارد تا چنین سوالی پیش نیاید. می توانید اطلاعات را در اینترنت جستجو کنید. اما بیایید با این موضوع اکنون خود را خسته نکنیم. واقعیت این است که ما دقیقاً می دانیم که چه نوع بازگردانده می شود، بنابراین هیچ مشکلی در اینجا ایجاد نمی شود، می توانید به سادگی هشدار را نادیده بگیرید. اما، برای اینکه چشمان شما درد چشم نباشد، می توانید یک حاشیه نویسی را بالای روش آویزان کنید @SupressWarning("unchecked"). با این کار به کامپایلر می گوییم، رفیق، از نگرانی شما متشکرم، اما من می دانم که دارم چه کار می کنم و همه چیز را تحت کنترل دارم، بنابراین می توانید آرامش داشته باشید و نگران این روش نباشید. ثانیاً، زیر این ایده با رنگ قرمز " from Film" خط کشیده شده است. این فقط یک جستار HQL (زبان جستجوی Hibernate) است و این ایده نمی‌داند که آیا همه چیز درست است یا خطایی وجود دارد. می توانید به تنظیمات ایده بروید و همه چیز را به صورت دستی تنظیم کنید (در صورت تمایل به اینترنت نگاه کنید). یا می توانید به سادگی پشتیبانی از چارچوب Hibernate اضافه کنید، برای انجام این کار، روی پروژه کلیک راست کرده، Add Framework Support را انتخاب کنید ، کادر Hibernate را علامت بزنید و OK را کلیک کنید. پس از این، به احتمال زیاد در کلاس موجودیت ( Film) زیر بسیاری از چیزها نیز با قرمز خط کشیده می شود، به عنوان مثال، جایی که حاشیه نویسی @Table(name = "films")اخطار را صادر می کند Cannot remove table 'films' . باز هم اینجا هیچ اشکالی ندارد، این یک خطای طراحی نیست، همه چیز کامپایل می شود و کار می کند. این ایده مورد تاکید قرار می گیرد زیرا چیزی در مورد پایگاه ما نمی داند. برای رفع این مشکل، بیایید این ایده را با پایگاه داده ادغام کنیم. مشاهده -> Tool Windows -> Persistense (یک برگه باز می شود) -> دکمه سمت راست ماوس، Assign Data Sources -> را در Data Source انتخاب کنید، اتصال به پایگاه داده را مشخص کنید و روی OK کلیک کنید . مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 3) - 3وقتی همه اینها درست شد، هنوز چیزی باقی مانده بود. بیایید به یک سطح بالاتر برویم، به سمت خدمات. در کلاس، متد بهار را با یک حاشیه FilmServiceImplمشخص می کنیم که نشان می دهد متد باید در یک تراکنش اجرا شود (بدون این، Hibernate از کار کردن خودداری می کند): allFilms@Transactional
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
بنابراین، همه چیز در اینجا آماده است، لازم نیست چیزی را در کنترلر لمس کنید. خوب، به نظر می رسد که لحظه حقیقت فرا رسیده است، روی Run کلیک کنید و ببینید چه اتفاقی می افتد. مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 3) - 4و اینجاست، علامت ما، و این بار نه از فهرستی که خودمان درست در کلاس درست کردیم، بلکه از یک پایگاه داده به دست آمد. عالی، به نظر می رسد همه چیز کار می کند. اکنون سایر عملیات CRUD را با استفاده از متدهای جلسه به همین ترتیب انجام می دهیم. کلاس حاصل به این صورت است:
package testgroup.filmography.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import testgroup.filmography.model.Film;

import java.util.List;

@Repository
public class FilmDAOImpl implements FilmDAO {
    private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }

    @Override
    public void add(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.persist(film);
    }

    @Override
    public void delete(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.delete(film);
    }

    @Override
    public void edit(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.update(film);
    }

    @Override
    public Film getById(int id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Film.class, id);
    }
}
اکنون تنها چیزی که باقی می ماند این است که فراموش نکنید که به سرویس بروید و یک حاشیه نویسی به متدها اضافه کنید @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)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION