JavaRush /Java blogi /Random-UZ /3-qism. Biz java.sql misollari yordamida ma'lumotlar baza...

3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.

Guruhda nashr etilgan
Birinchi qism Ikkinchi qism
3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 1

Java ilovasi

3 bosqichli tashkilot

Keling, Java dasturiga qaytaylik. Dastlabki harakatlarning to'g'riligini nazorat qilish uchun oldingi qismdagi versiya HelloWorld uslubida yaratilgan. Biz uch bosqichli (uch qavatli) arxitekturani amalga oshiramiz, bu ingliz tilidagi adabiyotda ko'pincha 3-layer/3 qatlam deb ataladi . Uning qisqacha mohiyati quyidagicha:
  • Barcha ob'ektlar model sifatida yaratilgan. Bular quyidagilarni o'z ichiga olgan ob'ektlar:
    • Atributlar to'plami (sinfning shaxsiy maydonlari).
    • Konstruktor(lar).
    • Atributlarni o'rnatish/o'qish uchun sozlagichlar va oluvchilar.
    • Ularda yuqoridagilardan tashqari boshqa kodlar bo'lmasligi muhim. Bunday ob'ektlar ko'pincha POJO (Plain Old Java Object) deb ataladi.
  • Modellar bilan ishlashning barcha mantiqlari Xizmat qatlami tomonidan amalga oshiriladi. U modellar uchun biznes qoidalarini ishlab chiqadi. Masalan, Java dasturidan so'rovlarni qayta ishlash. So'rov argumentlari va qaytarilgan natijalar ko'pincha modellarni (yoki ularning to'plamlarini) o'z ichiga oladi.
  • Repository qatlami ma'lumotlar bazasi bilan bevosita ishlaydigan va u bilan o'zaro aloqa qilish uchun javobgar bo'lgan DBMS va Xizmat o'rtasida "vositachi" hisoblanadi.
3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 2 Nega bunday konglomeratni shakllantirishimiz kerak? Gap shundaki, har bir qatlam boshqalardan maksimal darajada ajratilgan. Agar ma'lumotlar bazasi o'rniga bizda matnli fayllar to'plami mavjud bo'lsa, biz kodning qolgan qismiga tegmasdan faqat omborni amalga oshirishni o'zgartirishimiz kerak. Xuddi shunday, biz minimal o'zgarishlar bilan boshqa Xizmatni ulashimiz/qo'shishimiz mumkin . Katta tizimlar uchun biz turli qatlamlarni amalga oshirishni turli odamlarga berishimiz yoki turli qatlamlarning optimal ilovalarini birlashtirish orqali tajriba qilishimiz mumkin. Keling, ilovamiz uchun mos keladigan sinflar joylashgan model , ombor , xizmat paketlarini yarataylik. Keyingi qismlarda Xizmat qatlamiga qaytamiz, ammo hozircha biz modellar va omborlarga e'tibor qaratamiz. 3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 3

Model

Bizning barcha ob'ektlarimiz (aktsiyalar, treyderlar, stavkalar va treyderlarning harakatlari) va ularning jadval ekvivalentlari umumiy xususiyatga ega - sun'iy asosiy kalit. Shuning uchun, asosiy sinf yarataylik BaseModel. Barcha modellar undan meros bo'lib qoladi.
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);
    }
}
Quyida aktsionerlik modelining namunasi keltirilgan. Siz maqolaning oxiridagi github omboriga havola orqali model ro'yxatlarining qolgan qismini ko'rishingiz mumkin.
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

Birinchi qismda biz ma'lumotlar bazasiga ulanishni o'rnatish va uni yopishni o'rgandik. Endi davom etaylik. JDBC bilan ishlash bosqichlari quyidagi diagrammada ko'rsatilgan: 3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 4
  • Class.forName()sinfni yuklaydi va DriverManager bilan ro'yxatdan o'tkazadi;
  • DriverManager.getConnection()qaytib keladi Connection- usul argumentida ko'rsatilgan va mos keladigan JDBC drayveridan foydalangan holda ma'lumotlar bazasiga ulanish (u yordamida yuklangan Class.forName()).
  • createStatement()bizga ob'ektni qaytaradi Statement, uning asosida biz ma'lumotlar bazasiga so'rovlarni shakllantirishimiz mumkin. Shuningdek, quyidagilar mavjud:
      CallableStatementDBMSning o'z SQL funksiyalari va protseduralarini chaqirish uchun (ular saqlangan deb ataladi).
    • PreparedStatementparametrlangan va ommaviy so'rovlarni yaratishga yordam beradi.
  • "Qo'lda" bo'lish sizga SQL so'rovlar tili buyrug'i ko'rinishidagi so'rovni to'g'ridan-to'g'ri DBMS bajarilishiga yuborish va javobni shaklida qaytarish imkonini statementberadi . Qulaylik uchun quyidagilar mavjud: execute()ResultSet
    • executeQuery()– maʼlumotlar bazasidan maʼlumotlarni oʻqish uchun.
    • executeUpdate()– DBMSdagi ma’lumotlarni o‘zgartirish uchun.
  • Server javobining o'zi , va hokazo ResultSetorqali takrorlash orqali shaklda qayta ishlanishi mumkin . Biz individual natijalar maydonlarini oluvchilar orqali olishimiz mumkin: , ...first()last()next()getInteger()getString()
Shuni yodda tutish kerakki, DBMS bilan ishlagandan so'ng, resurslarni tejash uchun sizning orqangizdagi ob'ektlarni yopish (to'g'ri tartibda!) va ResultSetresurslarni tejash tavsiya etiladi. Esda tutingki, diagrammadagi ketma-ketlikda yuqoriroq bo'lgan ob'ektni yopayotganda, siz u bilan ishlash jarayonida hosil bo'lgan barcha ob'ektlarni kaskad bilan yopasiz. Shunday qilib, ulanishning yopilishi uning barcha va ularning yordami bilan qabul qilingan barcha yopilishiga olib keladi. StatementConnectionStatementResultSet

Repozitariyni amalga oshirish

JDBC nazariy qismidan so'ng, biz omborni amalga oshirishga o'tamiz. Biz uni me'moriy jihatdan quyidagicha amalga oshiramiz:
  • Biz ma'lumotlar bazasi bilan ishlashning eng umumiy qismlarini umumiy ajdodga o'tkazamiz - BaseTable;
  • Biz bajaradigan mantiqiy operatsiyalar interfeysda e'lon qilinadi TableOperation;
3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 5 Yangi ombor sinfdan meros oladi BaseTableva interfeysni amalga oshiradi TableOperation. Shunday qilib, biz interfeysda e'lon qilingan usullarni amalga oshirishni yozishimiz kerak TableOperation. Bunday holda, biz ota-klassning usullaridan foydalanishimiz mumkin BaseTable. Hozirgi vaqtda interfeys jadvallarni yaratish usullarini e'lon qiladi:
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; // создание дополнительных правил для значений полей таблиц
}
Materialni o'rganar ekansiz, usul deklaratsiyasi ro'yxati kengayadi ( read(), update()….). Biz yangi xususiyatlarni ikki bosqichda amalga oshiramiz:
  1. Keling, yangi interfeys usuli ko'rinishida jadval bilan ishlashning yana bir qobiliyatini qo'shamiz.
  2. Keyinchalik, interfeysni amalga oshiradigan sinflarda biz interfeys tomonidan yaratilgan yangi usullarda dasturiy ta'minotni amalga oshirishni tasvirlaymiz.
Share(Aktsiyalar) uchun namuna ombori . Asosiy mantiq jadvallarni yaratish, maydonlar uchun SQL ma'lumotlar turlarini belgilash va cheklovlar qo'shish buyruqlarida:
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");

    }
}
Maqolaning oxiridagi github omboriga havola orqali boshqa omborlar va ota-sinflar roʻyxati mavjud. Albatta, siz boshqa dastur dizaynini yoki dasturni yanada chuqurroq qayta ishlashingiz mumkin: umumiy qismlarni ota-sinfga o'tkazish, umumiy usullarni ajratib ko'rsatish va hokazo. Ammo maqolalar seriyasining asosiy maqsadi to'g'ridan-to'g'ri ma'lumotlar bazasi bilan ishlashdir, shuning uchun agar xohlasangiz, dasturni loyihalash va shunga o'xshash narsalarni o'zingiz qilishingiz mumkin. Loyihaning joriy tuzilishi: omborlar va modellarga qo'shimcha ravishda biz emulyatsiyamizni umumiy boshqarish uchun 3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 6 qo'shimcha sinf yaratdik . StockExchangeDBUshbu bosqichda biz omborlarni boshqaramiz (keyingi qismlarda biz xizmatlarga o'tamiz). Biz ularni e'lon qilamiz va jadvallar yaratishni boshlaymiz:
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 драйвер для СУБД не найден!");
        }
    }
}
Amalga oshirish natijasi: 3-qism. Biz java.sql misollari yordamida ma'lumotlar bazasining skeletini, birinchi SQL buyruqlarini yaratamiz.  - 7

Xulosa

Maqolaning ikkinchi va uchinchi qismlarida biz quyidagilarni bilib oldik:
  • SQL ma'lumotlar turlari.
  • Ma'lumotlar bazasi jadvallari.
  • Ma'lumotlar bazasini loyihalash: jadval tuzilmalari va ular orasidagi munosabatlar.
  • Ma'lumotlar bazasi jadvallarini yaratish, maydonlarga cheklovlar o'rnatish va jadvallar orasidagi munosabatlar nuqtai nazaridan SQL so'rovlar tili.
  • JDBC bilan o'zaro aloqalar haqida ko'proq.
  • Ma'lumotlarni qayta ishlash dasturining uch bosqichli (uch qatlamli) modeli/repozitoriy/xizmat arxitekturasi.

foydali havolalar

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