JavaRush /جاوا بلاگ /Random-SD /Maven جو تعارف، اسپرنگ، MySQL، Hibernate ۽ پھرين CRUD ايپ...
Макс
سطح

Maven جو تعارف، اسپرنگ، MySQL، Hibernate ۽ پھرين CRUD ايپليڪيشن (حصو 3)

گروپ ۾ شايع ٿيل
منجهند جو سلام. هن آرٽيڪل ۾ آئون هڪ سادي CRUD ايپليڪيشن ٺاهڻ جي عمل ۾ Maven، Spring، Hibernate، MySQL ۽ Tomcat جهڙين شين سان منهنجي پهرين ملاقات کي حصيداري ڪرڻ چاهيان ٿو. هي 4 جو ٽيون حصو آهي. مضمون بنيادي طور تي انهن لاءِ آهي جيڪي اڳي ئي هتي 30-40 سطحون مڪمل ڪري چڪا آهن، پر اڃا تائين خالص جاوا کان ٻاهر نه ويا آهن ۽ صرف شروعات ڪري رهيا آهن (يا شروع ٿيڻ وارا آهن) کليل دنيا ۾ داخل ٿيڻ لاءِ. اهي سڀ ٽيڪنالاجيون، فريم ورڪ ۽ ٻيا اڻ واقف لفظ. Maven جو تعارف، اسپرنگ، MySQL، Hibernate ۽ پھرين CRUD ايپليڪيشن (حصو 3) - 1هي مضمون جو ٽيون حصو آهي "Introduction to Maven, Spring, MySQL, Hibernate and the first CRUD application." پويون حصا ڏسي سگهجن ٿا لنڪ هيٺ ڏنل:

مواد:

ڊيٽابيس ٺاهڻ ۽ ڳنڍڻ

خير، اهو ڊيٽابيس تي ڪم ڪرڻ شروع ڪرڻ جو وقت آهي. هئبرنيٽ کي ڳنڍڻ کان اڳ ۽ سوچڻ گهرجي ته اهو سڀ اتي ڪيئن ڪم ڪرڻ گهرجي، پهرين اچو ته ڊيٽابيس پاڻ کي ڏسو، يعني. اچو ته ان کي ٺاهيو، ان کي ڳنڍيو، ان کي ٺاهيو ۽ نشان ڀريو. اسان استعمال ڪنداسين ڊي بي ايم ايس (ڊيٽابيس مينيجمينٽ سسٽم) MySQL (يقينا، توهان کي پهريان ڊائون لوڊ ۽ انسٽال ڪرڻ گهرجي). SQL (Structured Query Language) ھڪ بياني پروگرامنگ ٻولي آھي جنھن کي ھڪ تعلقي ڊيٽابيس ۾ ڊيٽا ٺاھڻ، تبديل ڪرڻ ۽ تبديل ڪرڻ لاءِ استعمال ڪيو ويندو آھي. اهڙين ڊيٽابيس ۾، ڊيٽا ٽيبل جي صورت ۾ ذخيرو ٿيل آهي. ايپليڪيشن ڊيٽابيس سان ڪيئن رابطو ڪري ٿي (ڊيٽابيس ڏانهن SQL سوالن کي منتقل ڪرڻ ۽ نتيجن کي واپس ڪرڻ). ان لاءِ، جاوا وٽ JDBC (Java DataBase Connectivity) جهڙي شيءِ آهي ، جيڪا آسانيءَ سان، ڊيٽابيس سان ڪم ڪرڻ لاءِ انٽرفيس ۽ ڪلاسن جو هڪ سيٽ آهي. ڊيٽابيس سان لهه وچڙ ڪرڻ لاءِ، توهان کي هڪ ڪنيڪشن ٺاهڻ جي ضرورت آهي؛ ان لاءِ، پيڪيج java.sql۾ هڪ ڪلاس آهي Connection. ڪنيڪشن قائم ڪرڻ جا ڪيترائي طريقا آھن، مثال طور توھان استعمال ڪري سگھو ٿا getConnectionclass method DriverManager. بهرحال، ڊيٽابيس سان رابطو سڌو سنئون نه ڪيو ويو آهي، ڇاڪاڻ ته اتي ڪيترائي ڊيٽابيس آهن، ۽ اهي مختلف آهن. تنهن ڪري انهن مان هر هڪ لاءِ پنهنجو JDBC ڊرائيور هوندو آهي، هن ڊرائيور کي استعمال ڪرڻ سان، ڊيٽابيس سان ڪنيڪشن قائم ٿيندو آهي. تنهن ڪري، سڀ کان پهريان، جيئن هن کان پوء پريشان نه ٿئي، اچو ته انسٽال ڪريون MySQL ڊرائيور . اچو ته pom.xmlھيٺ ڏنل انحصار شامل ڪريو:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
هاڻي اچو ته ڊيٽابيس ٺاهي. ڏسو -> اوزار ونڊوز -> ڊيٽابيس - ڊيٽابيس پينل کلي ويندو. نئون (سائي +) -> ڊيٽا جو ذريعو -> MySQL - هڪ ونڊو کلي ويندي جنهن ۾ توهان کي صارف نالو ۽ پاسورڊ بيان ڪرڻ جي ضرورت آهي، اسان انهن کي سيٽ ڪيو جڏهن MySQL انسٽال ڪيو (مثال طور، مون روٽ ۽ روٽ استعمال ڪيو). پورٽ (ڊفالٽ MySQL 3306 لاءِ)، نالو، وغيره. ان کي ڇڏي ڏيو جيئن آهي. توهان " ٽيسٽ ڪنيڪشن " بٽڻ کي استعمال ڪندي ڪنيڪشن کي جانچ ڪري سگهو ٿا . OKMaven جو تعارف، اسپرنگ، MySQL، Hibernate ۽ پھرين CRUD ايپليڪيشن (حصو 3) - 2 تي ڪلڪ ڪريو ۽ ھاڻي اسان MySQL سرور سان ڳنڍيل آھيون. اڳيون، اچو ته هڪ ڊيٽابيس ٺاهي. هن کي ڪرڻ لاء، توهان ڪنسول ۾ هڪ اسڪرپٽ لکي سگهو ٿا جيڪو کلي ٿو:
CREATE DATABASE test
Execute تي ڪلڪ ڪريو ۽ ڊيٽابيس تيار آھي، ھاڻي توھان ان کي ڳنڍي سگھو ٿا، اھو ڪرڻ لاءِ، واپس وڃو Data Source Properties ۽ ڊيٽابيس جي فيلڊ ۾ ڊيٽابيس جو نالو (ٽيسٽ) داخل ڪريو، پوءِ وري يوزرنيم ۽ پاسورڊ داخل ڪريو ۽ اوڪي تي ڪلڪ ڪريو. هاڻي اسان کي ٽيبل ٺاهڻ جي ضرورت آهي. توهان گرافڪ اوزار استعمال ڪري سگهو ٿا، پر پهريون ڀيرو، اهو شايد هٿ سان اسڪرپٽ لکڻ جي قابل آهي اهو ڏسڻ لاءِ ته اهو ڇا ٿو لڳي:
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۽ وائيلا - ڪنيڪشن ڪامياب! چڱو، عظيم، اسان اهو معلوم ڪيو ته هڪ ڪنيڪشن ڪيئن ٺاهيو. ڪلاس Mainبنيادي طور تي پنهنجو ڪم مڪمل ڪيو آهي، توهان ان کي ختم ڪري سگهو ٿا.

ORM ۽ JPA

سٺي طريقي سان، بهتر سمجھڻ لاء، اهو بهتر آهي ته ڊيٽابيس جي ترتيب سان واقف ٿيڻ شروع ڪيو وڃي، بلڪل شروع کان، بغير ڪنهن hibernates ۽ ٻين شين جي. تنهن ڪري، اهو هڪ سٺو خيال هوندو ته ڪجهه گائيڊ ڳولڻ ۽ پهرين ڪوشش ڪرڻ جي ڪوشش ڪريو JDBC ڪلاسز سان، دستي طور تي SQL سوالن کي لکو وغيره. خير، اچو ته اڳتي وڌون ORM ماڊل تي. هن جو مطلب ڇا آهي؟ يقينن، اهو ٻيهر مشورو آهي ته ان بابت الڳ الڳ، پر آئون مختصر طور تي بيان ڪرڻ جي ڪوشش ڪندس. ORM (Object-Relational Mapping or object-relational mapping) هڪ ٽيڪنالاجي آهي جيڪا شين جي نقشي کي لاڳاپيل ڊيٽابيس جي جوڙجڪ ۾، يعني. اسان جي جاوا اعتراض کي ٽيبل قطار جي طور تي نمائندگي ڪرڻ لاء. ORM جي مهرباني، توهان کي SQL اسڪرپٽ لکڻ جي باري ۾ پريشان ٿيڻ جي ضرورت ناهي ۽ شيون سان ڪم ڪرڻ تي ڌيان ڏيڻ. ان کي ڪيئن استعمال ڪجي. جاوا وٽ هڪ ٻي وڏي شيءِ آهي، JPA (Java Persistence API)، جيڪو ORM تصور کي لاڳو ڪري ٿو. JPA هڪ اهڙي وضاحت آهي؛ اها شين جي گهرج کي بيان ڪري ٿي، اها ڊيٽابيس سان ڪم ڪرڻ لاءِ مختلف انٽرفيس ۽ تشريحون بيان ڪري ٿي. JPA بنيادي طور تي هڪ وضاحت، هڪ معيار آهي. تنهن ڪري، اتي ڪيترائي خاص عمل آهن، جن مان هڪ (۽ سڀ کان وڌيڪ مشهور) Hibernate آهي، جيڪو هن فريم ورڪ جو بنياد آهي. Hibernate JPA وضاحتن جو هڪ نفاذ آهي جيڪو اعتراض سان لاڳاپيل ميپنگ (ORM) مسئلن کي حل ڪرڻ لاءِ ٺهيل آهي. اسان کي هن سڄي شيء کي اسان جي منصوبي سان ڳنڍڻ جي ضرورت آهي. ان کان علاوه، اسان جي بهار لاءِ نه ته ڪناري تي بيهڻ ۽ پڻ هن سموري تحريڪ ۾ ڊيٽابيس سان گڏ حصو وٺڻ لاءِ، اسان کي ڪجهه وڌيڪ ماڊلز کي ڳنڍڻ جي ضرورت آهي، ڇاڪاڻ ته هر شيءِ جيڪا اسان spring-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-corejavax.persistence-api سان گڏ ايندا ، ۽ spring-jdbc ۽ spring-tx سان گڏ spring-orm .

وجود

