1 / 34

Сервер баз данных HSQLDB и Hibernate

Тема 8. Сервер баз данных HSQLDB и Hibernate. XP. eXtreme Programming. Объектно-реляционное связывание ( ORM ). Объектно-реляционное связывание позволяет связать реляционную базу данных и простые объекты Java . Обычно связывание осуществляется с помощью файлов XML .

torgny
Download Presentation

Сервер баз данных HSQLDB и Hibernate

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Тема 8 Сервер баз данных HSQLDB и Hibernate XP eXtreme Programming

  2. Объектно-реляционное связывание (ORM) Объектно-реляционное связывание позволяет связать реляционную базу данных и простые объекты Java. Обычно связывание осуществляется с помощью файлов XML. Представитель такой технологии – Hibernate. XP

  3. Связывание Вертикальное связывание. Все классы в иерархии привязываются к различным таблицам. Например, если имеются классы Dog и Cat, которые наследуют от абстрактного класса Animal, то в базе данных должно быть три таблицы. Горизонтальное связывание. К таблице привязан конкретный класс. Объединяющее связывание. К единой таблице привязывается несколько классов. XP

  4. Доменная модель базы данных учебного проекта XP

  5. Физическая модель базы данных учебного проекта XP

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

  7. Задачи Ant для работы с базой данных.Установка свойств <!--Переменная для 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"/> XP

  8. Задача Ant для запуска сервера HSQLDB <target name="starthsql"> <java fork="true" classname="${hclass}" classpath="${hjar}" args="${hfile} -dbname.0 ${halias} –port ${hport}"/> </target> XP

  9. Задача Ant для запуска пользовательского интерфейса работы с базой данных <target name="hsqldm"> <java fork="true" classpath="${hjar}" classname="org.hsqldb.util.DatabaseManagerSwing"/> </target> <!--Можно использовать класс DatabaseManager --> <!-- При связывании с базой данных указывается аргумент url. Например, для учебного проекта следует указать url=jdbc:hsqldb:hsql://localhost:9005/timex --> XP

  10. Внешний вид менеджера HSQLDB XP

  11. Задача Ant для выполнения SQL запросов <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; XP

  12. Задача Ant для выполнения SQL запросов -- 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 ); XP

  13. Задача Ant для выполнения SQL запросов 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 ); XP

  14. Задача Ant для выполнения SQL запросов -- 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'); XP

  15. Задача Ant для выполнения SQL запросов INSERT INTO Employee (employeeId, name, employeeCode, password, email, managerEmployeeId) VALUES (1, 'Mike Dover', 'H', 'rapidjava', 'mdover@acme.com', 3); INSERT INTO Employee (employeeId, name, employeeCode, password, email, managerEmployeeId) VALUES (2, 'Ajay Kumar', 'H', 'visualpatterns', 'akumar@acme.com', 3); INSERT INTO Employee (employeeId, name, employeeCode, password, email, managerEmployeeId)VALUES (3, 'Teresa Walker', 'M', 'agilestuff', 'twalker@acme.com', 4); INSERT INTO Employee (employeeId, name, employeeCode, password, email)VALUES (4, 'Tom Brady', 'E', 'superbowl', 'tbrady@acme.com'); XP

  16. Задача Ant для выполнения SQL запросов 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> XP

  17. Результат выполнения этой задачи будет заканчиваться так: XP

  18. Hibernate В 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 XP

  19. Hibernate Используется три типа файлов Hibernate: • файл конфигурации Hibernate (hibernate.cfg.xml) • соответствующие классы Java • файлы таблиц связывания (с расширением .hbm.xml). XP

  20. Файл конфигурации Hibernate <?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> XP

  21. Файл конфигурации Hibernate <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> XP

  22. Файл связывания Department.hbm.xml <?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> XP

  23. Файл связывания Department.hbm.xml Может содержать определение связи: <many-to-one name=“имя_сущности_для_связи” column=“имя_столбца_связи”class=“имя_класса_связи_с_указанием_пакета”lazy=“false” not-found=“ignore” cascade=“none” insert=“false” update=“false”/> XP

  24. Department.java – обычный JavaBean 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; } } XP

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

  26. Проверим работу Hibernate 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(); XP

  27. Проверим работу Hibernate 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();} } XP

  28. Задача Ant для запуска HibernateTest <target name="hibernatetest" depends="compile"> <java fork="true" classpathref="master-classpath" classname="com.visualpatterns.timex.test.HibernateTest" /> </target> XP

  29. Получение отдельных записей Department department = (Department) session.get(Department.class, "IT"); Или Department department=(Department) session.load(Department.class,”IT”); XP

  30. Выполнение запросов 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 XP

  31. Выполнение запросов Запросы можно создавать в файле связывания, именовать их и обращаться к ним из классов по имени. Например, в файле связывания: <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(); XP

  32. Добавление новой записи 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. XP

  33. Изменение существующей записи Department d2=(Department) session.get(Department.class,”PB”); d2.setName(“Новое имя”); session.saveOrUpdate(d2); Или с помощью sql-запроса. XP

  34. Удаление записи Department d2=(Department) session.get(Department.class,”PB”); d2.delete(d2); Или с помощью sql-запроса. XP

More Related