Освоение Java
| |
UnInstaller | Дата: Среда, 25.02.2009, 20:12 | Сообщение # 1 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| Я буду копировать уроки Java, взятые с этого сайта.
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
UnInstaller | Дата: Среда, 25.02.2009, 20:16 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| Урок 1. Старт в Java for WEB 1) Java-машина Для начала это, конечно же, Java-машина. Тут вам прямая дорога на www.java.sun.com Качаем версию не ниже 1.5 (главная причина - наличие темплейтов в версиях 1.5+). С установкой её, думаю, проблем не будет. После установки в переменные окружения добавляем JAVA_HOME=c:\Program Files\Java\JDK_1.xx где JDK_1.xx - имя папки с установленным JDK - Java Development Kit (путь может отличаться) А к значению переменной окружения PATH добавляем значение %JAVA_HOME%\bin Также добавим переменную окружения JRE_HOME=c:\Program Files\Java\JRE_1.xx где JRE_1.xx - имя папки с установленным JRE - Java Runtime Environment а в PATH добавляем %JRE_HOME%\bin Это нужно для того чтобы инструменты использующие запускающие Java-машину (например Tomcat) смогли найти её в системе Как создать или изменить Переменную Среды? Quote Правый клик на "Мой Компьютер" -> "Свойства" -> Вкладка "Дополнительно" -> Кнопка "Переменные среды" -> На панели "Системные переменные" кнопка "Создать" -> В поле "Имя переменной" прописываем JAVA_HOME В поле "Значение переменной" - c:\Program Files\Java\JDK_1.xx Чтобы изменить, например, переменную PATH, в списке на панели "Системные переменные" находим в поле "Переменная" PATH, жмём "Изменить" и меняем значение. Например, после добавления туда значения %JAVA_HOME%\bin значение переменной PATH будет выглядеть примерно так: C:\Program Files\Borland\Delphi7\Bin;C:\Program Files\Borland\Delphi7\Projects\Bpl\;%SystemRoot%\s ystem32; %SystemRoot%;%SystemRoot%\System32\Wbem;%JAVA_HOME %\bin 2) Веб-контейнер Tomcat Далее идём на http://tomcat.apache.org и качаем веб-контейнер Apache Tomcat 5.5 (из нескольких вариантов выбираем архив zip). Зачем он нужен? Мы будем писать веб-приложение соответсвующее стандартам J2EE, и нам нужен веб-сервер, на котором мы сможем запустить наше приложение. Tomcat - один из них (есть ещё JBoss, WebSpere, Jetty и другие. Между ними есть разница, но нас она сейчас не интересует). Распаковываем архив в любое удобное для нас место, например, в C:\tomcat Добавляем системную переменную CATALINA_HOME=c:\tomcat а в переменную PATH - значение %CATALINA_HOME%\bin 3) Eclipse Следующий шаг - Среда разработки. Для нашего проекта мы будем использовать свободно распространяемую среду - Eclipse, а именно - её вариацию Eclipse Europe for EE developers (хотя вполне можно использовать и стандартный вариант Eclipse). Идём на http://www.eclipse.org/downloads/ - и качаем Eclipse IDE for Java EE Developers. Распаковываем в любое место на винте. Вот это класс - как в старые добрые досовские времена! Никаких инсталляций! 4) Библиотеки Далее скачиваем необходимые библиотеки. Вот их список: antlr-2.7.6.jar asm.jar cglib-2.1.3.jar commons-collections-2.1.1.jar commons-lang-2.3.jar commons-logging-1.1.jar dom4j-1.6. 1.jar ehcache-1.2.3.jar hibernate3.jar javax.servlet.jar jstl.jar jta-1.0.1B.jar log4j-1.2.14.jar mysql-connector-java-3. 1.14.jar servlet-api.jar spring-2.0.4.jar standard.jar Скачать их можно, например, из maven-репозитория на http://mirrors.ibiblio.org/pub/mirrors/maven2/ или просто вводя их имя в строку запроса поискового сервера. Версии библиотек могут отличаться, главное чтобы они были не меньше чем указанные. Если возникнут проблемы с поиском - пишите, выложу куда-нибудь архив. Опишу предназначение некоторых из них: commons-logging - библиотека для ведения лога. Она используется многими фреймворками, в частности, Hibernate и Spring. hibernate - это Object Relational Mapping фреймворк, предназначеный для маппирования структуры таблиц базы данных на модель доменных объектов. spring - это фреймворк, реализующий модель IoC - Inversion Of Control (Dependency Injection), он имеет множество предназначений. мы будем использовать его для соединения с Hibernate, а также его часть, называемую Spring MVC для создания UI. mysql-connector-java - это JDBC-драйвер для соединения с базой MySQL. Библиотеки сохраняем куда-нибудь, они нам вскоре понадобятся.
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
UnInstaller | Дата: Среда, 25.02.2009, 20:18 | Сообщение # 3 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| 5) MySQL Затем - скачиваем базу данных MySQL с www.mysql.org качаем версию не ниже 4.1 Также скачиваем какой-нибудь фронт-энд к ней, рекомендую HeidiSQL Наконец-то с закачкой инструментов покончено. Заметьте - скачивая их, мы ещё ни разу не пользовались платным программным обеспечением, всё выше перечисленное - это либо OpenSource либо по публичным лицензиям! Таков мир Java. Однако у этой медали есть и обратная сторона: из-за обилия библиотек, технологий, фреймворков и инструментов от разных разработчиков разобраться со всем этим бывает довольно сложно. Теперь протестируем нашу среду разработки - напишем программу Hello World From Java. 1) Запускаем eclipse, указываем ему workspace. После загрузки жмём кнопку "Go to the workbench". 2) Создаём новый проект: file -> new -> project... (второй пункт сверху) 3) Выбираем Java - Java Project, жмём next 4) Вводим имя, например, HelloWorld, жмём finish. 5) В правой части среды появился корневой элемент дерева: HelloWorld - это наш проект. 6) Раскрываем список, выбираем элемент src 7) нажимаем на него правой клавишей и выбираем New -> Class 8) Вводим имя нашего нового класса, например HelloWorldFromJava, а также ставим галку в поле public static void main; 10) жмём next В главном окне в метод main сгенерированного текста нашего класса добавим такую строку: System.out.println("Hello World From Java"); Получим следующий код: Code public class HelloWorldFromJava {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Hello World From Java"); }
} Для запуска выберем пункт меню Run -> Run as -> Java Application Если всё ок - внизу, в окне консоли увидим: Hello World From Java
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
UnInstaller | Дата: Среда, 25.02.2009, 20:22 | Сообщение # 4 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| Урок 2. Слоистая архитектура, объектная модель. Итак, я расскажу про слоистую архитектуру приложений и рассмотрю доменную модель нашего портала. Для того чтобы понять что такое слоистая архитектура давайте рассмотрим пример - у нас есть приложение, которое обращается к базе данных, производит с данными какие-либо действия и отображает их пользователю через веб-интерфейс; пользователь производит какие-либо действия с помошью веб интерфейса, отправляет данные на сервер, там они обрабатываются и происходит обращение к базе данных и так далее. Тут в нашей программе мы можем выделить 3 слоя: 1) Слой работы с базой данных, это самый низкий слой (Data Access Object Layer) 2) Слой бизнес логики, тут описана собственно логика работы приложения (Business Object Layer) 3) Слой пользовательского интерфейса, в нашем случае - веб-интерфейс (User Interface Layer) Наши слои должны быть независимы друг от друга: при необходимости замены, например, базы данных с MySQL на MSSQL нам придётся переписать только 1-й слой, остальные должны работать так же без каких либо изменений. Слой работы с базой данных ни сном ни духом не должен подозревать, что мы используем в качестве интерфейса веб-интерфейс, или например - локальное приложение на машине клиента, то-есть каждый слой должен знать только о тех слоях, с которыми он непосредственно работает. В нашем случае - DAO знает только про BO слой; UI - тоже только про BO слой и только сам BO слой знает и про DAO и про UI Наши слои связаны друг с другом только посредством передаваемых между ними данных. Какие же данные передаются между слоями? DAO и BO общаются между собой посредством доменных объектов, а BO и UI - посредсвом так называемых DTO - Data Transfer Objects. (Есть и другие варианты - например в EJB 3 DTO не используются, вместо них используються доменные объекты) Далее мы рассмотрим и доменные объекты (так называемые Domain Objects или Entitiy Objects) и Data Transfer Objects. Теперь вы примерно представляете себе среднестатическую архитектуру копоративного JEE приложения. Конечно, я рассказываю очень упрощённо, но суть остаётся неизменной. Теперь пора перейти к нашему Комеди Клабу. В нашем клубе будут юзеры которые будут писать истории. 1) Юзер может писать, читать, править и удалять свои истории 2) Юзер может определять для своих историй - побличные они или приватные 3) Юзер может добавлять других юзеров в свой список друзей а также удалять из него. 4) Юзер может читать публичные истории другого юзера 5) Юзер может читать приватные истории другого юзера, если тот включил его в свой список друзей 6) Юзер может оценивать публичныей истории другого юзера 7) Юзер может оценивать приветные истории другого юзера, если тот включил его в свой список друзей Вот и все возможности нашего мини-портала Выделим объекты которые мспользуются в нашем портале: Это: 1) Юзер 2) История 3) Рейтинг истории Это и есть наши доменные объекты! Каждому из этих объектов будет соответсвовать таблица в базе данных.
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
UnInstaller | Дата: Среда, 25.02.2009, 20:27 | Сообщение # 5 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| Теперь опишем взаимоотношения между объектами. 1) У Юзера есть логин, пароль, есть список своих историй, а также список друзей 2) У Истории есть юзер который является автором этой истории, название, текст истории, а также список оценок которые история получила от других юзеров 3) Рейтинг истории содержит собственно историю, для которой он предназначен, оценку, и юзера, который её поставил. Вот вам и доменная модель нашего приложеня. А теперь перейдём собственно к программированию и опишем нашу доменную модель классами языка Java Запускаем Eclipse Europa, выбираем File -> New -> Project... (2-й пункт сверху) Далее выбираем WEB -> Dynamic Web Project -> Next -> Вводим имя нашего проекта в поле Project Name: ComedyClub Если мы хотим изменить расположение проекта по умолчанию, то снимаем галочку с чекбокса Use Default поля Project Contents. В поле Target Runtime выбираем Apache Tomcat 5.5, если там нет такого пункта - жмём new -> выбираем Apache Tomcat 5.5 -> next -> В поле Tomcat installation directory выбираем путь, куда мы установили Tomcat, у меня это c:\tomcat, остальные поля оставляем по умолчанию, далее жмём finish и уже теперь, в поле Target Runtime выбираем Apache Tomcat 5.5. Всё, проект создан - в левой части экрана появилась древовидная структура, описывающая наш проект. Самое время создать наши доменные классы: Открывем нашу древовидную струтуру, кликаем правой клавишей на папке Java Resources: src, выбираем new->package. Мы создадим новый пакет в котором будут хранится наши классы. В поле Name введём имя пакета: com.comedyclub.domain Почему именно такое? На самом деле можно ввести любое имя (в рамках допустимого конечно), но желательно, чтобы имя имело определённую структуру, здесь com.comedyclub - это обратное написание comedyclub.com то есть, мы предпологаем что у нас есть веб-домен comedyclub.com, далее domain - это собственно место гду будут хранится наши доменные объеткы (не путайте веб-домен и доменные объекты). Если вы откроете в проводнике наш проект, зайдёте в папку src, вы увидите слудующую структуру папок: com\comedyclub\domain Структура имени нашего пакета описывает структуру папок внутри папки src нашего проекта. Достаточно важно иметь правильную структуру пакетов, так как от этого зависит будет ли приложение иметь логичную структуру либо будет просто свалкой классов. Далее на нашем пакете кликаем правой клавишей и выбираем new -> class в поле Name вводим User -> Finish У нас создался шаблон для класса User Аналогично создаём классы Story и Rating. В тескт класса User пишем: package com.comedyclub.domain; public class User { private Long id; private String name; private String password; public User() {} public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } Обратите внимание на структуру нашего класса - у нас есть 3 private поля и публичные геттеры и сеттеры для них. Такая структура это не моя прихоть, а требование спецификации JEE для структуры подобного рода классов (Бинов). Ещё мы тут имеем дефолтный конструктор. Также обратите внимание - в каждом доменном (да и в DTO тоже) объекте у нас будет поле id, фактически это уникальный ключ объекта, его можно сравнить с первичным ключом таблицы в базе данных. Перейдём к классу Story: Code package com.comedyclub.domain;
public class Story {
private Long id; private User user; private String title; private String content; private boolean isPublic;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public boolean getIsPublic() { return isPublic; }
public void setIsPublic(boolean isPublic) { this.isPublic = isPublic; }
} Обратите внимение - тут мы добавили поле типа User - созданного перед этим класса. Теперь вернёмся к классу User и добавим в него список историй - ........... private Set stories = new HashSet (); ........... public Set getStories() { return stories; } public void setStories(Set stories) { this.stories = stories; } public void addStory(Story story) { this.getStories().add(story); story.setUser(this); } тут мы уже имеем множество, поэтому к геттеру и сеттеру мы добавим возможность добавлять историю (В принципе мы могли этого не делать, а использовать getStories().add(Story story) напрямую) Если у вас Set и HashSet станут подчёркнутыми красным - это значит что эклипс не может определить, что это за классы, для этого нужно импортировать их с помошью зарезервированног слова import: package com.comedyclub.domain; import java.util.HashSet; import java.util.Set; public class User { ................. также мы можем автоматически импортировать классы, для этого установим курсор на подчёркнутый красным класс и нажмём Ctrl+Shift+M и эклипс предложит нам выбрать какой из нескольких доступных ему классов нужно имортировать. Также добавим сюда список друзей: .............. private Set friends = new HashSet (); ............... public Set getFriends() { return friends; } public void setFriends(Set friends) { this.friends = friends; } public void addFriend(User friend) { this.getFriends().add(friend); } .................... Мы мспользуем Set так как нам неважен порядок внутри списка, а также мы не допускаем дублирования элементов в нём (иначе нам нкжно использовать List) Далее, в класс Rating запишем следующее: Code package com.comedyclub.domain;
public class Rating {
private Long id; private Integer rate; private User user; private Story story;
public Rating() {}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Integer getRate() { return rate; }
public void setRate(Integer rate) { this.rate = rate; }
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public Story getStory() { return story; }
public void setStory(Story story) { this.story = story; }
}
Вернёмся к классу Story и добавим в него список оценок:
private Set<Rating> ratings = new HashSet<Rating> ();
public Set<Rating> getRatings() { return ratings; }
public void setRatings(Set<Rating> ratings) { this.ratings = ratings; }
public void addRating(Rating rating) { this.ratings.add(rating); rating.setStory(this); } Вот и всё! В принципе не помешало бы сериализовать наши объекты (переопределить для них методы toString, equals, hashCode), однако нас пока и так устроит (не будем засорять чистую доменную модель деталями сериализации, тем более, что в нашем случае всё будет прекрасно работать и без этого) Работу с hibernate рассмотрим на следующем уроке, так как этот уже слишком разросся. Про Data Transfer Objects также в одном из следующих уроков.
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
UnInstaller | Дата: Четверг, 26.02.2009, 23:32 | Сообщение # 6 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| Урок 3. Hibernate Как вы знаете Hibernate - это ORM (Object Relational Mapping) Framework. Это означает, что он конвертирует объекты базы данных в объекты доменной модели (что такое доменные объекты - см. выше). Дя того чтобы рассмотреть работу с фремворком создадим новый проект в эклипсе и назовём его SimpleHibernate. ------------- Подключение библиотек к проекту ------------------ Перейдём в домашнюю папку нашего приложения, создаём папку lib и копируем туда следующие библиотеки: antlr-2.7.6.jar asm.jar cglib-2.1.3.jar commons-collections-2.1.1.jar commons-lang-2.3.jar commons-logging-1.1.jar dom4 j-1.6.1.jar ehcache-1.2.3.jar hibernate3.jar jta-1.0.1B.jar mysql-connector-java-3.1.14.jar Возвращаемся в еклипс, мышкой выделяем наш проект и жмём F5, либо выбераем "refersh" из контекстного меню. Видим что в проекте появилась наша папочка lib. раскрывем её и выбираем все библиотеки, далее на них правой клавишей -> Build path -> Add to Build path Всё теперь наши библиотеки подключены к нашему проекту. ----------------------------------------------------------------- Смысл нашего простого вспомогательного приложения будет такой: У нас есть офис и компьютеры в нём. Нам нужно создать доменную модель которая описывает отношения между этими объектами и сохранить её в базу. Создадим доменную модель. Офис. У офиса есть имя компании к которой он относится, количество рабочих, и компьютеры в нём. Создаём новый пакет - com.simpleHibernate.domain в нём создаём новый класс - Office в класс добавляем поля: Code private Long id;
private String companyName;
private Integer workersCount;
private Set<Workstation> workstations = new HashSet<Workstation>(); (Workstation у нас пока не определено) Теперь сгенерируем геттеры и сеттеры для наших полей: помещяем курсор мыши сразу после полей, жмём правой клавишей мышки и выбираем source->Generate Getters and Setters В появившемся окне ставим галочки возле всех методов и жмём ok - геттеры и сеттеры вставились автоматичаски! Как я говорил ранее - доменные объекты в принципе нужно сериализовывать (хотя работать будет и без этого). Давайте сериализуем наш класс Office. для этого в заголовке класса пропишем implements Serializable: public class Office implements Serializable { добавим поле serialVersionUID с любым значением: static final long serialVersionUID = 1234234231434234234L; без него эклипс будет выводить предупреждение. Далее перекроем методы equals, hashCode и toString. Необходимо сказать что в этих методах (кроме toString) не стоит использовать поле id,а также поля-коллекции. В этих методах мы воспользуемся библиотекой commons-lang от apache, а именно методами EqualsBuilder, HashCodeBuilder, ToStringBuilder: Code public boolean equals(Object o) { if (o == null) { return false; } if (o == this) { return true; } if (!(o instanceof Office)) { return false; }
Office office = (Office) o;
return new EqualsBuilder(). append(this.companyName, office.companyName). append(this.workersCount, office.workersCount).isEquals(); }
public int hashCode() { return new HashCodeBuilder(17, 37). append(this.companyName). append(this.workersCount).toHashCode(); }
public String toString() { return new ToStringBuilder(this). append(this.id). append(this.companyName). append(this.workersCount).toString(); } Я не буду детально останавливаться не сериализиции, так как это отдельная тема. Аналогично создаём класс Workstation c полями: Code private Long id; private Office office; private String ip; private String rootAdminLogin; Создаём геттеры и сеттеры для них, и сериализуем класс: Code public boolean equals(Object o) { if (o == null) { return false; } if (o == this) { return true; } if (!(o instanceof Office)) { return false; }
Workstation workstation = (Workstation) o;
return new EqualsBuilder(). append(this.ip, workstation.ip). append(this.rootAdminLogin, workstation.rootAdminLogin).isEquals(); }
public int hashCode() { return new HashCodeBuilder(7, 37). append(this.ip). append(this.rootAdminLogin).toHashCode(); }
public String toString() { return new ToStringBuilder(this). append(this.id). append(this.ip). append(this.rootAdminLogin).toString(); } Доменная модель готова.
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
UnInstaller | Дата: Суббота, 28.02.2009, 23:22 | Сообщение # 7 |
Admin
Группа: Администраторы
Сообщений: 199
Дата регистрации: 23.02.2008
Пол: Парень
Откуда: Украина
Репутация: 14
Статус: Offline
| Теперь приступаем к интеграции с hibernate. Для того чтобы hibernate знал как правильно конвертировать объекты наших классов в записи базы данных и назад необходимо для каждого класса доменной модели написать конфигурационный файл, он должен называться так же как и класс и иметь расширение hbm.xml У нас будет 2 таких файла - Office.hbm.xml и Workstation.hbm.xml Рассмотрим Office.hbm.xml: Code <?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.simpleHibernate.domain.Office"> <id name="id" column="id" type="long"> <generator class="identity" /> </id>
<property name="CompanyName" /> <property name="WorkersCount" />
<set inverse="true" name="Workstations" cascade="all" lazy="false"> <key column="officeId" /> <one-to-many class="com.simpleHibernate.domain.Workstation" /> </set> </class> </hibernate-mapping> тут в разделе и происходит описание маппинга - указываем какой класс маппим внутри мы указываем какие поля класса и как мы будем маппить. В самом простом случае достаточно описать вот так так можно описывать поля простых типов, которые не являются ключевыми и Hibernate сам разберётся как с нами работать. Для первичного ключа используется запись такого типа: Code <id name="id" column="id" type="long"> <generator class="identity" /> </id> тут мы указываем что первичным ключём будет колонка id которая будет отображатся на наше поле id Самое сложное - это описывать отношения между таблицами. Code <set inverse="true" name="Workstations" cascade="all" lazy="false"> <key column="officeId" /> <one-to-many class="com.simpleHibernate.domain.Workstation" /> </set> тут мы описали отношение один ко многим, то есть что у офиса есть много компов. В базе это будет сконверитровано таким образом, что в таблице Workstation появится колонка officeId. Однако чтобы это заработало нужно правильно описать Workstation.hbm.xml: Code <?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.simpleHibernate.domain.Workstation"> <id name="id" column="id" type="long"> <generator class="identity" /> </id>
<property name="Ip" /> <property name="RootAdminLogin" />
<many-to-one class="com.simpleHibernate.domain.Office" name="Office" not-null="true"> <column name="officeId" /> </many-to-one> </class> </hibernate-mapping> Всё, конфигурация закончена, детально вдаваться в синтаксис конфигурационных файлов я пока не буду. Идём дальше - добавим тестовый класс, чтобы протестировать нашу модель. Создадим пакет com.simpleHibernate.test и в этом пакете создадим класс HibernateTest следующего содержания: Code package com.simpleHibernate.test;
import java.util.HashSet; import java.util.Set;
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration;
import com.simpleHibernate.domain.Office; import com.simpleHibernate.domain.Workstation;
public class HibernateTest { public static void main(String[] args) { Configuration configuration = new Configuration(). setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"). setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"). setProperty("hibernate.connection.url", "jdbc:mysql://localhost/hibernateTest"). setProperty("hibernate.connection.username", "hibernateTest"). setProperty("hibernate.connection.password", "hibernateTest"). setProperty("hibernate.show_sql", "true"). setProperty("hibernate.hbm2ddl.auto", "create");
configuration.addClass(Office.class); configuration.addClass(Workstation.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = null; try { transaction = session.beginTransaction();
saveOfficeWithWorkstations(session); transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } System.out.println(e); } finally { session.close(); } }
private static void saveOfficeWithWorkstations(Session session) { Office office = new Office(); office.setCompanyName("Microsoft"); office.setWorkersCount(100000);
Set<Workstation> workstations = new HashSet<Workstation>();
Workstation workstation1 = new Workstation(); workstation1.setOffice(office); workstation1.setIp("192.168.1.99"); workstation1.setRootAdminLogin("rootAdminLogin"); workstations.add(workstation1);
Workstation workstation2 = new Workstation(); workstation2.setOffice(office); workstation2.setIp("192.168.1.100"); workstation2.setRootAdminLogin("rootAdminLogin2"); workstations.add(workstation2);
office.setWorkstations(workstations);
session.save(office); }
} чтобы это всё заработало нам необходимо в MySQL с помощью heidiSQL добавить базу hibernateTest и пользователя hibernateTest с паролем hibernateTest который, имеет права на работу с базой hibernateTest теперь запускаем: Run - > Run As -> Java Application смотрим на консольку там должно отображатся много текста. Если всё ок то в конце будет выписано Code Hibernate: insert into Office (CompanyName, WorkersCount) values (?, ?) Hibernate: insert into Workstation (Ip, RootAdminLogin, officeId) values (?, ?, ?) Hibernate: insert into Workstation (Ip, RootAdminLogin, officeId) values (?, ?, ?) открываем heidiSQL смотрим в базу hibernateTest - там создались две таблицы office и workstation и в них есть записи. Ура всё заработало! Теперь немного проясню код: Code Configuration configuration = new Configuration(). setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"). setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"). setProperty("hibernate.connection.url", "jdbc:mysql://localhost/hibernateTest"). setProperty("hibernate.connection.username", "hibernateTest"). setProperty("hibernate.connection.password", "hibernateTest"). setProperty("hibernate.show_sql", "true"). setProperty("hibernate.hbm2ddl.auto", "create"); тут мы настраиваем наше соединение с базой. строка setProperty("hibernate.hbm2ddl.auto", "create") означает что таблицы будут каждый раз создаваться заново. Code configuration.addClass(Office.class); configuration.addClass(Workstation.class); тут мы указываем какие классы должны быть отображены в базу. Code SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = null; все операции с базой выполняются в рамках сессии. каждая операция выполняется в транзакции. Code try { transaction = session.beginTransaction();
saveOfficeWithWorkstations(session); transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } System.out.println(e); } finally { session.close(); } тут мы создаём новую транзакцию, выполняем операцию, и сохраняем транзакцию. Если во время операции возникнет исключение, то транзакция не будет сохранена. В конце всех операций закрываем сессию.
http://vkontakte. ru/prog_mc http://vkontakte. ru/metallizard
|
|
|
Эти пользователи подлагодарили UnInstaller за это полезное сообщение: |
|
|
|