تنهنڪري اسان چاهيون ٿا ته طبقاتي شيون Filmڊيٽابيس ۾ محفوظ ٿيڻ جي قابل ٿي وڃن. هن کي ڪرڻ لاء، طبقي کي ڪجهه شرطن کي پورو ڪرڻ گهرجي. JPA ۾ اهڙي شيءِ آهي جيئن هن لاءِ هڪ ادارو . هڪ ادارو ڪلاس هڪ عام POJO ڪلاس آهي، جنهن ۾ خانگي شعبا ۽ انهن لاءِ حاصل ڪندڙ ۽ سيٽرز آهن. ان کي لازمي طور تي غير پرائيويٽ ڪنسٽرڪٽر (يا ڊفالٽ ڪنسٽرڪٽر) کان سواءِ هجڻ گهرجي، ۽ ان ۾ هڪ پرائمري ڪيئي هجڻ لازمي آهي، يعني. ڪا شيء جيڪا منفرد طور تي ڊيٽابيس ۾ هن طبقي جي هر رڪارڊ جي سڃاڻپ ڪندي. توهان پڻ پڙهي سگهو ٿا سڀني گهرجن جي باري ۾ اهڙي طبقي لاء الڳ الڳ. اچو ته FilmJPA تشريح استعمال ڪندي پنھنجي ڪلاس کي ھڪ ادارو بڻايون:
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 کي ترتيب ڏيڻ شروع ڪريون. ۽ سڀ کان پهريان، اچو ته ڪجهه معلومات رکون، جهڙوڪ يوزرنيم ۽ پاسورڊ، يو آر ايل ۽ ٻيو ڪجهه الڳ فائل ۾. توهان، يقينا، انهن کي سڌو سنئون ڪلاس ۾ باقاعده لائن طور بيان ڪري سگهو ٿا، جيئن اسان ڪيو جڏهن اسان ڪنيڪشن چيڪ ڪيو ( 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- ھي ملڪيت ھئبرنيٽ ڏانھن اشارو ڪرڻ جي ضرورت آھي SQL ٻولي جو ڪھڙو خاص ورزن استعمال ڪيو ويو آھي. حقيقت اها آهي ته هر DBMS ۾، صلاحيتن کي وڌائڻ لاء، ڪجهه ڪارڪردگي شامل ڪرڻ يا ڪجهه بهتر ڪرڻ لاء، اهي عام طور تي ٿورڙي ٻولي کي جديد ڪن ٿا. نتيجي طور، اهو ظاهر ٿئي ٿو ته هر ڊي بي ايم ايس جي پنهنجي SQL ٻولي آهي. اهو انگريزيءَ وانگر آهي، لڳي ٿو ته ٻولي ساڳي آهي، پر آسٽريليا، آمريڪا يا برطانيه ۾ اها ٿوري مختلف هوندي، ۽ ڪجهه لفظن جي معنيٰ مختلف ٿي سگهي ٿي. ۽ سمجھڻ ۾ ڪنھن به پريشاني کان بچڻ لاءِ، توھان کي ھائبرنيٽ کي سڌو سنئون ٻڌائڻو پوندو ته اھو اصل ۾ ڇا آھي. 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- پراپرٽي فائل کي ڳنڍيندي جيڪا اسان تازو ٺاهي آهي.
  • Environmentproperty- فائل مان ملڪيت حاصل ڪرڻ لاء .
  • hibernateProperties- ھي طريقو ھئبرنيٽ ملڪيتن کي پراپرٽيز اعتراض جي طور تي پيش ڪرڻ جي ضرورت آھي
  • DataSource- ڊيٽابيس سان ڪنيڪشن ٺاهڻ لاءِ استعمال ڪيو ويو. هي ڊرائيور مئنيجر جو هڪ متبادل آهي ، جيڪو اسان اڳ ۾ استعمال ڪيو جڏهن اسان ٺاهيو main. دستاويز چوي ٿو ته DataSourceاهو استعمال ڪرڻ بهتر آهي. اھو اھو آھي جيڪو اسان ڪنداسين، يقينا، انٽرنيٽ تي پڙھڻ نه وساريو ڇا فرق ۽ فائدا آھن. ھڪڙو فائدو خاص طور تي ڊيٽابيس ڪنيڪشن پول (DBCP) ٺاھڻ جي صلاحيت آھي.
  • sessionFactory- سيشن ٺاهڻ لاءِ جن جي مدد سان عمل ڪيو وڃي ٿو اداري جي شين سان. ھتي اسان ڊيٽا جو ماخذ، ھائبرنيٽ پراپرٽيز مقرر ڪريون ٿا ۽ جنھن پيڪيج ۾ اسان کي ادارو ڪلاس ڳولڻو آھي.
  • 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سان : BasicDataSourceorg.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 پوائنٽون آهن. پهرين، هڪ ڊيڄاريندڙ ڏيکاريو ويو. اهو ان حقيقت جي ڪري آهي ته اسان هڪ parameterized حاصل ڪرڻ چاهيون ٿا List<Film>، پر اهو طريقو صرف ان ڪري واپس اچي ٿو Listڇو ته گڏ ڪرڻ وقت اهو معلوم ناهي ته ڪهڙي قسم جي درخواست واپس ايندي. تنهن ڪري اهو خيال اسان کي ڊيڄاري ٿو ته اسان هڪ غير محفوظ تبديلي ڪري رهيا آهيون، جنهن جي نتيجي ۾ مصيبت ٿي سگهي ٿي. ان لاءِ ٻيا به ڪيترائي صحيح طريقا آهن ته جيئن اهڙو سوال ئي پيدا نه ٿئي. توھان انٽرنيٽ تي معلومات ڳولي سگھو ٿا. پر اچو ته هاڻي ان سان پريشان نه ڪريون. حقيقت اها آهي ته اسان ڄاڻون ٿا ته ڪهڙي قسم جي واپسي ڪئي ويندي، تنهنڪري هتي ڪو مسئلو پيدا نه ٿيندو، توهان صرف ڊيڄاريندڙ کي نظرانداز ڪري سگهو ٿا. پر، انهي ڪري ته توهان جون اکيون اکين ۾ نه هجن، توهان طريقي جي مٿان هڪ تشريح لٽڪائي سگهو ٿا @SupressWarning("unchecked"). ائين ڪرڻ سان، اسان هڪ قسم جو مرتب ڪندڙ کي چوندا آهيون، مهرباني، دوست، توهان جي ڳڻتي لاءِ، پر مون کي خبر آهي ته مان ڇا ڪري رهيو آهيان ۽ هر شيءِ ڪنٽرول هيٺ آهي، تنهنڪري توهان آرام ڪري سگهو ٿا ۽ هن طريقي جي باري ۾ پريشان نه ٿيو. ٻيو، خيال ڳاڙهي ۾ هيٺ ڏنل آهي " from Film". اهو صرف هڪ HQL (Hibernate Query Language) سوال آهي ۽ خيال اهو نٿو سمجهي ته سڀ ڪجهه صحيح آهي يا ڪا غلطي آهي. توھان ڏانھن وڃو خيال سيٽنگون ۽ دستي طور تي ھر شيء کي ترتيب ڏيو (انٽرنيٽ تي ڏسو جيڪڏھن دلچسپي رکو). يا توهان آساني سان شامل ڪري سگهو ٿا Hibernate فريم ورڪ لاءِ سپورٽ، ائين ڪرڻ لاءِ، پروجيڪٽ تي ساڄي ڪلڪ ڪريو، منتخب ڪريو Add Framework Support ، چيڪ ڪريو باڪس لاءِ Hibernate ۽ ڪلڪ ڪريو ٺيڪ. ان کان پوءِ، گهڻو ڪري entity ڪلاس ( Film) ۾ گهڻيون شيون به ڳاڙهي رنگ ۾ هيٺ ڏجن ٿيون، مثال طور، جتي تشريح @Table(name = "films")وارننگ جاري ڪندو ته ٽيبل 'فلمس' حل نه ٿي سگهي . ٻيهر، هتي ڪجھ به غلط ناهي، هي هڪ ڊزائن جي غلطي ناهي، هر شيء گڏ ڪندو ۽ ڪم ڪندو. خيال تي زور ڏنو ويو آهي ڇاڪاڻ ته اهو اسان جي بنياد بابت ڪجھ به نه ڄاڻي ٿو. هن کي درست ڪرڻ لاء، اچو ته خيال کي ڊيٽابيس سان گڏ ڪريو. View -> Tool Windows -> Persistense (هڪ ٽيب کُليندو) -> ساڄي مائوس جو بٽڻ، چونڊيو Data Sources -> Assign Data Sources -> in Data Source، Species to the database connect and click OK . Maven، Spring، MySQL، Hibernate ۽ پهرين CRUD ايپليڪيشن جو تعارف (حصو 3) - 3جڏهن اهو سڀ ڪجهه طئي ڪيو ويو، اتي اڃا به ڪجهه باقي هو. اچو ته هڪ اعلي سطح تي، خدمت ڏانهن وڃو. ڪلاس ۾، FilmServiceImplاسان allFilmsبهار جي طريقي کي هڪ تشريح سان نشان لڳايو @Transactional، جيڪو ظاهر ڪندو ته اهو طريقو ٽرانزيڪشن ۾ عمل ڪيو وڃي (ان کان سواء، Hibernate ڪم ڪرڻ کان انڪار ڪندو):
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
تنهن ڪري، هتي هر شي تيار آهي، توهان کي ڪنٽرولر ۾ ڪنهن به شيء کي هٿ ڪرڻ جي ضرورت ناهي. خير، اهو لڳي ٿو سچ جو لمحو اچي ويو آهي، ڪلڪ ڪريو رن ۽ ڏسو ته ڇا ٿئي ٿو. 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. اهو آهي، تيار. توهان هاڻي هلائي سگهو ٿا ۽ چيڪ ڪري سگهو ٿا. ڪلڪ ڪريو لنڪس ۽ بٽڻ، ڪوشش ڪريو شامل ڪرڻ / حذف ڪرڻ / ايڊٽ ڪريو داخلائون. جيڪڏهن سڀ ڪجهه صحيح طريقي سان ڪيو وڃي ته اهو ڪم ڪرڻ گهرجي. ھاڻي ھاڻي ھئبرنيٽ، اسپرنگ، MySQL استعمال ڪندي ھڪ مڪمل CRUD ايپليڪيشن آھي. جاري رکڻ لاءِ... متعارف ڪرائڻ 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