extreme programming xp Тема 8. xp Объектно-реляционное связывание...

34
eXtreme Programming XP Тема 8 Тема 8

Upload: india-leon

Post on 31-Mar-2015

232 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

eXtreme ProgrammingXPXP

Тема 8Тема 8Тема 8Тема 8

Page 2: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Объектно-реляционное связывание позволяет связать реляционную базу данных и простые объекты Java.

Обычно связывание осуществляется с помощью файлов XML.

Представитель такой технологии – Hibernate.

Page 3: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

Вертикальное связывание. Все классы в иерархии привязываются к различным таблицам. Например, если имеются классы Dog и Cat, которые наследуют от абстрактного класса Animal, то в базе данных должно быть три таблицы.

Горизонтальное связывание. К таблице привязан конкретный класс.

Объединяющее связывание. К единой таблице привязывается несколько классов.

XPXP

Page 4: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Page 5: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Page 6: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Это облегченный механизм баз данных Java (2001 г.). Он достаточно маленький, поэтому способен полностью располагаться в оперативной памяти или полностью включиться в war-файл приложения.

Для работы требуется скопировать hsqldb.jar в папку lib проекта.

Page 7: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<!-- Переменная для hsqldb.jar-файла --> <property name="hjar" value="lib/hsqldb.jar"/>

<!-- Переменная для класса запуска сервера hsqldb --> <property name="hclass" value="org.hsqldb.Server"/>

<!-- Переменная для обозначения файлов базы данных --> <property name="hfile" value="-database.0 data/timexdb"/>

<!-- Переменная для псевдонима базы данных --> <property name="halias" value="timex"/>

<!-- Переменная для указания порта --> <property name="hport" value="9005"/>

Page 8: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<target name="starthsql">

<java fork="true"

classname="${hclass}" classpath="${hjar}"

args="${hfile} -dbname.0 ${halias} –port ${hport}"/>

</target>

Page 9: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<target name="hsqldm">

<java fork="true" classpath="${hjar}"

classname="org.hsqldb.util.DatabaseManagerSwing"/>

</target>

<!-- Можно использовать класс DatabaseManager -->

<!-- При связывании с базой данных указывается аргумент url. Например, для учебного проекта следует указать

url=jdbc:hsqldb:hsql://localhost:9005/timex

-->

Page 10: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Page 11: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<target name="execddl">

<sql classpath="${hjar}"

driver="org.hsqldb.jdbcDriver"

url="jdbc:hsqldb:hsql://localhost:${hport}/${halias}"

userid="sa" password=""

print="yes">

-- Step 1: Drop objects if they exist

DROP TABLE Department IF EXISTS;

DROP TABLE Employee IF EXISTS;

DROP TABLE Timesheet IF EXISTS;

DROP INDEX TimesheetIndex IF EXISTS;

DROP INDEX DepartmentCodeIndex IF EXISTS;

DROP INDEX EmployeeIdIndex IF EXISTS;

Page 12: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

-- Step 2: Create tables CREATE TABLE Department

(

departmentCode CHAR(2) NOT NULL,

name VARCHAR(255) NOT NULL

);

CREATE TABLE Employee

(

employeeId INT NOT NULL,

name VARCHAR(100) NOT NULL,

email VARCHAR(255) NOT NULL,

employeeCode CHAR(1) NOT NULL,

password VARCHAR(10) NOT NULL,

managerEmployeeId INT NULL

);

Page 13: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

CREATE TABLE Timesheet

(

timesheetId IDENTITY NOT NULL,

employeeId INT NOT NULL,

statusCode CHAR(1) NOT NULL,

periodEndingDate DATE NOT NULL,

departmentCode CHAR(4) NOT NULL,

minutesMon INT NULL,

minutesTue INT NULL,

minutesWed INT NULL,

minutesThu INT NULL,

minutesFri INT NULL,

minutesSat INT NULL,

minutesSun INT NULL

);

Page 14: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

-- Step 3: Create indexes

CREATE UNIQUE INDEX TimesheetIndex ON Timesheet (employeeId, periodEndingDate);

CREATE UNIQUE INDEX DepartmentCodeIndex ON Department (departmentCode);

CREATE UNIQUE INDEX EmployeeIdIndex ON Employee (employeeId);

-- Step 4: Insert some reference and test data

INSERT INTO Department (departmentCode, name)

VALUES ('AC', 'Accounting');

INSERT INTO Department (departmentCode, name)

VALUES ('CS', 'Customer Support');

INSERT INTO Department (departmentCode, name)

VALUES ('HR', 'Human Resources');

INSERT INTO Department (departmentCode, name)

VALUES ('IT', 'Information Technology');

XPXP

Page 15: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

INSERT INTO Employee (employeeId, name, employeeCode,

password, email, managerEmployeeId) VALUES (1, 'Mike Dover', 'H', 'rapidjava', '[email protected]', 3);

INSERT INTO Employee (employeeId, name, employeeCode,

password, email, managerEmployeeId) VALUES (2, 'Ajay Kumar', 'H', 'visualpatterns', '[email protected]', 3);

INSERT INTO Employee (employeeId, name, employeeCode,

password, email, managerEmployeeId) VALUES (3, 'Teresa Walker', 'M', 'agilestuff', '[email protected]', 4);

INSERT INTO Employee (employeeId, name, employeeCode,

password, email) VALUES (4, 'Tom Brady', 'E', 'superbowl', '[email protected]');

XPXP

Page 16: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

INSERT INTO Timesheet(timesheetId, employeeId, statusCode, periodEndingDate, departmentCode, minutesMon, minutesTue, minutesWed,minutesThu, minutesFri, minutesSat, minutesSun)

VALUES (1, 2, 'P', '2006-08-19', 'IT', 480, 480, 360, 480, 480, 0, 0);

INSERT INTO Timesheet(timesheetId, employeeId, statusCode, periodEndingDate, departmentCode, minutesMon, minutesTue, minutesWed, minutesThu, minutesFri, minutesSat, minutesSun)

VALUES (2, 1, 'A', '2006-08-19', 'HR', 0, 0, 480, 480, 480, 0, 0);

-- Step 5: Verify tables and test data look ok

SELECT * FROM Department;

SELECT * FROM Employee;

SELECT * FROM Timesheet;

</sql>

</target>

XPXP

Page 17: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Page 18: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

В lib-каталог следует скопировать jar-файлы: hibernate3.jar antlr.jar encache-1.1.jar antlr-2.7.6rc1.jar asm-attrs.jar asm.jar cglib-2.1.3.jar commons-collections-2.1.1.jar commons-logging-1.0.4.jar dom4j-1.6.1.jar jta.jar log4j-1.2.11.jar

Page 19: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Используется три типа файлов Hibernate: файл конфигурации Hibernate

(hibernate.cfg.xml) соответствующие классы Java файлы таблиц связывания (с

расширением .hbm.xml).

Page 20: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-

3.0.dtd">

<hibernate-configuration><session-factory><!– Установки соединения с базой данных --><property name="connection.driver_class">

org.hsqldb.jdbcDriver</property><property name="connection.url">

jdbc:hsqldb:hsql://localhost:9005/timex</property><property name="connection.username">sa</property><property name="connection.password"></property>

Page 21: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<property name="connection.pool_size">2</property>

<property name="show_sql">true</property>

<property name="dialect">

org.hibernate.dialect.HSQLDialect

</property>

<property name="current_session_context_class">thread</property>

<property name="cache.provider_class">

org.hibernate.cache.NoCacheProvider

</property>

<!-- Установка ссылок на файлы связывания -->

<mapping resource="Department.hbm.xml" />

</session-factory>

</hibernate-configuration>

Page 22: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <!-- Связь класса и таблицы --> <class name="com.visualpatterns.timex.model.Department" table="Department"> <!-- Установка идентификатора объекта --> <id name="departmentCode" column="departmentCode"> <generator class="assigned"/> </id> <!– Остальные поля таблицы --> <property name="name" column="name"/> </class></hibernate-mapping>

Page 23: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Может содержать определение связи:

<many-to-one name=“имя_сущности_для_связи” column=“имя_столбца_связи” class=“имя_класса_связи_с_указанием_пакета” lazy=“false” not-found=“ignore” cascade=“none” insert=“false” update=“false”/>

Page 24: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

package com.visualpatterns.timex.model;

public class Department

{

String departmentCode;

String name;

public String getDepartmentCode()

{ return this.departmentCode; }

public void setDepartmentCode(String departmentCode)

{ this.departmentCode = departmentCode; }

public String getName() { return this.name; }

public void setName(String name) { this.name = name; }

}

Page 25: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Постоянные объекты – это объекты, которые в настоящее время связаны с сеансом Hibernate (гарантируется, что они соответствуют реальным записям базы данных).

Отсоединенные объекты – после закрытия сеансов ими становятся постоянные объекты.

Временные объекты – это объекты, которые не связаны с сеансом Hibernate и не имеют идентификатора объекта.

Page 26: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

package com.visualpatterns.timex.test;

import java.util.List;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.visualpatterns.timex.model.Department;

public class HibernateTest

{

public static void main(String args[]) throws Exception

{

SessionFactory sessionFactory = new

Configuration().configure().buildSessionFactory();

Session session = sessionFactory.openSession();

Page 27: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Transaction tx = session.beginTransaction();

Department department;

department = (Department) session.get(Department.class, "IT");

System.out.println("Name for IT = " + department.getName());

List departmentList = session.createQuery("from Department").list();

for (int i = 0; i < departmentList.size(); i++)

{ department = (Department) departmentList.get(i);

System.out.println("Row " + (i + 1) + "> " +

department.getName() + " (" +

department.getDepartmentCode() + ")");

}

tx.commit(); session.close(); sessionFactory.close();}

}

Page 28: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

<target name="hibernatetest" depends="compile">

<java fork="true" classpathref="master-classpath"

classname="com.visualpatterns.timex.test.HibernateTest" />

</target>

Page 29: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Department department = (Department) session.get(Department.class, "IT");

Или

Department department=(Department) session.load(Department.class,”IT”);

Page 30: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

List departmentList = session.createQuery("from Department").list();

Или с помощью критериев: List departmentList = session.createCriteria(Department.class).

add(Restrictions.eq("departmentCode", "IT")).list();

Другие ограничения – between, in, isEmpty, isNull, and, or, like, conjunction, disjunction

Page 31: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Запросы можно создавать в файле связывания, именовать их и обращаться к ним из классов по имени.

Например, в файле связывания: <sql-query name=“getTimesheetID”><return alias=“timesheet” class=“Timesheet”/>

from Timesheet where employeeID=:employeeID </sql-query>

Обращение к этому запросу выглядит так:List departmentList = session.getNamedQuery(getTomesheet).setInteger

(“employeeID”,1).list();

Page 32: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Department d1=new Department();d1.setDepartmentCode("MY");d1.setName("ПРОБНОЕ НАЗВАНИЕ");session.saveOrUpdate(d1);

Или с помощью sql-запроса: session.createSQLQuery("insert into Department (name,departmentCode) values (?,?)").setString(0, "proba").setString(1, "PB").executeUpdate();

Существуют функции установки параметров других типов, например, setInteger, setDate.

Page 33: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Department d2=(Department) session.get(Department.class,”PB”);d2.setName(“Новое имя”);session.saveOrUpdate(d2);

Или с помощью sql-запроса.

Page 34: EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и

XPXP

Department d2=(Department) session.get(Department.class,”PB”);d2.delete(d2);

Или с помощью sql-запроса.