پہلا حصہ دوسرا حصہ
جاوا ایپلی کیشن
3 درجے کی تنظیم
آئیے جاوا ایپلیکیشن پر واپس آتے ہیں۔ پچھلے حصے کا ورژن ابتدائی اعمال کی درستگی کو کنٹرول کرنے کے لیے ہیلو ورلڈ اسٹائل میں بنایا گیا تھا۔ ہم تین درجے (تھری لیئر) فن تعمیر کو نافذ کرتے ہیں، جسے انگریزی زبان کے ادب میں اکثر 3tier/3layer کہا جاتا ہے ۔ اس کا مختصر خلاصہ درج ذیل ہے:- تمام اداروں کو ماڈل کے طور پر ڈیزائن کیا گیا ہے۔ یہ وہ اشیاء ہیں جن میں شامل ہیں:
- صفات کا ایک مجموعہ (کلاس کے نجی شعبے)۔
- کنسٹرکٹر
- صفات کو ترتیب دینے/پڑھنے کے لیے سیٹرز اور حاصل کرنے والے۔
- یہ ضروری ہے کہ ان میں مندرجہ بالا کے علاوہ کوئی دوسرا کوڈ نہ ہو۔ ایسی اشیاء کو اکثر POJO (Plain Old Java Object) کہا جاتا ہے۔
- ماڈلز کے ساتھ کام کرنے کی تمام منطق سروس لیئر کے ذریعے لاگو ہوتی ہے۔ یہ ماڈلز کے لیے کاروباری اصول تیار کرتا ہے۔ مثال کے طور پر، جاوا ایپلیکیشن سے درخواستوں پر کارروائی کرنا۔ استفسار کے دلائل اور واپس کیے گئے نتائج میں اکثر ماڈلز (یا ان کے مجموعے) شامل ہوتے ہیں۔
- ریپوزٹری پرت DBMS اور سروس کے درمیان ایک "درمیانی" ہے، جو ڈیٹا بیس کے ساتھ براہ راست کام کرتی ہے اور اس کے ساتھ تعامل کے لیے ذمہ دار ہے۔
ماڈل
ہمارے تمام اداروں (اسٹاک، ٹریڈرز، ریٹ اور ٹریڈرز کے اعمال) اور ان کے ٹیبل کے مساوی ایک مشترکہ خصوصیت ہے - ایک مصنوعی بنیادی کلید۔ لہذا، آئیے ایک بیس کلاس بنائیں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);
}
}
ذیل میں اسٹاک ماڈل کی ایک مثال ہے۔ آپ مضمون کے آخر میں گیتھب ریپوزٹری کے لنک پر عمل کرکے ماڈل کی باقی فہرستیں دیکھ سکتے ہیں۔
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 کے ساتھ کام کرنے کے مراحل درج ذیل خاکہ میں دکھائے گئے ہیں:Class.forName()
کلاس کو لوڈ کرتا ہے اور اسے ڈرائیور مینجر کے ساتھ رجسٹر کرتا ہے۔DriverManager.getConnection()
واپس آ جائے گاConnection
- طریقہ کار میں بیان کردہ ڈیٹا بیس سے ایک کنکشن اور متعلقہ JDBC ڈرائیور کا استعمال کرتے ہوئے (جو کہ استعمال کرکے لوڈ کیا گیا تھاClass.forName()
)۔createStatement()
ہمیںStatement
ایک آبجیکٹ واپس کرے گا جس کی بنیاد پر ہم ڈیٹا بیس میں سوالات بنا سکتے ہیں۔ یہ بھی ہیں:PreparedStatement
پیرامیٹرائزڈ اور بیچ سوالات کی تخلیق میں سہولت فراہم کرنا۔
CallableStatement
ڈی بی ایم ایس کے اپنے ایس کیو ایل فنکشنز اور طریقہ کار کو کال کرنے کے لیے (انہیں اسٹورڈ کہا جاتا ہے)۔- "ہاتھ میں" ہونے سے آپ کو SQL استفسار لینگویج کمانڈ کی شکل میں براہ راست DBMS کے عمل میں ایک درخواست بھیجنے اور جواب کی شکل میں واپس کرنے کی اجازت ملے
statement
گی ۔ سہولت کے لیے یہ ہیں:execute()
ResultSet
executeQuery()
- DBMS سے ڈیٹا پڑھنے کے لیے۔
executeUpdate()
- ڈی بی ایم ایس میں ڈیٹا میں ترمیم کرنے کے لیے۔ - سرور کے جواب کو بذات خود , , اور اسی طرح سے
ResultSet
دہرانے کے ذریعے فارم میں پروسیس کیا جا سکتا ہے ۔ ہم حاصل کرنے والوں کے ذریعے انفرادی نتائج کی فیلڈز حاصل کر سکتے ہیں: , ...first()
last()
next()
getInteger()
getString()
ResultSet
، 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()
....) پھیلتی جائے گی۔ ہم نئی خصوصیات کو دو مراحل میں نافذ کریں گے:
- آئیے ایک نئے انٹرفیس طریقہ کی شکل میں ٹیبل کے ساتھ کام کرنے کی ایک اور صلاحیت شامل کریں۔
- اگلا، انٹرفیس کو نافذ کرنے والی کلاسوں میں، ہم انٹرفیس کے ذریعے تیار کردہ نئے طریقوں میں سافٹ ویئر کے نفاذ کو بیان کریں گے۔
Share
(اسٹاک) کے لیے مثالی ذخیرہ ۔ بنیادی منطق میزیں بنانے، فیلڈز کے لیے ایس کیو ایل ڈیٹا کی قسمیں بتانے اور پابندیاں شامل کرنے کے کمانڈز میں ہے:
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");
}
}
دیگر ذخیروں کی فہرستیں اور پیرنٹ کلاس مضمون کے آخر میں گیتھب ریپوزٹری کے لنک کے ذریعے دستیاب ہیں۔ بلاشبہ، آپ ایک مختلف پروگرام ڈیزائن یا پروگرام کی مزید مکمل ری فیکٹرنگ کر سکتے ہیں: مشترکہ حصوں کو پیرنٹ کلاس میں منتقل کریں، عام طریقوں کو نمایاں کریں، وغیرہ۔ لیکن مضامین کی سیریز کا بنیادی مقصد براہ راست ڈیٹا بیس کے ساتھ کام کرنا ہے، اس لیے اگر آپ چاہیں تو پروگرام اور اس طرح کے ڈیزائن بنا سکتے ہیں، آپ خود بھی کر سکتے ہیں۔ موجودہ پروجیکٹ کا ڈھانچہ: ریپوزٹریز اور ماڈلز کے علاوہ، ہم نے 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 استفسار کی زبان۔
- JDBC کے ساتھ تعامل کے بارے میں مزید۔
- ڈیٹا پروسیسنگ ایپلی کیشن کا تھری ٹیئر (تھری لیئر) ماڈل/ریپوزٹری/سروس فن تعمیر۔
GO TO FULL VERSION