- •Пояснювальна записка
- •1.1 Загальні відомості
- •1.2 Призначення та завдання для створення системи
- •1.3 Характеристика об'єктів автоматизації
- •1.4 Вимоги до системи
- •1.5 Склад і зміст робіт по створенню системи
- •1.6 Порядок контролю і приймання системи
- •1.7 Вимоги до складу та змісту робіт з підготовки об'єкта автоматизації до введення системи в дію
- •1.8 Вимоги до документування
- •1.9 Аналіз існуючих розробок та обґрунтування вибору технології проектування
- •2 Розробка автоматизованої системи обліку пластикових карт
- •2.1 Смарткартки
- •2.1.1 Картки SmartPay
- •2.2 Кардрідери
- •3 Розробка іноформаційного забезпечення автоматизованої системи обліку пластикових карт
- •3.1 Вибір засобів для розробки та управління базою даних
- •3.3. Розробка програми-терміналу
- •3.3.1 Архітектура та технології
- •3.3.2 Розробка основних класів
- •4 Використання системи
- •4.1 Оформлення договорів
- •4.2 Картки
- •4.3 Компанії
- •4.4 Інші розділи
- •Висновки
- •Перелік посилань
3.3.2 Розробка основних класів
Технологія ORM передбачає зв’язування Java класів з таблицями бази даних. За допомогою бібліотек програміст звільняється від низькоуровневих операцій вибору даних та приведення типу. Головною роботою стає опис правил проекції відповідного класу у таблицю. У бібліотеці ORMLite це виконується за допомогою Java анотацій або спеціального xml-файлу. Найбільш поширеним є спосіб з анотаціями.
Розглянемо це на прикладі таблиці з клієнтами. Для цього створюється так званий ValueObject клас, який поширює org.openswing.swing.message.receive.java.ValueObjectImpl клас для сумісністю з бібліотекою OpenSwing та обов’язково має конструктор без параметров .
Таблиця у БД створюєтся наступним чином:
CREATE TABLE IF NOT EXISTS `smartP1`.`clients` (
`idclients` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(100) NOT NULL ,
`sex` VARCHAR(10) NULL ,
`date_birth` DATE NULL ,
`address` VARCHAR(150) NULL ,
`phone` VARCHAR(45) NOT NULL ,
`e_mail` VARCHAR(45) NULL ,
`passport` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`idclients`) ,
UNIQUE INDEX `passport_UNIQUE` (`passport` ASC) )
Згідно з табл.3.3 створюємо аналогічні поля у класі. І далі за допомогою анотацій виконуємо опис правил відповідності таблиці і класу.
Розглянемо основні анотації:
анотація @Entity або @DatabaseTable означає ім'я таблиці у БД, у нашому прикладі це clients;
далі обов’язковим є позначка ключа, це виконується за допомогою @Id;
кожне поле також відмічається @DatabaseField або @Column з необхідними параметрами;
Отже код класу буде виглядіти наступним чином:
@Entity(name="clients")
public class ClientVO extends ValueObjectImpl implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(updatable=false)
private int idclients;
@DatabaseField
private String address;
@DatabaseField(columnName="date_birth", dataType=DataType.DATE)
private Date dateBirth;
@Column(name="e_mail")
private String eMail;
@DatabaseField
private String name;
@DatabaseField
private String passport;
@DatabaseField
private String phone;
@DatabaseField
private String sex;
public ClientVO() {
}
...
}
Визначимо параметри з'єднання з базою даних:
private void createConnection(String databaseUrl, String user, String pass) {
//String databaseUrl = "jdbc:mysql://mysql_server_ip/smartP1";
try {
conn = new JdbcConnectionSource(databaseUrl);
((JdbcConnectionSource) conn).setUsername(user);
((JdbcConnectionSource) conn).setPassword(pass);
}catch (SQLException e) {
e.printStackTrace();
}
}
Передаючи дані про з'єднання у якості параметрів метода, ми можемо забезпечити можливість змінити цих парметрів у користувацькому інтерфейсі.
Тепер у нас є опис класів і ми визначили свій ConnectionSource, що потрібно для створення об'єкта доступу до даних (DAO).Це клас, кожен з яких буде обробляти всі операції з базою даних для одного класу ValueObject. Кожен DAO має два базових параметра: клас що зберігаються в БД з DAO, і клас ID-стовпця, який буде використовуватися для ідентифікації конкретної рядка бази даних. Весь функціонал базових операцій роботи з базою даних реалізований у класі BaseDaoImpl, тому нам достатньо взятии його як базовий та при необхідності ми можемо добавити специфічні методи для реалізації нашої бізнес-логіки:
public class ClientDaoImpl extends BaseDaoImpl<ClientVO, Integer> implements
ClientDaoInterface{
public ClientDaoImpl(ConnectionSource connectionSource) throws SQLException {
super(connectionSource, ClientVO.class);
}
@Override
public ClientVO getById(Integer id) {
List<ClientVO> result;
QueryBuilder<ClientVO, Integer> qb = queryBuilder();
try {
qb.where().eq("idclients", id);
PreparedQuery<ClientVO> querry = qb.prepare();
result = query(querry);
return result.get(0);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Графічний інтерфейс будується на принципі multіple document іnterface (або MDІ), який являє собою вікна, розташовані під одним загальним вікном (як правило, за винятком модальних вікон). БібліотекаOpenSwing пропонує для цього графічний клас MDIFrame, а необхідна логіка реалізується програмістом шляхом поширення класу MDIController:
public class SmartP implements MDIController {
...
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SmartP();
}
});
}
public SmartP() {
...
MDIFrame mdi = new MDIFrame(this);
}
@Override
public DefaultTreeModel getApplicationFunctions() {
DefaultMutableTreeNode root = new OpenSwingTreeNode();
DefaultTreeModel model = new DefaultTreeModel(root);
ApplicationFunction n1 = new ApplicationFunction("Administration",null);
n1.setShortCut(new Character('A'));
ApplicationFunction n11 = new ApplicationFunction("Cards in grid+detail","getCards","men.gif","getCards");
n11.setShortCut(new Character('M'));
ApplicationFunction n12 = new ApplicationFunction("Status","getCardStatus","men.gif","getCardStatus");
n12.setShortCut(new Character('S'));
ApplicationFunction n13 = new ApplicationFunction("State","getCardState","men.gif","getCardState");
n13.setShortCut(new Character('T'));
ApplicationFunction n14 = new ApplicationFunction("Mode","getCardMode","men.gif","getCardMode");
n14.setShortCut(new Character('M'));
ApplicationFunction n16 = new ApplicationFunction("Clients Grid","getClientsGrid","men.gif","getClientsGrid");
ApplicationFunction n15 = new ApplicationFunction("New Client","setNewClient","men.gif","setNewClient");
n1.add(n11);
n1.add(n12);
n1.add(n13);
n1.add(n14);
n1.add(n15);
n1.add(n16);
root.add(n1);
return model;
}
...
}
Наступним кроком є опис можливих функцій (тобто внутрішніх вікон) шляхом перевантаження метода getApplicationFunctions() та опису дерева ApplicationFunction. Виклик цих об’єктів спотворює створення необхідних внутрішніх вікон. Базовим класом внутрішнього вікна є клас InternalFrame, де програміст створює графічні елементи:
public class ClientDetailFrame extends InternalFrame {
private final ClientForm clientForm = new ClientForm();
private final JPanel panel = new JPanel();
private final EditButton editButton = new EditButton();
private final ExportButton exportButton = new ExportButton();
private final ReloadButton reloadButton = new ReloadButton();
private final SaveButton saveButton = new SaveButton();
private final InsertButton insertButton = new InsertButton();
public ClientDetailFrame(ConnectionSource connection, ClientDetailFrameController controller) {
clientForm.setFormController(controller);
jbInit();
setSize(600, 500);
...
}
private void jbInit() {
getContentPane().add(clientForm, BorderLayout.CENTER);
getContentPane().add(panel, BorderLayout.NORTH);
panel.add(insertButton);
panel.add(editButton);
panel.add(exportButton);
panel.add(reloadButton);
panel.add(saveButton);
clientForm.setInsertButton(insertButton);
clientForm.setEditButton(editButton);
clientForm.setReloadButton(reloadButton);
clientForm.setSaveButton(saveButton);
}
}
Основними типами вікон у OpenSwing є Форми (базовий клас Form) та Таблиці (базовий клас Grid). У обох випадках необхідним є визначення зв’язаного з ним ValutObject класу:
setVOClassName("src.VO.ClientVO");
Для кожного вікна створюється відповідний контролер із базовим класом Форми або Таблиці. У нашому випадку це Форма:
public class ClientDetailFrameController extends FormController {
...
public ClientDetailFrameController(ConnectionSource connectionSource,ClientGridFrame clientFrame) {
}
@Override
public Response insertRecord(ValueObject newPersistentObject)
throws Exception {
if(1 == clientDao.create((ClientVO)newPersistentObject))
{
return new VOResponse(newPersistentObject);
}
else
{
return new ErrorResponse("Inserting CLientVO not successful");
}
}
@Override
public Response loadData(Class valueObjectClass) {
}
@Override
public void createPersistentObject(ValueObject PersistentObject)
throws Exception { }
@Override
public Response updateRecord(ValueObject oldPersistentObject,
ValueObject persistentObject) throws Exception {}
@Override
public Response deleteRecord(ValueObject persistentObject) throws Exception { }
@Override
public void loadDataCompleted(boolean error) {}
}
Далі виконуючи перевизначеня методів:
insertRecord(ValueObject newPersistentObject) ,
updateRecord(ValueObject oldPersistentObject, ValueObject persistentObject),
deleteRecord(ValueObject persistentObject),
createPersistentObject(ValueObject PersistentObject)
та інших реалізується бізнес-логіка програми.
Таким чином виконується побудова інших компонентів системи.