Birinji bölüm Ikinji bölüm
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".
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:Class.forName()
synpy ýükleýär we DriverManager bilen hasaba alýar;DriverManager.getConnection()
gaýdyp gelerConnection
- usul argumentinde görkezilen we degişli JDBC draýwerini ulanyp maglumat bazasyna birikme (ulanyp ýüklendiClass.forName()
).createStatement()
Statement
maglumatlar bazasyna talaplar döredip biljek bir obýektimizi bize gaýtaryp berer . Şeýle hem bar:PreparedStatement
parametrleşdirilen we partiýa talaplaryny döretmäge kömek edýär.
CallableStatement
DBMS-iň öz SQL funksiýalaryna we proseduralaryna jaň etmek (saklanýar diýilýä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
statement
berer . Amatly bolmak üçin:execute()
ResultSet
executeQuery()
- DBMS-den maglumatlary okamak üçin.
executeUpdate()
- DBMS-de maglumatlary üýtgetmek. - Serweriň jogabynyň özi,
ResultSet
gaýtalanyp we ş.m. görnüşde işlenip bilnerfirst()
. Aýry-aýry netijeler meýdanlaryny alyjylar arkaly alyp bileris : , ...last()
next()
getInteger()
getString()
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 . Statement
Connection
Statement
ResultSet
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
;
BaseTable
we 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:
- Täze interfeýs usuly görnüşinde tablisa bilen işlemek üçin başga bir ukyp goşalyň.
- 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 synp döretdik . StockExchangeDB
Bu 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:
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.
GO TO FULL VERSION