JavaRush /جاوا بلاگ /Random-UR /Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن ک...
Макс
سطح

Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 3)

گروپ میں شائع ہوا۔
صبح بخیر اس مضمون میں میں اپنی پہلی ملاقات Maven، Spring، Hibernate، MySQL اور Tomcat جیسی چیزوں کے ساتھ شیئر کرنا چاہوں گا جو ایک سادہ CRUD ایپلیکیشن بنانے کے عمل میں ہے۔ یہ 4 کا تیسرا حصہ ہے۔ مضمون بنیادی طور پر ان لوگوں کے لیے ہے جنہوں نے یہاں پہلے ہی 30-40 درجے مکمل کر لیے ہیں، لیکن ابھی تک خالص جاوا سے آگے نہیں نکلے ہیں اور کھلی دنیا میں داخل ہونے کے لیے ابھی شروعات کر رہے ہیں (یا شروع ہونے والے ہیں)۔ یہ تمام ٹیکنالوجیز، فریم ورک اور دیگر نا واقف الفاظ۔ Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 3) - 1یہ مضمون کا تیسرا حصہ ہے "Introduction to Maven, Spring, MySQL, Hibernate and first CRUD application"۔ پچھلے حصے لنکس پر عمل کر کے دیکھے جا سکتے ہیں:

مواد:

ڈیٹا بیس بنانا اور جوڑنا

ٹھیک ہے، یہ ڈیٹا بیس پر کام شروع کرنے کا وقت ہے. ہائبرنیٹ کو مربوط کرنے اور یہ سوچنے سے پہلے کہ یہ سب وہاں کیسے کام کرے، پہلے آئیے خود ڈیٹا بیس کو دیکھیں، یعنی آئیے اسے بنائیں، اسے جوڑیں، اسے بنائیں اور نشان کو پُر کریں۔ ہم DBMS (ڈیٹا بیس مینجمنٹ سسٹم) MySQL استعمال کریں گے (یقیناً، آپ کو پہلے ڈاؤن لوڈ اور انسٹال کرنا ہوگا)۔ ایس کیو ایل (سٹرکچرڈ کوئوری لینگویج) ایک اعلانیہ پروگرامنگ لینگویج ہے جو متعلقہ ڈیٹا بیس میں ڈیٹا کو بنانے، اس میں ترمیم کرنے اور اس میں ترمیم کرنے کے لیے استعمال ہوتی ہے۔ ایسے ڈیٹا بیس میں ڈیٹا کو ٹیبل کی شکل میں محفوظ کیا جاتا ہے۔ ایپلیکیشن ڈیٹا بیس کے ساتھ کیسے بات چیت کرتی ہے (SQL سوالات کو ڈیٹا بیس میں منتقل کرنا اور نتائج واپس کرنا)۔ اس کے لیے جاوا میں JDBC (جاوا ڈیٹا بیس کنیکٹیویٹی) جیسی چیز ہے ، جو کہ آسان الفاظ میں، ڈیٹا بیس کے ساتھ کام کرنے کے لیے انٹرفیس اور کلاسز کا ایک سیٹ ہے۔ ڈیٹا بیس کے ساتھ تعامل کرنے کے لیے، آپ کو ایک کنکشن بنانا ہوگا؛ اس کے لیے، پیکج java.sqlمیں ایک کلاس ہے Connection۔ کنکشن قائم کرنے کے کئی طریقے ہیں، مثال کے طور پر آپ getConnectionکلاس طریقہ استعمال کر سکتے ہیں DriverManager۔ تاہم، ڈیٹا بیس کے ساتھ بات چیت براہ راست نہیں کی جاتی ہے، کیونکہ بہت سے ڈیٹا بیس ہیں، اور وہ مختلف ہیں۔ اس لیے ان میں سے ہر ایک کے لیے اس کا اپنا JDBC ڈرائیور ہے۔ لہٰذا، سب سے پہلے، تاکہ بعد میں اس سے پریشان نہ ہوں، آئیے MySQL ڈرائیور انسٹال کریں ۔ آئیے pom.xmlدرج ذیل انحصار شامل کریں:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
اب ڈیٹا بیس بناتے ہیں۔ دیکھیں -> ٹول ونڈوز -> ڈیٹا بیس - ڈیٹا بیس پینل کھل جائے گا۔ نیا (سبز +) -> ڈیٹا سورس -> مائی ایس کیو ایل - ایک ونڈو کھلے گی جس میں آپ کو صارف نام اور پاس ورڈ بتانے کی ضرورت ہے، ہم انہیں مائی ایس کیو ایل انسٹال کرتے وقت سیٹ کرتے ہیں (مثال کے طور پر، میں نے روٹ اور روٹ استعمال کیا)۔ پورٹ (ڈیفالٹ برائے MySQL 3306)، نام، وغیرہ۔ اسے جیسا ہے چھوڑ دو. آپ " Test Connection " بٹن کا استعمال کر کے کنکشن کی جانچ کر سکتے ہیں ۔ OKMaven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 3) - 2 پر کلک کریں اور اب ہم MySQL سرور سے جڑ گئے ہیں۔ اگلا، آئیے ایک ڈیٹا بیس بناتے ہیں۔ ایسا کرنے کے لیے، آپ کنسول میں ایک اسکرپٹ لکھ سکتے ہیں جو کھلتا ہے:
CREATE DATABASE test
Execute پر کلک کریں اور ڈیٹا بیس تیار ہے، اب آپ اسے کنیکٹ کر سکتے ہیں۔ ایسا کرنے کے لیے ڈیٹا سورس پراپرٹیز پر واپس جائیں اور ڈیٹا بیس فیلڈ میں ڈیٹا بیس کا نام (ٹیسٹ) ڈالیں، پھر یوزر نیم اور پاس ورڈ دوبارہ درج کریں اور اوکے پر کلک کریں۔ اب ہمیں ایک میز بنانے کی ضرورت ہے۔ آپ گرافیکل ٹولز استعمال کر سکتے ہیں، لیکن پہلی بار، یہ دیکھنے کے لیے ہاتھ سے اسکرپٹ لکھنا ممکن ہے کہ یہ کیسا لگتا ہے:
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

اچھے طریقے سے، بہتر تفہیم کے لیے، یہ بہتر ہے کہ ڈیٹا بیس سے واقفیت حاصل کرنا شروع سے ہی، بغیر کسی ہائبرنیٹس اور دیگر چیزوں کے۔ لہذا، یہ ایک اچھا خیال ہوگا کہ کچھ گائیڈز تلاش کریں اور پہلے JDBC کلاسز کے ساتھ کام کرنے کی کوشش کریں، SQL سوالات کو دستی طور پر لکھیں وغیرہ۔ ٹھیک ہے، آئیے فوراً ORM ماڈل پر چلتے ہیں۔ اس کا کیا مطلب ہے؟ البتہ اس بارے میں ایک بار پھر الگ سے پڑھنے کا مشورہ ہے، لیکن میں اسے مختصراً بیان کرنے کی کوشش کروں گا۔ ORM (آبجیکٹ-ریلیشنل میپنگ یا آبجیکٹ-ریلیشنل میپنگ) اشیاء کو رشتہ دار ڈیٹا بیس ڈھانچے میں نقشہ بنانے کے لیے ایک ٹیکنالوجی ہے، یعنی ہمارے جاوا آبجیکٹ کو ٹیبل قطار کے طور پر پیش کرنے کے لیے۔ ORM کا شکریہ، آپ کو SQL اسکرپٹ لکھنے اور اشیاء کے ساتھ کام کرنے پر توجہ دینے کی فکر کرنے کی ضرورت نہیں ہے۔ اسے کیسے استعمال کریں. جاوا میں ایک اور عظیم چیز ہے، JPA (جاوا پرسسٹینس API)، جو ORM تصور کو نافذ کرتی ہے۔ JPA ایک ایسی تصریح ہے؛ یہ اشیاء کی ضروریات کو بیان کرتا ہے، یہ ڈیٹا بیس کے ساتھ کام کرنے کے لیے مختلف انٹرفیس اور تشریحات کی وضاحت کرتا ہے۔ JPA بنیادی طور پر ایک وضاحت، ایک معیار ہے۔ لہذا، بہت سے مخصوص نفاذ ہیں، جن میں سے ایک (اور سب سے زیادہ مقبول) ہائبرنیٹ ہے، جو اس فریم ورک کا نچوڑ ہے۔ ہائبرنیٹ 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-core ، اور spring-jdbc اور spring-tx کے ساتھ spring-ormjavax.persistence-api کے ساتھ آئے گا ۔

