JavaRush /جاوا بلاگ /Random-UR /حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کما...

حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔

گروپ میں شائع ہوا۔
پہلا حصہ دوسرا حصہ
حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 1

جاوا ایپلی کیشن

3 درجے کی تنظیم

آئیے جاوا ایپلیکیشن پر واپس آتے ہیں۔ پچھلے حصے کا ورژن ابتدائی اعمال کی درستگی کو کنٹرول کرنے کے لیے ہیلو ورلڈ اسٹائل میں بنایا گیا تھا۔ ہم تین درجے (تھری لیئر) فن تعمیر کو نافذ کرتے ہیں، جسے انگریزی زبان کے ادب میں اکثر 3tier/3layer کہا جاتا ہے ۔ اس کا مختصر خلاصہ درج ذیل ہے:
  • تمام اداروں کو ماڈل کے طور پر ڈیزائن کیا گیا ہے۔ یہ وہ اشیاء ہیں جن میں شامل ہیں:
    • صفات کا ایک مجموعہ (کلاس کے نجی شعبے)۔
    • کنسٹرکٹر
    • صفات کو ترتیب دینے/پڑھنے کے لیے سیٹرز اور حاصل کرنے والے۔
    • یہ ضروری ہے کہ ان میں مندرجہ بالا کے علاوہ کوئی دوسرا کوڈ نہ ہو۔ ایسی اشیاء کو اکثر POJO (Plain Old Java Object) کہا جاتا ہے۔
  • ماڈلز کے ساتھ کام کرنے کی تمام منطق سروس لیئر کے ذریعے لاگو ہوتی ہے۔ یہ ماڈلز کے لیے کاروباری اصول تیار کرتا ہے۔ مثال کے طور پر، جاوا ایپلیکیشن سے درخواستوں پر کارروائی کرنا۔ استفسار کے دلائل اور واپس کیے گئے نتائج میں اکثر ماڈلز (یا ان کے مجموعے) شامل ہوتے ہیں۔
  • ریپوزٹری پرت DBMS اور سروس کے درمیان ایک "درمیانی" ہے، جو ڈیٹا بیس کے ساتھ براہ راست کام کرتی ہے اور اس کے ساتھ تعامل کے لیے ذمہ دار ہے۔
حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 2 ہمیں ایسی جماعت بنانے کی کیا ضرورت ہے؟ حقیقت یہ ہے کہ ہر پرت دوسروں سے زیادہ سے زیادہ الگ تھلگ ہے۔ اگر ڈیٹا بیس کے بجائے ہمارے پاس ٹیکسٹ فائلوں کا ایک سیٹ ہے، تو ہمیں باقی کوڈ کو چھوئے بغیر صرف Repository کے نفاذ کو تبدیل کرنے کی ضرورت ہے ۔ اسی طرح، ہم کم سے کم تبدیلیوں کے ساتھ ایک اور سروس کو جوڑ سکتے ہیں ۔ بڑے سسٹمز کے لیے، ہم مختلف لوگوں کو مختلف تہوں کا نفاذ دے سکتے ہیں یا مختلف تہوں کے بہترین نفاذ کو یکجا کر کے تجربہ کر سکتے ہیں۔ آئیے اپنی درخواست کے لیے پیکجز ماڈل ، ریپوزٹری ، سروس بنائیں ، جہاں متعلقہ کلاسز واقع ہوں گی۔ ہم مندرجہ ذیل حصوں میں سروس لیئر پر واپس جائیں گے، لیکن فی الحال ہم ماڈلز اور ریپوزٹریز پر توجہ دیں گے۔ حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 3

ماڈل

ہمارے تمام اداروں (اسٹاک، ٹریڈرز، ریٹ اور ٹریڈرز کے اعمال) اور ان کے ٹیبل کے مساوی ایک مشترکہ خصوصیت ہے - ایک مصنوعی بنیادی کلید۔ لہذا، آئیے ایک بیس کلاس بنائیں BaseModel۔ تمام ماڈلز اس سے وراثت میں ہوں گے۔
package sql.demo.model;

import java.util.Objects;

// Базовый класс модели, имеющий ключ id
public class BaseModel {
    protected long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public BaseModel() {}

    public BaseModel(long id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BaseModel baseModel = (BaseModel) o;
        return id == baseModel.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
ذیل میں اسٹاک ماڈل کی ایک مثال ہے۔ آپ مضمون کے آخر میں گیتھب ریپوزٹری کے لنک پر عمل کرکے ماڈل کی باقی فہرستیں دیکھ سکتے ہیں۔
package sql.demo.model;

import java.math.BigDecimal;

// Модель акции
public class Share extends BaseModel{
    // поля SQL таблицы и соответствующие им поля модели
    // типы данных SQL
    private String name;    // Наименование
    private BigDecimal startPrice; // Начальная цена
    private int changeProbability; // Вероятность смены курса (в процентах)
    private int delta;   // Максимальное колебание (в процентах)стоимости акции в результате торгов


    public Share() {
    }

    public Share(long id, String name, BigDecimal startPrice, int changeProbability, int delta) {
        super(id);
        this.name = name;
        this.startPrice = startPrice;
        this.changeProbability = changeProbability;
        this.delta = delta;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    ... оставшиеся сеттеры/геттеры
}

جے ڈی بی سی

پہلے حصے میں، ہم نے سیکھا کہ ڈیٹا بیس سے کنکشن کیسے قائم کیا جائے اور اسے بند کیا جائے۔ اب آگے بڑھتے ہیں۔ JDBC کے ساتھ کام کرنے کے مراحل درج ذیل خاکہ میں دکھائے گئے ہیں: حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 4
  • Class.forName()کلاس کو لوڈ کرتا ہے اور اسے ڈرائیور مینجر کے ساتھ رجسٹر کرتا ہے۔
  • DriverManager.getConnection()واپس آ جائے گا Connection- طریقہ کار میں بیان کردہ ڈیٹا بیس سے ایک کنکشن اور متعلقہ JDBC ڈرائیور کا استعمال کرتے ہوئے (جو کہ استعمال کرکے لوڈ کیا گیا تھا Class.forName()
  • createStatement()ہمیں Statementایک آبجیکٹ واپس کرے گا جس کی بنیاد پر ہم ڈیٹا بیس میں سوالات بنا سکتے ہیں۔ یہ بھی ہیں:
      CallableStatementڈی بی ایم ایس کے اپنے ایس کیو ایل فنکشنز اور طریقہ کار کو کال کرنے کے لیے (انہیں اسٹورڈ کہا جاتا ہے)۔
    • PreparedStatementپیرامیٹرائزڈ اور بیچ سوالات کی تخلیق میں سہولت فراہم کرنا۔
  • "ہاتھ میں" ہونے سے آپ کو SQL استفسار لینگویج کمانڈ کی شکل میں براہ راست DBMS کے عمل میں ایک درخواست بھیجنے اور جواب کی شکل میں واپس کرنے کی اجازت ملے statementگی ۔ سہولت کے لیے یہ ہیں: execute()ResultSet
    • executeQuery()- DBMS سے ڈیٹا پڑھنے کے لیے۔
    • executeUpdate()- ڈی بی ایم ایس میں ڈیٹا میں ترمیم کرنے کے لیے۔
  • سرور کے جواب کو بذات خود , , اور اسی طرح سے ResultSetدہرانے کے ذریعے فارم میں پروسیس کیا جا سکتا ہے ۔ ہم حاصل کرنے والوں کے ذریعے انفرادی نتائج کی فیلڈز حاصل کر سکتے ہیں: , ...first()last()next()getInteger()getString()
یہ ذہن میں رکھنا چاہیے کہ DBMS کے ساتھ کام کرنے کے بعد، وسائل کو بچانے کے لیے، یہ مشورہ دیا جاتا ہے کہ آپ اپنے پیچھے موجود اشیاء کو بند کر دیں (صحیح ترتیب میں!) ResultSet، Statementاور Connectionوسائل کو بچانے کے لیے۔ یاد رکھیں، جب کسی ایسی چیز کو بند کرتے ہیں جو خاکہ پر ترتیب میں زیادہ ہے، تو آپ اس کے ساتھ کام کرنے کے عمل میں پیدا ہونے والی تمام اشیاء کو بند کر دیں گے۔ اس طرح، کسی کنکشن کو بند کرنے سے یہ سب بند ہو جائے گا Statementاور یہ سب ResultSetان کی مدد سے موصول ہو گا۔

مخزن کا نفاذ

نظریاتی JDBC حصے کے بعد، آئیے مخزن کے نفاذ کی طرف چلتے ہیں۔ ہم اسے آرکیٹیکچرل طور پر اس طرح نافذ کرتے ہیں:
  • ہم DBMS کے ساتھ کام کرنے کے سب سے عام حصوں کو ایک مشترکہ اجداد میں منتقل کریں گے - BaseTable;
  • ہم جو منطقی کارروائیاں کریں گے ان کا اعلان انٹرفیس میں کیا جائے گا TableOperation۔
حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 5 نیا ذخیرہ کلاس سے وراثت میں ملے گا BaseTableاور انٹرفیس کو نافذ کرے گا TableOperation۔ اس طرح، ہمیں انٹرفیس میں اعلان کردہ طریقوں کے نفاذ کو لکھنے کی ضرورت ہے TableOperation۔ اس صورت میں، ہم پیرنٹ کلاس کے طریقے استعمال کر سکتے ہیں BaseTable۔ اس وقت، انٹرفیس میزیں بنانے کے طریقوں کا اعلان کرتا ہے:
package sql.demo.repository;
import java.sql.SQLException;

// Операции с tableми
public interface TableOperations {
    void createTable() throws SQLException; // создание таблицы
    void createForeignKeys() throws SQLException; // создание связей между tableми
    void createExtraConstraints() throws SQLException; // создание дополнительных правил для значений полей таблиц
}
جیسا کہ آپ مواد کا مطالعہ کرتے ہیں، طریقہ کار کے اعلانات کی فہرست ( read(), update()....) پھیلتی جائے گی۔ ہم نئی خصوصیات کو دو مراحل میں نافذ کریں گے:
  1. آئیے ایک نئے انٹرفیس طریقہ کی شکل میں ٹیبل کے ساتھ کام کرنے کی ایک اور صلاحیت شامل کریں۔
  2. اگلا، انٹرفیس کو نافذ کرنے والی کلاسوں میں، ہم انٹرفیس کے ذریعے تیار کردہ نئے طریقوں میں سافٹ ویئر کے نفاذ کو بیان کریں گے۔
Share(اسٹاک) کے لیے مثالی ذخیرہ ۔ بنیادی منطق میزیں بنانے، فیلڈز کے لیے ایس کیو ایل ڈیٹا کی قسمیں بتانے اور پابندیاں شامل کرنے کے کمانڈز میں ہے:
package sql.demo.repository;
import java.sql.SQLException;

public class Shares extends BaseTable implements TableOperations{

    public Shares() throws SQLException {
        super("shares");
    }

    @Override
    public void createTable() throws SQLException {
        super.executeSqlStatement("CREATE TABLE shares(" +
                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
                "name VARCHAR(255) NOT NULL," +
                "startPrice DECIMAL(15,2) NOT NULL DEFAULT 10," +
                "changeProbability INTEGER NOT NULL DEFAULT 25,"+
                "delta INTEGER NOT NULL DEFAULT 15)", "Создана table " + tableName);
    }

    @Override
    public void createForeignKeys() throws SQLException {
    }

    @Override
    public void createExtraConstraints() throws SQLException {
        super.executeSqlStatement(
                " ALTER TABLE shares ADD CONSTRAINT check_shares_delta CHECK(delta <= 100 and delta > 0)",
                "Cоздано ограничение для shares, поле delta = [1,100]");
        super.executeSqlStatement(
                " ALTER TABLE shares ADD CONSTRAINT check_shares_changeProbability " +
                        "CHECK(changeProbability <= 100 and changeProbability > 0)",
                "Cоздано ограничение для shares, поле changeProbability = 1..100");

    }
}
دیگر ذخیروں کی فہرستیں اور پیرنٹ کلاس مضمون کے آخر میں گیتھب ریپوزٹری کے لنک کے ذریعے دستیاب ہیں۔ بلاشبہ، آپ ایک مختلف پروگرام ڈیزائن یا پروگرام کی مزید مکمل ری فیکٹرنگ کر سکتے ہیں: مشترکہ حصوں کو پیرنٹ کلاس میں منتقل کریں، عام طریقوں کو نمایاں کریں، وغیرہ۔ لیکن مضامین کی سیریز کا بنیادی مقصد براہ راست ڈیٹا بیس کے ساتھ کام کرنا ہے، اس لیے اگر آپ چاہیں تو پروگرام اور اس طرح کے ڈیزائن بنا سکتے ہیں، آپ خود بھی کر سکتے ہیں۔ موجودہ پروجیکٹ کا ڈھانچہ: حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 6 ریپوزٹریز اور ماڈلز کے علاوہ، ہم نے StockExchangeDBاپنے ایمولیشن کے عمومی انتظام کے لیے ایک کلاس بھی بنائی ہے۔ اس مرحلے پر ہم ذخیروں کا انتظام کرتے ہیں (اگلے حصوں میں ہم خدمات کی طرف جائیں گے)۔ ہم ان کا اعلان کرتے ہیں اور میزیں بنانا شروع کرتے ہیں:
package sql.demo;
import org.h2.tools.DeleteDbFiles;
import sql.demo.repository.*;
import java.sql.*;

public class StockExchangeDB {
    // Блок объявления констант
    public static final String DB_DIR = "c:/JavaPrj/SQLDemo/db";
    public static final String DB_FILE = "stockExchange";
    public static final String DB_URL = "jdbc:h2:/" + DB_DIR + "/" + DB_FILE;
    public static final String DB_Driver = "org.h2.Driver";

    // Таблицы СУБД
    Traiders traiders;
    ShareRates shareRates;
    Shares shares;
    TraiderShareActions traiderShareActions;

    // Получить новое соединение с БД
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL);
    }

    // Инициализация
    public StockExchangeDB(boolean renew) throws SQLException, ClassNotFoundException {
        if (renew)
            DeleteDbFiles.execute(DB_DIR, DB_FILE, false);
        Class.forName(DB_Driver);
        // Инициализируем таблицы
        traiders = new Traiders();
        shares = new Shares();
        shareRates = new ShareRates();
        traiderShareActions = new TraiderShareActions();
    }

    // Инициализация по умолчанию, без удаления file БД
    public StockExchangeDB() throws SQLException, ClassNotFoundException {
        this(false);
    }

    // Creation всех таблиц и внешних ключей
    public void createTablesAndForeignKeys() throws SQLException {
        shares.createTable();
        shareRates.createTable();
        traiders.createTable();
        traiderShareActions.createTable();
        // Creation ограничений на поля таблиц
        traiderShareActions.createExtraConstraints();
        shares.createExtraConstraints();
        // Creation внешних ключей (связи между tableми)
        shareRates.createForeignKeys();
        traiderShareActions.createForeignKeys();
    }


    public static void main(String[] args) {
        try{
            StockExchangeDB stockExchangeDB = new StockExchangeDB(true);
            stockExchangeDB.createTablesAndForeignKeys();
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ошибка SQL !");
        } catch (ClassNotFoundException e) {
            System.out.println("JDBC драйвер для СУБД не найден!");
        }
    }
}
عملدرآمد کا نتیجہ: حصہ 3۔ ہم اپنے ڈیٹا بیس کا ڈھانچہ بناتے ہیں، پہلی SQL کمانڈز java.sql مثالوں کا استعمال کرتے ہوئے۔  - 7

خلاصہ

مضمون کے دوسرے اور تیسرے حصے میں ہم نے سیکھا:
  • ایس کیو ایل ڈیٹا کی اقسام۔
  • ڈیٹا بیس ٹیبلز۔
  • ڈیٹا بیس کو ڈیزائن کرنا: ٹیبل کے ڈھانچے اور ان کے درمیان تعلقات۔
  • ڈیٹا بیس ٹیبلز بنانے، فیلڈز پر پابندیاں اور ٹیبلز کے درمیان تعلقات کے لحاظ سے SQL استفسار کی زبان۔
  • JDBC کے ساتھ تعامل کے بارے میں مزید۔
  • ڈیٹا پروسیسنگ ایپلی کیشن کا تھری ٹیئر (تھری لیئر) ماڈل/ریپوزٹری/سروس فن تعمیر۔

مفید لنکس

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION