JavaRush /جاوا بلاگ /Random-SD /حصو 3. اسان پنھنجي ڊيٽابيس جو ڍانچو ٺاھيون ٿا، پھريون SQL...

حصو 3. اسان پنھنجي ڊيٽابيس جو ڍانچو ٺاھيون ٿا، پھريون SQL حڪم java.sql مثال استعمال ڪندي.

گروپ ۾ شايع ٿيل
پهريون حصو ٻيو حصو
حصو 3. اسان پنھنجي ڊيٽابيس جو ڍانچو ٺاھيون ٿا، پھريون SQL حڪم java.sql مثال استعمال ڪندي.  - 1

جاوا ايپليڪيشن

3-سطح تنظيم

اچو ته جاوا ايپليڪيشن ڏانھن واپس وڃو. پوئين حصي جو نسخو HelloWorld انداز ۾ ٺاھيو ويو آھي شروعاتي عملن جي درستي کي ڪنٽرول ڪرڻ لاءِ. اسان هڪ ٽي-ٽيئر (ٽي-پرت) آرڪيٽيڪچر لاڳو ڪندا آهيون، جنهن کي انگريزي ٻوليءَ جي ادب ۾ اڪثر 3tier/3layer سڏيو ويندو آهي . ان جو مختصر احوال هن ريت آهي:
  • سڀئي ادارا ماڊل طور ٺهيل آهن. اهي شيون آهن جن ۾ شامل آهن:
    • خاصيتن جو هڪ سيٽ (ڪلاس جا خانگي شعبا).
    • تعمير ڪندڙ
    • سيٽنگ / پڙهڻ جي خاصيتن لاء سيٽرز ۽ حاصل ڪندڙ.
    • اهو ضروري آهي ته انهن ۾ مٿي ڏنل ڪوڊ کان سواء ٻيو ڪو به ڪوڊ نه هجي. اهڙيون شيون اڪثر ڪري POJO (Plain Old Java Object) سڏجن ٿيون .
  • ماڊل سان ڪم ڪرڻ لاء سڀ منطق سروس پرت پاران لاڳو ڪيو ويو آهي. اهو ماڊلز لاءِ ڪاروباري ضابطا ٺاهي ٿو. مثال طور، جاوا ايپليڪيشن کان درخواستون پروسيسنگ. سوالن جا دليل ۽ موٽايل نتيجا اڪثر شامل آھن ماڊل (يا انھن جو مجموعو).
  • مخزن جي پرت DBMS ۽ سروس جي وچ ۾ هڪ "وچولي" آهي، سڌو ڊيٽابيس سان ڪم ڪري ٿو ۽ ان سان رابطي لاء ذميوار آهي.
حصو 3. اسان پنھنجي ڊيٽابيس جو ڍانچو ٺاھيون ٿا، پھريون SQL حڪم java.sql مثال استعمال ڪندي.  - 2 اسان کي به اهڙي جماعت ٺاهڻ جي ضرورت ڇو آهي؟ حقيقت اها آهي ته هر پرت ٻين کان وڌ کان وڌ الڳ آهي. جيڪڏهن ڊيٽابيس جي بدران اسان وٽ ٽيڪسٽ فائلن جو هڪ سيٽ آهي، پوء اسان کي باقي ڪوڊ کي ڇڪڻ کان سواء صرف مخزن جي عمل کي تبديل ڪرڻ جي ضرورت آهي. اهڙي طرح، اسان گهٽ ۾ گهٽ تبديلين سان ٻي خدمت ڳنڍي/شامل ڪري سگهون ٿا . وڏين سسٽمن لاءِ، اسان مختلف پرتن جي نفاذ کي مختلف ماڻھن کي ڏئي سگھون ٿا يا مختلف تہن جي بھترين عملن کي گڏ ڪري تجربو ڪري سگھون ٿا. اچو ته اسان جي ايپليڪيشن لاءِ پيڪيجز ماڊل , مخزن , خدمت ٺاهيون ، جتي لاڳاپيل طبقا واقع هوندا. اسان ھيٺ ڏنل حصن ۾ سروس پرت ڏانھن موٽنداسين، پر ھاڻي اسان ماڊل ۽ مخزن تي ڌيان ڏينداسين. حصو 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ڪال ڪرڻ لاءِ ڊي بي ايم ايس جي پنهنجي SQL افعال ۽ طريقا (انهن کي سڏيو ويندو آهي ذخيرو).
    • PreparedStatementparameterized ۽ بيچ سوالن جي پيدائش جي سهولت.
  • "هٿ ۾" هجڻ توهان کي اجازت statementڏيندو execute()ته هڪ درخواست موڪلڻ جي صورت ۾ SQL سوال ٻولي ڪمانڊ جي صورت ۾ سڌو سنئون ڊي بي ايم ايس ايگزيڪيوشن ڏانهن ۽ واپسي جي صورت ۾ جواب ResultSet. سهولت لاء هتي آهن:
    • executeQuery()- ڊي بي ايم ايس مان ڊيٽا پڙهڻ لاءِ.
    • executeUpdate()- ڊي بي ايم ايس ۾ ڊيٽا کي تبديل ڪرڻ لاء.
  • سرور جو جواب پاڻ کي ResultSetفارم ۾ پروسيس ڪري سگهجي ٿو، ذريعي ٻيهر ورجائي first()، last()۽ next()انهي تي. اسان حاصل ڪري سگھون ٿا انفرادي نتيجن جا شعبا getters ذريعي: 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(اسٽاڪ) لاءِ مثال مخزن . بنيادي منطق جدولن جي ٺاھڻ جي حڪمن ۾ آھي، فيلڊ لاء SQL ڊيٽا جي قسمن کي بيان ڪرڻ ۽ پابنديون شامل ڪرڻ:
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");

    }
}
ٻين مخزن جي فهرستن ۽ والدين طبقي جي لنڪ ذريعي دستياب آهن github مخزن جي آرٽيڪل جي آخر ۾. يقينن، توهان ڪري سگهو ٿا مختلف پروگرام ڊيزائن يا پروگرام جي وڌيڪ مڪمل ريفيڪٽرنگ: عام حصن کي والدين طبقي ۾ منتقل ڪريو، عام طريقن کي نمايان ڪريو، وغيره. پر مضمونن جي سيريز جو بنيادي مقصد سڌو سنئون ڊيٽابيس سان ڪم ڪرڻ آهي، تنهنڪري جيڪڏهن توهان چاهيو ٿا، توهان پروگرام ٺاهي سگهو ٿا ۽ پسند ڪريو، توهان اهو پاڻ ڪري سگهو ٿا. موجوده پروجيڪٽ جو ڍانچو: حصو 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 ڊيٽا جا قسم.
  • ڊيٽابيس ٽيبل.
  • ڊيٽابيس ڊزائين ڪرڻ: ٽيبل جي جوڙجڪ ۽ انهن جي وچ ۾ لاڳاپا.
  • SQL سوال ٻولي ڊيٽابيس جدولن جي ٺاھڻ جي لحاظ کان، شعبن تي پابنديون قائم ڪرڻ ۽ جدولن جي وچ ۾ لاڳاپا.
  • JDBC سان رابطي بابت وڌيڪ.
  • ٽي-ٽيئر (ٽي-پرت) ماڊل / مخزن / ڊيٽا پروسيسنگ ايپليڪيشن جي سروس آرڪيٽيڪچر.

مفيد لنڪس

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