JavaRush /Blog Jawa /Random-JV /Part 3. Kita nggawe balung database kita, perintah SQL pi...

Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.

Diterbitake ing grup
Bagean pisanan Bagean kapindho
Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 1

Aplikasi Java

organisasi 3-tier

Ayo bali menyang aplikasi Java. Versi saka bagean sadurunge digawe ing gaya HelloWorld kanggo ngontrol kabeneran tumindak awal. Kita ngleksanakake arsitektur telung tingkat (telung lapisan), sing ing sastra basa Inggris asring diarani 3tier/3layer . Intine ringkes kaya ing ngisor iki:
  • Kabeh entitas dirancang minangka model. Iki minangka obyek sing ngemot:
    • Sakumpulan atribut (bidang pribadi kelas).
    • Konstruktor(s).
    • Setter lan getter kanggo nyetel / maca atribut.
    • Iku penting sing padha ora ngemot kode liyane kajaba ndhuwur. Benda-benda kuwi asring diarani POJO (Obyek Jawa Kuno Biasa).
  • Kabeh logika kanggo nggarap model ditindakake dening lapisan Layanan. Iku ngasilake aturan bisnis kanggo model. Contone, ngolah panjalukan saka aplikasi Java. Argumen pitakon lan asil bali asring kalebu model (utawa koleksi kasebut).
  • Lapisan Repositori minangka "perantara" antarane DBMS lan Layanan, bisa langsung karo database lan tanggung jawab kanggo interaksi karo.
Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 2 Napa kita malah kudu mbentuk konglomerat kuwi? Kasunyatane yaiku saben lapisan diisolasi kanthi maksimal saka liyane. Yen tinimbang database, kita duwe set file teks, mula kita mung kudu ngganti implementasine Repository tanpa ndemek kode liyane. Kajaba iku, kita bisa nyambung / nambah Layanan liyane kanthi owah-owahan minimal. Kanggo sistem gedhe, kita bisa menehi implementasine lapisan sing beda kanggo wong sing beda-beda utawa eksperimen kanthi nggabungake implementasine sing optimal saka lapisan sing beda. Ayo nggawe model paket , gudang , layanan kanggo aplikasi kita, ing ngendi kelas sing cocog bakal ana. Kita bakal bali menyang lapisan Layanan ing bagean ing ngisor iki, nanging saiki kita bakal menehi perhatian marang model lan repositori. Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 3

Model

Kabeh entitas kita (saham, pedagang, tarif lan tumindak pedagang) lan padha karo meja duwe fitur umum - kunci utama buatan. Mulane, ayo nggawe kelas dhasar BaseModel. Kabeh model bakal oleh warisan saka iku.
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);
    }
}
Ing ngisor iki conto model saham. Sampeyan bisa ndeleng dhaptar model liyane kanthi ngetutake tautan menyang repositori github ing pungkasan artikel.
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

Ing bagean pisanan, kita sinau carane nggawe sambungan menyang database lan nutup. Saiki ayo nerusake. Tahap nggarap JDBC ditampilake ing diagram ing ngisor iki: Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 4
  • Class.forName()mbukak kelas lan ndhaptar karo DriverManager;
  • DriverManager.getConnection()bakal bali Connection- sambungan menyang database sing ditemtokake ing argumen metode lan nggunakake driver JDBC sing cocog (sing dimuat nggunakake Class.forName()).
  • createStatement()bakal bali menyang kita Statementobyek ing basis kang kita bisa mbentuk pitakonan kanggo database. Ana uga:
      CallableStatementkanggo nelpon fungsi lan tata cara SQL DBMS dhewe (disebut disimpen).
    • PreparedStatementnggampangake nggawe pitakon parameter lan batch.
  • Duwe "ing tangan" statementbakal execute()ngidini sampeyan ngirim panjalukan ing wangun perintah basa query SQL langsung menyang eksekusi DBMS lan ngasilake respon ing wangun ResultSet. Kanggo penak ana:
    • executeQuery()– kanggo maca data saka DBMS.
    • executeUpdate()– kanggo ngowahi data ing DBMS.
  • Tanggepan server dhewe ResultSetbisa diproses ing wangun kanthi iterasi liwat first(), last(), next()lan liya-liyane. Kita bisa entuk lapangan asil individu liwat getter: getInteger(), getString()...
Sampeyan kudu eling yen sawise nggarap DBMS, kanggo ngirit sumber daya, disaranake nutup obyek ing mburi sampeyan (ing urutan sing bener!) ResultSet, StatementLan Connectionkanggo nyimpen sumber daya. Elinga, nalika nutup obyek sing luwih dhuwur ing urutan ing diagram, sampeyan bakal cascade nutup kabeh obyek kui ing proses nggarap iku. Mangkono, nutup sambungan bakal mimpin kanggo nutup kabeh Statementlan kabeh ResultSetditampa kanthi bantuan.

Implementasine Repository

Sawise bagean JDBC teoritis, ayo pindhah menyang implementasine repositori. Kita ngleksanakake arsitektur kaya ing ngisor iki:
  • Kita bakal mindhah bagean paling umum nggarap DBMS menyang leluhur umum - BaseTable;
  • Operasi logis sing bakal ditindakake bakal diumumake ing antarmuka TableOperation;
Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 5 Repositori anyar bakal diwenehi warisan saka kelas BaseTablelan ngleksanakake antarmuka TableOperation. Mangkono, kita kudu nulis implementasine saka cara sing diumumake ing antarmuka TableOperation. Ing kasus iki, kita bisa nggunakake metode kelas induk BaseTable. Saiki, antarmuka nyatakake cara kanggo nggawe tabel:
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; // создание дополнительных правил для значений полей таблиц
}
Nalika sampeyan sinau materi, dhaptar deklarasi metode bakal ditambahi ( read(), update()….). Kita bakal ngetrapake fitur-fitur anyar ing rong langkah:
  1. Ayo nambah kemampuan liyane kanggo nggarap tabel kanthi cara antarmuka anyar.
  2. Sabanjure, ing kelas ngleksanakake antarmuka, kita bakal njlèntrèhaké implementasine piranti lunak ing cara anyar sing digawe dening antarmuka.
Conto gudang kanggo Share(saham). Logika utama ana ing printah kanggo nggawe tabel, nemtokake jinis data SQL kanggo lapangan lan nambah watesan:
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");

    }
}
Dhaptar repositori liyane lan kelas induk kasedhiya liwat link menyang repositori github ing pungkasan artikel. Mesthi, sampeyan bisa nindakake desain program sing beda utawa refactoring program sing luwih lengkap: mindhah bagean umum menyang kelas induk, nyorot cara umum, lan liya-liyane. Nanging tujuan utama saka seri artikel kasebut yaiku langsung nggarap database, dadi yen sampeyan pengin, sampeyan bisa ngrancang program lan liya-liyane, sampeyan bisa nindakake dhewe. Struktur proyek saiki: Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 6 Saliyane repositori lan model, kita uga nggawe kelas StockExchangeDBkanggo manajemen umum emulasi kita. Ing tahap iki, kita ngatur repositori (ing bagean sabanjure kita bakal pindhah menyang layanan). Kita ngumumake lan miwiti nggawe tabel:
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 драйвер для СУБД не найден!");
        }
    }
}
Hasil eksekusi: Part 3. Kita nggawe balung database kita, perintah SQL pisanan nggunakake conto java.sql.  - 7

Ringkesan

Ing bagean kapindho lan katelu saka artikel kita sinau:
  • Tipe data SQL.
  • Tabel database.
  • Ngrancang database: struktur tabel lan hubungan antarane.
  • Basa query SQL babagan nggawe tabel database, nyetel watesan ing lapangan lan hubungan antarane tabel.
  • Liyane babagan interaksi karo JDBC.
  • Arsitektur model/Repositori/Layanan telung tingkat (telung lapisan) saka aplikasi pangolahan data.

pranala migunani

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