ہستی

لہذا ہم چاہتے ہیں کہ کلاس آبجیکٹ کو Filmڈیٹا بیس میں ذخیرہ کرنے کے قابل بنایا جائے۔ ایسا کرنے کے لیے، کلاس کو کئی شرائط کو پورا کرنا ہوگا۔ جے پی اے میں اس کے لئے ایک ہستی جیسی چیز ہے ۔ ایک entity کلاس ایک عام 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 بڑھ جائے گی۔
ہر پراپرٹی کے لیے، آپ بہت سی دوسری چیزیں بھی بتا سکتے ہیں، مثال کے طور پر، غیر صفر یا منفرد کیا ہونا چاہیے، پہلے سے طے شدہ قدر، زیادہ سے زیادہ سائز وغیرہ کی وضاحت کریں۔ اگر آپ کو اس کلاس کی بنیاد پر ٹیبل بنانے کی ضرورت ہو تو یہ مفید ہو گا؛ ہائبرنیٹ کے پاس یہ آپشن ہے۔ لیکن ہم نے پہلے ہی ٹیبل خود بنایا ہے اور تمام خصوصیات کو ترتیب دیا ہے، لہذا ہم اس کے بغیر بھی کر سکتے ہیں۔ ایک چھوٹا سا نوٹ۔ہائبرنیٹ دستاویزات فیلڈز پر نہیں بلکہ گیٹرز پر تشریحات استعمال کرنے کی تجویز کرتی ہیں۔ تاہم، ان طریقوں کے درمیان فرق کافی لطیف ہے اور ہمارے سادہ استعمال میں اس کا کوئی اثر نہیں ہوگا۔ اس کے علاوہ، زیادہ تر لوگ ویسے بھی کھیتوں کے اوپر تشریحات لگاتے ہیں۔ لہذا، اسے اس طرح چھوڑ دو، یہ صاف نظر آتا ہے.

ہائبرنیٹ پراپرٹیز

ٹھیک ہے، آئیے اپنا ہائبرنیٹ ترتیب دینا شروع کریں۔ اور سب سے پہلے، آئیے کچھ معلومات جیسے یوزر نیم اور پاس ورڈ، یو آر ایل اور کچھ اور کو الگ فائل میں ڈالتے ہیں۔ آپ، یقیناً، کلاس میں براہ راست باقاعدہ لائن کے طور پر ان کی وضاحت کر سکتے ہیں، جیسا کہ ہم نے کنکشن کی جانچ پڑتال کرتے وقت کیا تھا ( 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 زبان کا کون سا مخصوص ورژن استعمال کیا جاتا ہے۔ حقیقت یہ ہے کہ ہر DBMS میں، صلاحیتوں کو بڑھانے، کچھ فعالیت شامل کرنے یا کسی چیز کو بہتر بنانے کے لیے، وہ عام طور پر زبان کو قدرے جدید بناتے ہیں۔ نتیجے کے طور پر، یہ پتہ چلتا ہے کہ ہر DBMS کی اپنی SQL بولی ہے۔ یہ انگریزی کی طرح ہے، ایسا لگتا ہے کہ زبان ایک ہی ہے، لیکن آسٹریلیا، امریکہ یا برطانیہ میں یہ قدرے مختلف ہوں گے، اور کچھ الفاظ کے مختلف معنی ہو سکتے ہیں۔ اور تفہیم کے ساتھ کسی بھی پریشانی سے بچنے کے لیے، آپ کو ہائبرنیٹ کو براہ راست بتانے کی ضرورت ہے کہ اسے بالکل کس چیز سے نمٹنا ہے۔ hibernate.show_sql- اس پراپرٹی کی بدولت، ڈیٹا بیس کے سوالات کنسول میں ظاہر ہوں گے۔ یہ ضروری نہیں ہے، لیکن اس چیز سے آپ کم از کم دیکھ سکتے ہیں کہ کیا ہو رہا ہے، ورنہ ایسا لگتا ہے کہ ہائبرنیٹ کوئی جادو کر رہا ہے۔ ٹھیک ہے، یقیناً، یہ ظاہر کرنا بالکل واضح نہیں ہوگا؛ اس کے لیے کسی قسم کا لاگر استعمال کرنا بہتر ہے، لیکن یہ کسی اور وقت کے لیے کچھ ہے، اب یہ کرے گا۔

ہائبرنیٹ کنفیگریشن

آئیے کنفیگریشن کو ترتیب دینے کی طرف بڑھتے ہیں۔ آئیے پیکیج میں 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پہلے ہی پتہ چل گیا تھا ۔@ComponentScanWebConfig
  • @EnableTransactionManagement- آپ کو TransactionManagerلین دین کا انتظام کرنے کے لیے اسے استعمال کرنے کی اجازت دیتا ہے۔ ہائبرنیٹ ٹرانزیکشنز کا استعمال کرتے ہوئے ڈیٹا بیس کے ساتھ کام کرتا ہے؛ ان کی ضرورت ایک خاص سیٹ کے آپریشنز کو مکمل طور پر انجام دینے کے لیے ہوتی ہے، یعنی اگر طریقہ کار میں کسی ایک آپریشن میں دشواری ہے، تو باقی تمام پر عمل نہیں کیا جائے گا، تاکہ ایسا نہ ہو جیسا کہ رقم کی منتقلی کے ساتھ کلاسک مثال میں، جب ایک اکاؤنٹ سے رقم نکالنے کا عمل مکمل ہو گیا تھا، لیکن دوسرے کو لکھنے کا آپریشن کام نہیں آیا، نتیجتاً رقم غائب ہو گئی۔
  • @PropertySource- پراپرٹی فائل کو جوڑنا جو ہم نے حال ہی میں بنائی ہے۔
  • Environmentproperty- فائل سے پراپرٹیز حاصل کرنے کے لیے ۔
  • hibernateProperties- یہ طریقہ ہائبرنیٹ پراپرٹیز کو پراپرٹیز آبجیکٹ کے طور پر پیش کرنے کے لیے درکار ہے۔
  • DataSource- ڈیٹا بیس سے کنکشن بنانے کے لیے استعمال کیا جاتا ہے۔ یہ DriverManager کا متبادل ہے ، جسے ہم نے پہلے استعمال کیا جب ہم نے 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 پوائنٹس ہیں۔ سب سے پہلے، ایک انتباہ دکھایا گیا تھا. یہ اس حقیقت کی وجہ سے ہے کہ ہم ایک پیرامیٹرائزڈ حاصل کرنا چاہتے ہیں List<Film>، لیکن طریقہ صرف اس لیے واپس آتا ہے Listکیونکہ مرتب کے وقت یہ معلوم نہیں ہوتا ہے کہ درخواست کس قسم کی واپس آئے گی۔ لہذا خیال ہمیں خبردار کرتا ہے کہ ہم ایک غیر محفوظ تبدیلی کر رہے ہیں، جس کے نتیجے میں مصیبت ہو سکتی ہے۔ ایسا کرنے کے کئی اور صحیح طریقے ہیں تاکہ ایسا سوال ہی پیدا نہ ہو۔ آپ انٹرنیٹ پر معلومات تلاش کر سکتے ہیں۔ لیکن آئیے اب اس سے پریشان نہ ہوں۔ حقیقت یہ ہے کہ ہم بخوبی جانتے ہیں کہ کس قسم کو واپس کیا جائے گا، اس لیے یہاں کوئی مسئلہ پیدا نہیں ہوگا، آپ صرف انتباہ کو نظر انداز کر سکتے ہیں۔ لیکن، تاکہ آپ کی آنکھیں آنکھوں میں نہ لگیں، آپ طریقہ کے اوپر ایک تشریح لٹکا سکتے ہیں @SupressWarning("unchecked")۔ ایسا کرنے سے، ہم کمپائلر کو بتاتے ہیں، شکریہ دوست، آپ کی تشویش کے لیے، لیکن میں جانتا ہوں کہ میں کیا کر رہا ہوں اور سب کچھ میرے کنٹرول میں ہے، تاکہ آپ آرام کر سکیں اور اس طریقہ کے بارے میں فکر نہ کریں۔ دوم، خیال کو سرخ رنگ میں " from Film" کیا گیا ہے۔ یہ صرف ایک HQL (Hibernate Query Language) استفسار ہے اور خیال یہ نہیں سمجھتا کہ سب کچھ درست ہے یا کوئی غلطی ہے۔ آپ آئیڈیا سیٹنگز میں جا کر ہر چیز کو دستی طور پر ایڈجسٹ کر سکتے ہیں (اگر دلچسپی ہو تو انٹرنیٹ پر دیکھیں)۔ یا آپ صرف ہائبرنیٹ فریم ورک کے لیے سپورٹ شامل کر سکتے ہیں، ایسا کرنے کے لیے، پروجیکٹ پر دائیں کلک کریں، فریم ورک سپورٹ شامل کریں کو منتخب کریں، ہائبرنیٹ کے لیے باکس کو چیک کریں اور اوکے پر کلک کریں۔ اس کے بعد، غالباً ہستی کی کلاس ( Film) میں بہت سی چیزیں بھی سرخ رنگ سے انڈر لائن ہو جائیں گی، مثال کے طور پر، جہاں تشریح @Table(name = "films")انتباہ جاری کرے گی ٹیبل 'فلمز' کو حل نہیں کر سکتا ۔ ایک بار پھر، یہاں کچھ بھی غلط نہیں ہے، یہ ڈیزائن کی غلطی نہیں ہے، سب کچھ مرتب اور کام کرے گا. اس خیال پر زور دیا گیا ہے کیونکہ یہ ہماری بنیاد کے بارے میں کچھ نہیں جانتا ہے۔ اسے ٹھیک کرنے کے لیے، آئیے ڈیٹا بیس کے ساتھ آئیڈیا کو مربوط کرتے ہیں۔ دیکھیں -> ٹول ونڈوز -> پرسسٹینس (ایک ٹیب کھلے گا) -> دائیں ماؤس بٹن، ڈیٹا سورس کو تفویض کریں -> ڈیٹا سورس میں منتخب کریں، ڈیٹا بیس سے کنکشن کی وضاحت کریں اور ٹھیک ہے پر کلک کریں ۔ Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 3) - 3جب یہ سب طے ہو گیا تو پھر بھی کچھ باقی تھا۔ آئیے ایک اعلیٰ سطح پر چلتے ہیں، خدمت کی طرف۔ کلاس میں، FilmServiceImplہم allFilmsبہار کے طریقہ کو ایک تشریح کے ساتھ نشان زد کرتے @Transactionalہیں، جو اس بات کی نشاندہی کرے گا کہ طریقہ کار کو لین دین میں عمل میں لایا جانا چاہیے (اس کے بغیر، ہائبرنیٹ کام کرنے سے انکار کر دے گا):
@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۔ یہ ہے، تیار ہے. اب آپ دوڑ کر چیک کر سکتے ہیں۔ لنکس اور بٹن پر کلک کریں، اندراجات کو شامل/حذف/ترمیم کرنے کی کوشش کریں۔ اگر سب کچھ صحیح طریقے سے کیا جاتا ہے تو یہ کام کرنا چاہئے. اب یہ ہائبرنیٹ، اسپرنگ، مائی ایس کیو ایل کا استعمال کرتے ہوئے ایک مکمل CRUD ایپلی کیشن ہے۔ جاری رکھنے کے لیے... Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 1) Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن (حصہ 2) متعارف کروا رہا ہے Maven، Spring، MySQL، Hibernate اور the پہلی CRUD ایپلیکیشن (حصہ 3) Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلی کیشن کا تعارف (حصہ 4)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION