JavaRush /Блоги Java /Random-TG /Қисми 3. Мо скелети пойгоҳи додаи худро, аввалин фармонҳо...
Marat Sadykov
Сатҳи

Қисми 3. Мо скелети пойгоҳи додаи худро, аввалин фармонҳои SQL-ро бо истифода аз мисолҳои java.sql эҷод мекунем.

Дар гурӯҳ нашр шудааст
Қисми якум Қисми дуюм
Қисми 3. Мо скелети пойгоҳи додаи худро, аввалин фармонҳои SQL-ро бо истифода аз мисолҳои java.sql эҷод мекунем.  - 1

Барномаи Java

Ташкилоти 3-зинагӣ

Биёед ба барномаи Java баргардем. Версияи қисми қаблӣ бо услуби HelloWorld барои назорат кардани дурустии амалҳои ибтидоӣ сохта шудааст. Мо меъмории сесатҳаро (сеқабатаро) амалӣ менамоем, ки онро дар адабиёти англисӣ аксар вақт 3tier/3layer меноманд . Мохияти мухтасари он чунин аст:
  • Ҳама an objectҳо ҳамчун намуна тарҳрезӣ шудаанд. Инҳо an objectҳое мебошанд, ки дар бар мегиранд:
    • Маҷмӯи атрибутҳо (майдонҳои хусусии синф).
    • Сохтмон(ҳо).
    • Танзимкунандагон ва гирандагон барои танзим/хонидани атрибутҳо.
    • Муҳим он аст, ки онҳо ба ғайр аз гуфтаҳои боло ягон рамзи дигаре надоранд. Чунин an objectҳоро аксар вақт POJO (Объекти оддӣ Java кӯҳна) меноманд .
  • Тамоми мантиқи кор бо моделҳо аз ҷониби қабати Сервис амалӣ карда мешавад. Он қоидаҳои тиҷоратро барои моделҳо тавлид мекунад. Масалан, коркарди дархостҳо аз барномаи Java. Далелҳои дархост ва натиҷаҳои баргардонидашуда аксар вақт моделҳоро (ё маҷмӯаҳои онҳоро) дар бар мегиранд.
  • Қабати репозиторий "миёнарав" байни DBMS ва Service буда, мустақиман бо пойгоҳи додаҳо кор мекунад ва барои ҳамкорӣ бо он масъул аст.
Қисми 3. Мо скелети пойгоҳи додаи худро, аввалин фармонҳои SQL-ро бо истифода аз мисолҳои java.sql эҷод мекунем.  - 2 Чаро мо ҳатто бояд чунин конгломерат ташкил кунем? Гап дар он аст, ки ҳар як қабат аз дигарон ба ҳадди аксар ҷудо карда шудааст. Агар ба ҷои базаи маълумот мо маҷмӯи файлҳои матнӣ дошта бошем, пас мо танҳо бояд татбиқи анборро бидуни ламс кардани қисми боқимондаи code тағир диҳем. Ба ҳамин монанд, мо метавонем бо тағироти ҳадди ақал хидмати дигарро пайваст кунем/илова кунем . Барои системаҳои калон, мо метавонем татбиқи қабатҳои гуногунро ба одамони гуногун диҳем ё тавассути омезиши татбиқи оптималии қабатҳои гуногун таҷриба кунем. Биёед модели бастаҳо , репозиторий , хидматро барои замимаи мо эҷод кунем, ки дар он синфҳои мувофиқ ҷойгир хоҳанд шуд. Мо дар қисмҳои зерин ба қабати хидмат бармегардем, аммо ҳоло мо ба моделҳо ва анборҳо таваҷҷӯҳ хоҳем кард. Қисми 3. Мо скелети пойгоҳи додаи худро, аввалин фармонҳои SQL-ро бо истифода аз мисолҳои java.sql эҷод мекунем.  - 3

Модели

Ҳама an objectҳои мо (саҳмияҳо, тоҷирон, нархҳо ва амали тоҷирон) ва муодor ҷадвали онҳо як хусусияти умумӣ доранд - калиди ибтидоии сунъӣ. Аз ин рӯ, биёед синфи асосиро эҷод кунем 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);
    }
}
Дар зер намунаи модели саҳҳомӣ оварда шудааст. Шумо метавонед боқимондаи рӯйхати моделҳоро тавассути истиноди анбори github дар охири мақола бубинед.
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

Дар қисми аввал мо фаҳмидем, ки чӣ гуна пайвастшавӣ ба пойгоҳи додаҳо ва бастани он. Акнун биёед пеш равем. Марҳилаҳои кор бо JDBC дар диаграммаи зерин нишон дода шудаанд: Қисми 3. Мо скелети пойгоҳи додаи худро, аввалин фармонҳои SQL-ро бо истифода аз мисолҳои java.sql эҷод мекунем.  - 4
  • Class.forName()синфро бор мекунад ва онро дар DriverManager сабт мекунад;
  • DriverManager.getConnection()бармегардад Connection- пайвастшавӣ ба пойгоҳи додаҳо, ки дар аргументи метод ва бо истифода аз драйвери мувофиқи JDBC муайян шудааст (ки бо истифода аз . бор карда шудааст Class.forName()).
  • createStatement()Statementan objectеро ба мо бармегардонад , ки дар асоси он мо метавонем дархостҳоро ба пойгоҳи додаҳо ташкил кунем. Инчунин ҳастанд:
      CallableStatementбарои даъват кардани функсияҳо ва proceduresаҳои SQL-и DBMS (онҳо захирашуда номида мешаванд).
    • PreparedStatementмусоидат ба эҷоди дархостҳои параметрӣ ва пакетӣ.
  • Доштани "дар даст" ба шумо имкон statementмедиҳад execute(), ки дархостро дар шакли фармони забони дархости SQL мустақиман ба иҷрои DBMS ирсол кунед ва посухро дар шакли ResultSet. Барои роҳат инҳоянд:
    • executeQuery()– барои хондани маълумот аз МДМ.
    • executeUpdate()- барои тағир додани маълумот дар DBMS.
  • Худи посухи server ResultSetметавонад дар шакл тавассути такрори тавассути first(), last(), next()ва ғайра коркард карда шавад. Мо метавонем соҳаҳои натиҷаҳои инфиродиро тавассути гирандагон ба даст орем: getInteger(), getString()...
Дар хотир бояд дошт, ки пас аз кор бо МБМ, барои сарфаи захираҳо, an objectҳои паси шумо (бо тартиби дуруст!) пӯшидани захираҳо ва ResultSetсарфа кардани захираҳо тавсия дода мешавад. Дар хотир доред, ки ҳангоми пӯшидани an objectе, ки дар пайдарпаии диаграмма болотар аст, шумо ҳама an objectҳои дар ҷараёни кор бо он тавлидшударо каскад мепӯшед. Ҳамин тариқ, бастани пайвастшавӣ боиси баста шудани ҳама ва ҳама бо кӯмаки онҳо мегардад. StatementConnectionStatementResultSet

Амалисозии репозиторий

Пас аз қисми назариявии 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. Биёед қобorяти дигари кор бо ҷадвалро дар шакли усули нави интерфейс илова кунем.
  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 аз нуқтаи назари ташкor ҷадвалҳои базаи маълумотҳо, муқаррар кардани маҳдудиятҳо дар майдонҳо ва муносибатҳои байни ҷадвалҳо.
  • Бештар дар бораи ҳамкорӣ бо JDBC.
  • Архитектураи сеқабата (сеқабата) Модели/Анбор/Хизматрасонии барномаи коркарди додаҳо.

истинодҳои муфид

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION