Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
дипломZadyrI / дипломZadyrI.doc
Скачиваний:
33
Добавлен:
10.02.2016
Размер:
1.19 Mб
Скачать

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)

та інших реалізується бізнес-логіка програми.

Таким чином виконується побудова інших компонентів системи.