Birinchi qism Ikkinchi qism
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.
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 yarataylikBaseModel
. 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:Class.forName()
sinfni yuklaydi va DriverManager bilan ro'yxatdan o'tkazadi;DriverManager.getConnection()
qaytib keladiConnection
- usul argumentida ko'rsatilgan va mos keladigan JDBC drayveridan foydalangan holda ma'lumotlar bazasiga ulanish (u yordamida yuklanganClass.forName()
).createStatement()
bizga ob'ektni qaytaradiStatement
, uning asosida biz ma'lumotlar bazasiga so'rovlarni shakllantirishimiz mumkin. Shuningdek, quyidagilar mavjud:PreparedStatement
parametrlangan va ommaviy so'rovlarni yaratishga yordam beradi.
CallableStatement
DBMSning o'z SQL funksiyalari va protseduralarini chaqirish uchun (ular saqlangan deb ataladi).- "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
statement
beradi . 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
ResultSet
orqali takrorlash orqali shaklda qayta ishlanishi mumkin . Biz individual natijalar maydonlarini oluvchilar orqali olishimiz mumkin: , ...first()
last()
next()
getInteger()
getString()
ResultSet
resurslarni 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. Statement
Connection
Statement
ResultSet
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
;
BaseTable
va 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:
- Keling, yangi interfeys usuli ko'rinishida jadval bilan ishlashning yana bir qobiliyatini qo'shamiz.
- 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 qo'shimcha sinf yaratdik . StockExchangeDB
Ushbu 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:
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.
GO TO FULL VERSION