Қисми якум Қисми дуюм
Барномаи Java
Ташкилоти 3-зинагӣ
Биёед ба барномаи Java баргардем. Версияи қисми қаблӣ бо услуби HelloWorld барои назорат кардани дурустии амалҳои ибтидоӣ сохта шудааст. Мо меъмории сесатҳаро (сеқабатаро) амалӣ менамоем, ки онро дар адабиёти англисӣ аксар вақт 3tier/3layer меноманд . Мохияти мухтасари он чунин аст:- Ҳама an objectҳо ҳамчун намуна тарҳрезӣ шудаанд. Инҳо an objectҳое мебошанд, ки дар бар мегиранд:
- Маҷмӯи атрибутҳо (майдонҳои хусусии синф).
- Сохтмон(ҳо).
- Танзимкунандагон ва гирандагон барои танзим/хонидани атрибутҳо.
- Муҳим он аст, ки онҳо ба ғайр аз гуфтаҳои боло ягон рамзи дигаре надоранд. Чунин an objectҳоро аксар вақт POJO (Объекти оддӣ Java кӯҳна) меноманд .
- Тамоми мантиқи кор бо моделҳо аз ҷониби қабати Сервис амалӣ карда мешавад. Он қоидаҳои тиҷоратро барои моделҳо тавлид мекунад. Масалан, коркарди дархостҳо аз барномаи Java. Далелҳои дархост ва натиҷаҳои баргардонидашуда аксар вақт моделҳоро (ё маҷмӯаҳои онҳоро) дар бар мегиранд.
- Қабати репозиторий "миёнарав" байни DBMS ва Service буда, мустақиман бо пойгоҳи додаҳо кор мекунад ва барои ҳамкорӣ бо он масъул аст.
Модели
Ҳама an objectҳои мо (саҳмияҳо, тоҷирон, нархҳо ва амали тоҷирон) ва муодor ҷадвали онҳо як хусусияти умумӣ доранд - калиди ибтидоии сунъӣ. Аз ин рӯ, биёед синфи асосиро эҷод кунем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 дар диаграммаи зерин нишон дода шудаанд:Class.forName()
синфро бор мекунад ва онро дар DriverManager сабт мекунад;DriverManager.getConnection()
бармегардадConnection
- пайвастшавӣ ба пойгоҳи додаҳо, ки дар аргументи метод ва бо истифода аз драйвери мувофиқи JDBC муайян шудааст (ки бо истифода аз . бор карда шудаастClass.forName()
).createStatement()
Statement
an objectеро ба мо бармегардонад , ки дар асоси он мо метавонем дархостҳоро ба пойгоҳи додаҳо ташкил кунем. Инчунин ҳастанд:PreparedStatement
мусоидат ба эҷоди дархостҳои параметрӣ ва пакетӣ.
CallableStatement
барои даъват кардани функсияҳо ва proceduresаҳои SQL-и DBMS (онҳо захирашуда номида мешаванд).- Доштани "дар даст" ба шумо имкон
statement
медиҳадexecute()
, ки дархостро дар шакли фармони забони дархости SQL мустақиман ба иҷрои DBMS ирсол кунед ва посухро дар шаклиResultSet
. Барои роҳат инҳоянд:executeQuery()
– барои хондани маълумот аз МДМ.
executeUpdate()
- барои тағир додани маълумот дар DBMS. - Худи посухи server
ResultSet
метавонад дар шакл тавассути такрори тавассутиfirst()
,last()
,next()
ва ғайра коркард карда шавад. Мо метавонем соҳаҳои натиҷаҳои инфиродиро тавассути гирандагон ба даст орем:getInteger()
,getString()
...
ResultSet
сарфа кардани захираҳо тавсия дода мешавад. Дар хотир доред, ки ҳангоми пӯшидани an objectе, ки дар пайдарпаии диаграмма болотар аст, шумо ҳама an objectҳои дар ҷараёни кор бо он тавлидшударо каскад мепӯшед. Ҳамин тариқ, бастани пайвастшавӣ боиси баста шудани ҳама ва ҳама бо кӯмаки онҳо мегардад. Statement
Connection
Statement
ResultSet
Амалисозии репозиторий
Пас аз қисми назариявии JDBC, биёед ба татбиқи анбор гузарем. Мо онро аз ҷиҳати меъморӣ ба таври зерин амалӣ менамоем:- Мо қисмҳои умумии кор бо DBMS -ро ба аҷдоди умумӣ интиқол медиҳем -
BaseTable
; - Амалҳои мантиқӣ, ки мо иҷро хоҳем кард, дар интерфейс эълон карда мешаванд
TableOperation
;
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()
….). Мо хусусиятҳои навро дар ду марҳила амалӣ хоҳем кард:
- Биёед қобorяти дигари кор бо ҷадвалро дар шакли усули нави интерфейс илова кунем.
- Минбаъд, дар синфҳое, ки интерфейсро татбиқ мекунанд, мо татбиқи нармафзорро бо усулҳои нави интерфейси тавлидшуда тавсиф мекунем.
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 дар охири мақола дастрасанд. Албатта, шумо метавонед тарҳи дигари барнома ё рефакторинги ҳамаҷонибаи барномаро иҷро кунед: қисмҳои умумиро ба синфи волидайн интиқол диҳед, усулҳои умумиро таъкид кунед ва ғайра. Аммо ҳадафи асосии силсилаи мақолаҳо бевосита кор кардан бо базаи маълумот аст, бинобар ин, шумо метавонед барнома ва монанди инҳоро тарҳрезӣ кунед, шумо метавонед онро худатон анҷом диҳед. Сохтори кунунии лоиҳа: Илова ба анборҳо ва моделҳо, мо ба таври иловагӣ синфро 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 драйвер для СУБД не найден!");
}
}
}
Натиҷаи иҷро:
Хулоса
Дар қисмҳои дуюм ва сеюми мақола мо фаҳмидем:- Намудҳои маълумоти SQL.
- Ҷадвалҳои пойгоҳи додаҳо.
- Тарҳрезии пойгоҳи додаҳо: сохторҳои ҷадвал ва муносибатҳои байни онҳо.
- Забони дархости SQL аз нуқтаи назари ташкor ҷадвалҳои базаи маълумотҳо, муқаррар кардани маҳдудиятҳо дар майдонҳо ва муносибатҳои байни ҷадвалҳо.
- Бештар дар бораи ҳамкорӣ бо JDBC.
- Архитектураи сеқабата (сеқабата) Модели/Анбор/Хизматрасонии барномаи коркарди додаҳо.
истинодҳои муфид
- Engine Database H2 (англисӣ) ;
- Тавсифи фармонҳои SQL (англисӣ) ;
- Намудҳои додаҳо дар H2 (англисӣ) ;
- Рӯйхати калимаҳои ҳифзшудаи SQL ;
- Китоб дарки SQL аз ҷониби Мартин Грабер;
- Асосҳои кор бо BigDecimal ;
- Анбори GitHub
GO TO FULL VERSION