JavaRush /Java блогы /Random-KK /3-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдар...
Marat Sadykov
Деңгей

3-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші SQL командаларын жасаймыз.

Топта жарияланған
Бірінші бөлім Екінші бөлім
3-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші SQL командаларын жасаймыз.  - 1

Java қолданбасы

3 деңгейлі ұйым

Java қолданбасына оралайық. Алдыңғы бөліктегі нұсқа бастапқы әрекеттердің дұрыстығын бақылау үшін HelloWorld стилінде жасалған . Біз үш деңгейлі (үш қабатты) архитектураны жүзеге асырамыз, оны ағылшын тіліндегі әдебиетте жиі 3 деңгейлі/3 қабатты деп атайды . Оның қысқаша мәні келесідей:
  • Барлық нысандар үлгі ретінде жасалған. Бұл мыналарды қамтитын нысандар:
    • Атрибуттар жиынтығы (сыныптың жеке өрістері).
    • Конструктор(лар).
    • Атрибуттарды орнату/оқу үшін орнатушылар мен қабылдағыштар.
    • Оларда жоғарыда айтылғандардан басқа ешбір codeтың болмауы маңызды. Мұндай нысандар жиі POJO (Plain Old Java Object) деп аталады .
  • Модельдермен жұмыс істеудің барлық логикасын Сервис деңгейі жүзеге асырады. Ол үлгілер үшін бизнес ережелерін жасайды. Мысалы, Java қолданбасынан сұрауларды өңдеу. Сұрау аргументтері және қайтарылған нәтижелер көбінесе үлгілерді (немесе олардың жинақтарын) қамтиды.
  • Репозиторий деңгейі дерекқормен тікелей жұмыс істейтін және онымен әрекеттесу үшін жауап беретін ДҚБЖ мен Сервис арасындағы «делдал» болып табылады.
3-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші SQL командаларын жасаймыз.  - 2 Неліктен бізге мұндай конгломерат құру керек? Өйткені, әрбір қабат басқалардан барынша оқшауланған. Егер дерекқордың орнына бізде мәтіндік файлдар жинағы болса, онда codeтың қалған бөлігіне қол тигізбестен Репозиторийдің орындалуын өзгерту керек . Сол сияқты, біз ең аз өзгерістермен басқа Қызметті қосуға/қосуға болады . Үлкен жүйелер үшін біз әртүрлі қабаттардың орындалуын әртүрлі адамдарға бере аламыз немесе әртүрлі қабаттардың оңтайлы іске асыруларын біріктіру арқылы эксперимент жасай аламыз. Сәйкес сыныптар орналасатын қолданбамыз үшін үлгі , репозиторий , сервис пакеттерін жасайық . Біз келесі бөліктерде Қызмет деңгейіне ораламыз, бірақ әзірге үлгілер мен репозиторийлерге назар аударамыз. 3-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші 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);
    }
}
Төменде акция үлгісінің мысалы берілген. Қалған үлгі тізімдерін мақаланың соңындағы 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-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші SQL командаларын жасаймыз.  - 4
  • Class.forName()сыныпты жүктейді және оны DriverManager арқылы тіркейді;
  • DriverManager.getConnection()қайтарылады Connection– әдіс аргументінде көрсетілген және сәйкес JDBC драйверін пайдалану арқылы (ол арқылы жүктелген) дерекқорға қосылу Class.forName().
  • createStatement()бізге нысанды қайтарады Statement, оның негізінде дерекқорға сұраныстарды қалыптастыра аламыз. Сондай-ақ бар:
      CallableStatementДҚБЖ өзіндік SQL функциялары мен proceduresаларын шақыру үшін (олар сақталған деп аталады).
    • PreparedStatementпараметрленген және пакеттік сұрауларды құруды жеңілдету.
  • «Қолында» болуы сізге SQL сұрау тілі пәрмені түріндегі сұрауды тікелей ДҚБЖ орындалуына жіберуге және түрінде жауап қайтаруға мүмкіндік statementбереді . Ыңғайлы болу үшін мыналар бар: execute()ResultSet
    • executeQuery()– ДҚБЖ деректерін оқу үшін.
    • executeUpdate()– ДҚБЖ деректерін өзгерту үшін.
  • Сервер жауабының өзін , және т.б. ResultSetарқылы қайталау арқылы пішінде өңдеуге болады . Жеке нәтиже өрістерін алушылар арқылы алуға болады: , ...first()last()next()getInteger()getString()
ДҚБЖ-мен жұмыс істегеннен кейін ресурстарды үнемдеу үшін артыңыздағы an objectілерді жабу (дұрыс ретпен!) және ResultSetресурстарды үнемдеу ұсынылады . Есіңізде болсын, диаграммадағы реттілікте жоғарырақ нысанды жабу кезінде сіз онымен жұмыс істеу процесінде жасалған барлық an objectілерді каскадты түрде жабасыз. Осылайша, қосылымды жабу оның барлығын және олардың көмегімен алынғандардың барлығын жабуға әкеледі .StatementConnectionStatementResultSet

Репозиторийді жүзеге асыру

Теориялық JDBC бөлімінен кейін репозиторийді жүзеге асыруға көшейік. Біз оны архитектуралық түрде келесідей жүзеге асырамыз:
  • ДҚБЖ-мен жұмыс істеудің ең жалпы бөліктерін ортақ атаға көшіреміз - BaseTable;
  • Біз орындайтын логикалық операциялар интерфейсте жарияланады TableOperation;
3-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші 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-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші 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-бөлім. Біз деректер қорының қаңқасын, java.sql мысалдарын пайдаланып бірінші SQL командаларын жасаймыз.  - 7

Түйіндеме

Мақаланың екінші және үшінші бөліктерінде біз білдік:
  • SQL деректер түрлері.
  • Мәліметтер базасының кестелері.
  • Мәліметтер қорын жобалау: кесте құрылымдары және олардың арасындағы байланыстар.
  • Мәліметтер қорының кестелерін құру, өрістерге шектеулер орнату және кестелер арасындағы қатынастар тұрғысынан SQL сұрау тілі.
  • JDBC-мен өзара әрекеттесу туралы толығырақ.
  • Деректерді өңдеу қолданбасының үш деңгейлі (үш қабатты) моделі/репозиторийі/қызмет архитектурасы.

пайдалы сілтемелер

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION