JavaRush /Java Blog /Random-TK /Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýrukl...

Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.

Toparda çap edildi
Birinji bölüm Ikinji bölüm
Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 1

Java programmasy

3 derejeli gurama

Java programmasyna gaýdyp geleliň. Öňki bölümdäki wersiýa başlangyç hereketleriň dogrulygyny gözegçilikde saklamak üçin HelloWorld stilinde döredildi. Iňlis dilindäki edebiýatda köplenç 3tier / 3layer diýlip atlandyrylýan üç derejeli (üç gatly) arhitekturany durmuşa geçirýäris . Gysga manysy:
  • Entitieshli guramalar model hökmünde işlenip düzüldi. Bular öz içine alýan zatlar:
    • Sypatlaryň toplumy (synpyň hususy meýdanlary).
    • Gurluşykçy (lar)
    • Aýratynlyklary düzmek / okamak üçin sazlaýjylar we alyjylar.
    • Aboveokardakylardan başga kodlaryň ýoklugy möhümdir. Şeýle obýektlere köplenç POJO (Plain Old Java Object) diýilýär .
  • Modeller bilen işlemek üçin ähli logika Hyzmat gatlagy tarapyndan amala aşyrylýar. Modeller üçin iş düzgünlerini döredýär. Mysal üçin, Java programmasyndan haýyşlary gaýtadan işlemek. Talap argumentleri we gaýdyp gelen netijeler köplenç modelleri (ýa-da olaryň ýygyndylaryny) öz içine alýar.
  • Ammar gatlagy DBMS bilen Hyzmatyň arasynda gönüden-göni maglumatlar bazasy bilen işleýän we onuň bilen täsirleşmek üçin jogapkär "araçy".
Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 2 Näme üçin hatda şeýle konglomeraty döretmeli? Hakykat, her gatlak beýlekilerden iň ýokary derejede izolirlenendir. Maglumatlar bazasynyň ýerine tekst faýllarynyň toplumy bar bolsa, diňe koduň galan bölegine degmezden Ammaryň ýerine ýetirilişini üýtgetmeli . Şonuň ýaly-da, minimal üýtgeşmeler bilen başga bir hyzmaty birikdirip / goşup bileris . Uly ulgamlar üçin dürli gatlaklaryň ýerine ýetirilişini dürli adamlara berip bileris ýa-da dürli gatlaklaryň optimal ýerine ýetirilişini birleşdirip synag edip bileris. Geliň, degişli synplaryň ýerleşýän ýeri bolan amalymyz üçin paket modelini , ammary , hyzmaty döredeliň. Aşakdaky bölümlerde Hyzmat gatlagyna gaýdyp geleris, ýöne häzirlikçe modellere we ammarlara üns bereris. Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 3

Model

Entitieshli guramalarymyz (paýnamalar, söwdagärler, nyrhlar we söwdagärleriň hereketleri) we olaryň tablisa ekwiwalentleri umumy bir aýratynlyga eýe - emeli başlangyç açar. Şonuň üçin esasy synp döredeliň BaseModel. Modelshli modeller ondan miras alarlar.
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);
    }
}
Aşakda bir stocka modeli görkezilýär. Model sanawlarynyň galan bölegini makalanyň soňundaky github ammaryna baglanyşyk arkaly görüp bilersiňiz.
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

Birinji bölümde maglumatlar bazasyna nädip baglanyşyk gurmalydygyny we ýapylmagyny öwrendik. Indi dowam edeliň. JDBC bilen işlemegiň tapgyrlary aşakdaky diagrammada görkezilýär: Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 4
  • Class.forName()synpy ýükleýär we DriverManager bilen hasaba alýar;
  • DriverManager.getConnection()gaýdyp geler Connection- usul argumentinde görkezilen we degişli JDBC draýwerini ulanyp maglumat bazasyna birikme (ulanyp ýüklendi Class.forName()).
  • createStatement()Statementmaglumatlar bazasyna talaplar döredip biljek bir obýektimizi bize gaýtaryp berer . Şeýle hem bar:
      CallableStatementDBMS-iň öz SQL funksiýalaryna we proseduralaryna jaň etmek (saklanýar diýilýär).
    • PreparedStatementparametrleşdirilen we partiýa talaplaryny döretmäge kömek edýär.
  • “Eliňizde” bolmak, SQL talap dili buýrugy görnüşinde gönüden-göni DBMS ýerine ýetirilişine haýyş ibermäge we jogap görnüşinde jogap bermäge mümkinçilik statementberer . Amatly bolmak üçin: execute()ResultSet
    • executeQuery()- DBMS-den maglumatlary okamak üçin.
    • executeUpdate()- DBMS-de maglumatlary üýtgetmek.
  • Serweriň jogabynyň özi, ResultSetgaýtalanyp we ş.m. görnüşde işlenip bilner first(). Aýry-aýry netijeler meýdanlaryny alyjylar arkaly alyp bileris : , ...last()next()getInteger()getString()
DBMS bilen işlänsoň, serişdeleri tygşytlamak üçin yzyňyzdaky zatlary (dogry tertipde!) Andapmak we ResultSetçeşmeleri tygşytlamak maslahat berilýändigini ýadyňyzdan çykarmaly däldiris . Diagrammadaky yzygiderlilikde has ýokary bir obýekti ýapanyňyzda, onuň bilen işlemekde döredilen ähli obýektleri kaskad bilen ýapjakdygyňyzy ýadyňyzdan çykarmaň. Şeýlelik bilen, baglanyşygy ýapmak, hemmesiniň we olaryň kömegi bilen alnanlaryň hemmesiniň ýapylmagyna getirer . StatementConnectionStatementResultSet

Ammary ýerine ýetirmek

Nazary JDBC bölüminden soň, ammaryň durmuşa geçirilmegine geçeliň. Biz binagärlik taýdan aşakdaky ýaly durmuşa geçirýäris:
  • DBMS bilen işlemegiň iň umumy böleklerini umumy ata-babamyza geçireris - BaseTable;
  • Etjek logiki amallarymyz interfeýsde yglan ediler TableOperation;
Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 5 Täze ammar synpdan miras galar BaseTablewe interfeýsi durmuşa geçirer TableOperation. Şeýlelikde, interfeýsde yglan edilen usullaryň ýerine ýetirilişini ýazmalydyrys TableOperation. Bu ýagdaýda ene-atalar synpynyň usullaryny ulanyp bileris BaseTable. Häzirki wagtda interfeýs tablisalary döretmegiň usullaryny yglan edýär:
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; // создание дополнительных правил для значений полей таблиц
}
Materiallary öwreneniňizde usul beýannamalarynyň sanawy giňeler ( read(), update()....). Täze aýratynlyklary iki ädimde durmuşa geçireris:
  1. Täze interfeýs usuly görnüşinde tablisa bilen işlemek üçin başga bir ukyp goşalyň.
  2. Ondan soň, interfeýsi durmuşa geçirýän sapaklarda programma üpjünçiligini interfeýsiň döreden täze usullarynda beýan ederis.
Share(Aksiýalar) üçin ammar . Esasy logika, tablisalary döretmek, meýdanlar üçin SQL maglumat görnüşlerini kesgitlemek we çäklendirmeleri goşmak buýruklarynda:
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");

    }
}
Beýleki ammarlaryň we ene synpyň sanawlary, makalanyň soňundaky github ammaryna baglanyşyk arkaly elýeterlidir. Elbetde, başga bir programma dizaýnyny ýa-da programmany has içgin üýtgedip bilersiňiz: umumy bölekleri ene synpyna geçirmek, umumy usullary bellemek we ş.m. Articleöne makalalar tapgyrynyň esasy maksady maglumatlar bazasy bilen gönüden-göni işlemekdir, isleseňiz programmany we şuňa meňzeşleri dizaýn edip bilersiňiz, özüňiz edip bilersiňiz. Häzirki taslama gurluşy: Ammarlardan we modellerden başga-da, emulýasiýamyzy umumy dolandyrmak üçin Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 6 synp döretdik . StockExchangeDBBu etapda ammarlary dolandyrýarys (indiki bölümlerde hyzmatlara geçeris). Olary yglan edýäris we tablisalary döredip başlaýarys:
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 драйвер для СУБД не найден!");
        }
    }
}
Ecutionerine ýetiriş netijesi: Bölüm 3. Java.sql mysallaryny ulanyp, ilkinji SQL buýruklary bolan maglumatlar bazamyzyň süňküni döredýäris.  - 7

Gysgaça mazmun

Makalanyň ikinji we üçünji bölümlerinde öwrendik:
  • SQL maglumat görnüşleri.
  • Maglumat bazasynyň tablisalary.
  • Maglumatlar bazasynyň dizaýny: tablisanyň gurluşlary we olaryň arasyndaky gatnaşyklar.
  • Maglumatlar bazasynyň tablisalaryny döretmek, meýdanlara we tablisalaryň arasyndaky gatnaşyklara çäklendirmeler goýmak nukdaýnazaryndan SQL talap dili.
  • JDBC bilen özara täsir hakda has giňişleýin.
  • Üç derejeli (üç gatly) Model / Ammar / Maglumatlary gaýtadan işlemek programmasynyň hyzmat arhitekturasy.

peýdaly baglanyşyklar

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION