넷빈 6.7.1에서 하이버네이트 사용하기-SwingGUI
Written on 오전 5:12 by 강여사(J.Y.Kang)
이번에 올릴 내용은 하이버네이트(hibernate) 프레임워크 사용에 관한 내용입니다.
하이버네이트는 DB 프레임워크중 하나로 자바 환경에서 객체/관계형 매핑 도구입니다. 이러한 ORM(Object/Relational Mapping, ORM)이라는 용어는 객체 모델을 SQL 기반의 스키마를 사용해서 관계형 데이터 모델로 데이터 표현을 매핑하는 기술을 가르킵니다.
이러한 ORM 으로는 Toplink(http://www.oracle.com/technology/global/kr/products/ias/toplink/index.html)와 eclipselink(www.eclipse.org/eclipselink) 등이 있습니다. SQL Mapper의 iBatis (http://ibatis.apache.org/index.html) 도 있구요. 자세한 내용은 해당 사이트 등을 참고하시기 바랍니다.
넷빈 6.7.1에는 위에 언급한 3개의 ORM이 넷빈에 기본적으로 포함되어 있습니다. 따라서 많은 부분 작업이 수월하게 진행됩니다. 그러한 방법을 앞으로 스윙(SwingGUI), 웹 등 기타 프로젝트를 통해 살펴보도록 하겠습니다.
우선 이 프로젝트에서는 Mysql 데이터베이스 서버와 샘플 데이터베이스 Sakila 를 사용합니다. 따라서 이러한 설정에 대해서는 이전 게시물을 참조하시기 바랍니다.
환경
넷빈즈 6.7.1
데이터베이스 서버 Mysql 5.1
샘플데이터베이스 Sakila
그럼 프로젝트를 시작하겠습니다.
File - new project
Java - Java Application 다음
프로젝트 이름: DVDStoreAdmin
경로는 적당히
마침
프로젝트에서 마우스 오른쪽 클릭
new - other
Hibernate - Hibernate Configuration Wizard 클릭 - 다음
파일이름: hibernate.cfg (기본) - 다음
데이터베이스 커넥션을 sakila 커넥션으로 (드래그메뉴에서 선택)jdbc:mysql://localhost:3306/sakila
마침
프로젝트의 libraries 에 hibernate 관련 파일들이 추가된 것을 볼 수 있습니다.
오른쪽 편집기 메뉴(Design) 에서 Configuration Properties 를 확장한 후 add 버튼 클릭
드래그메뉴에서 hibernate_show.sql 선택 - true - OK
(이 작업으로 하이버네이트의 SQL 이 console 창에 나타나게 됩니다) XML 탭 클릭 - design 으로 작업된 내용 확인
프로젝트에서 마우스 오른쪽 클릭 - new - other
Hibernate - Hibernate Util.java 클릭
클래스 이름은 HibernateUtil
마침
프로젝트에서 마우스 오른쪽 클릭 - new - other
Hibernate - Hibernate Reverse Engineering Wizard - 다음
파일 이름: hibernate.reverg (기본)
다음
Configuration File: hibernate.cfg.xml
Available Tables 의 actor 를 선택(add) - 그림 참조
마침
만들어진 xml 확인
프로젝트에서 마우스 오른쪽 클릭 - new - other
Hibernate - Hibernate Mapping file and POJOs from Databases... 선택
다음
그림을 참고하여 xml 파일 설정(기본), Code Generation Settings: 아래 2개 선택
Package 이름은 sakila.entity 로 줬슴
마침
프로젝트에서 마우스 오른쪽 클릭 - new - JFrame Form 선택
클래스 이름은: DVDStoreAdmin
패키지 이름은: sakila.ui
마침
JLabel을 3개 끌어다 Actor Profile, first Name:, last Name: 등으로 text 변경
JTextField 를 2개 끌어다 first Name: 옆에 하나, last Name 옆에 하나 놓는다.
JButton 1개 끌어다 last Name 텍스트필드 옆에 놓습니다.
Table도 하나 끌어다 아래에 위치
각 요소 의 var 변경을 위해 해당 컴포넌트에서 마우스 오른쪽 클릭 - Change Variable Name 클릭
컴포넌트 요소(기본) -> 변경할 variable 이름
jTextField1 -> firstNameTextField
jTextField2 -> lastNameTextField
jButton1 -> queryButton
jTable1 -> resultTable
텍스트필드안의 내용을 지우고자 할때에는 오른쪽의 properties 창에서 text 안에 글을 지우고 Enter 키를 입력하여 변경사항을 반영하면 됩니다.
하이버네이스 쿼리수행을 위해
default package 의 hibernate.cfg.xml 에서 마우스오른쪽을 클릭 - Run HQL Query 선택
from Actor 를 입력(타이핑)하고 위의 run 아이콘을 누르면 해당 쿼리 결과(result)가 출력
result 옆에 탭인 SQL 를 선택하여 HQL 쿼리 확인
위의 쿼리를 변경하면 잠시후 아래 SQL 이 변경됨을 알 수 있습니다.
from Actor a where a.firstName like 'PE%'
or
from Actor a where a.lastName like 'MO%'
등
이제 FORM 클래스 편집을 위해 sakila.ui 의 DVDStoreAdmin.java 의 source 탭 클릭
생성자 아래에 2개의 쿼리 문자열 추가
private static String QUERY_BASED_ON_FIRST_NAME="from Actor a where a.firstName like '";
private static String QUERY_BASED_ON_LAST_NAME="from Actor a where a.lastName like '";
아래 메소드 들 추가
==========================
private void runQueryBasedOnFirstName() {
executeHQLQuery(QUERY_BASED_ON_FIRST_NAME + firstNameTextField.getText() + "%'");
}
private void runQueryBasedOnLastName() {
executeHQLQuery(QUERY_BASED_ON_LAST_NAME + lastNameTextField.getText() + "%'");
}
private void executeHQLQuery(String hql) {
try {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query q = session.createQuery(hql);
List resultList = q.list();
displayResult(resultList);
session.getTransaction().commit();
} catch (HibernateException he) {
he.printStackTrace();
}
}
==========================
임포트 문제 해결을 위해 공백에서 마우스 오른쪽 클릭 - fix import 선택
클래스 선택
(org.hibernate.Query, org.hibernate.Session) and java.util.List )
OK
버튼에 이벤트 작업을 하기 위해 Design 탭에서 JButton을 클릭하면 source의 메소드 편집창이 나타납니다.
다음 내용 추가
======================================
if(!firstNameTextField.getText().trim().equals("")) {
runQueryBasedOnFirstName();
} else if(!lastNameTextField.getText().trim().equals("")) {
runQueryBasedOnLastName();
}
======================================
다음 메소드 추가
=======================================
private void displayResult(List resultList) {
Vector
Vector tableData = new Vector();
tableHeaders.add("ActorId");
tableHeaders.add("FirstName");
tableHeaders.add("LastName");
tableHeaders.add("LastUpdated");
for(Object o : resultList) {
Actor actor = (Actor)o;
Vector<object>
oneRow = new Vector<object>();
oneRow.add(actor.getActorId());
oneRow.add(actor.getFirstName());
oneRow.add(actor.getLastName());
oneRow.add(actor.getLastUpdate());
tableData.add(oneRow);
}
resultTable.setModel(new DefaultTableModel(tableData, tableHeaders));
}
=======================================
임포트 해결을 위해 fix import
(java.util.Vector)
프로젝트 실행 - run
main 클래스 설정 - OK
테스트:
Swing 창에서 first Name 의 텍스트 필드에 Pe 로 적고 버튼을 클릭하면 Pe로 시작되는 actor에 대해 아래 테이블에 나타납니다.
이상이 간단히 알아본 하이버네이트 사용 - Swing 프로젝트입니다.
다음에는 웹 어플리케이션으로 하이버네이트를 사용해보도록 하겠습니다.
기타 여러 쿼리 수행문들을 응용해보시기 바랍니다.
수고하셨습니다. *^^*
If you enjoyed this post Subscribe to our feed