Coding(Java)/Database(SQL)2022. 3. 19. 15:00
반응형

3. 자바에서 hibernate DB 기본 CRUD(생성, 보기, 수정, 삭제) 및 hibernate 사용법

 

 

지난 번에는 pgAdmin 상에서 기본적인 쿼리문을 이용해 데이터 CRUD를 했었다. 이번에는 하이버네이트(hibernate)를 이용하여 자바 상에서 DB의 CRUD를 할 것이다.

 

hibernate가 무엇인가 하면 자바 언어를 위한 객체 관계 맵핑 프레임워크로 객체 지향 도메인 모델을 관계형 DB로 매핑하기 위한 프레임워크를 제공한다. 

 

먼저 다음의 압축 파일을 다운받고, 압축을 푼다.

hibernate.zip
0.00MB

다음으로 STS 또는 이클립스에서 자바 프로젝트를 만든 다음 src(소스) 부분에 압축된 파일들을 모두 붙여넣는다. 붙여넣었다면 Package Explorer에 다음과 같이 나타날 것이다.

*hibernate.cfg.xml 파일은 반드시 src에 있어야 한다.

 

다음으로 config에서 다음과 같이 설정하고(빨간색 박스 부분, password는 각자가 설정한 비밀번호로 작성하고, Database에는 pgAdmin의 DB 이름을 적는다),

프로젝트에 마우스를 갖다 댄 다음 오른쪽을 클릭해 Configure => Convert to Maven Project를 클릭한다.

그러면 다음과 같이 창이 뜰 것이고 아무 것도 건드리지 말고 그냥 Finish를 누른다. 

 Finish를 눌렀다면 'pom.xml' 파일이 생길 것이다.

위 사진은 pom.xml의 기본 소스코드이다. 여기의 <build> 밑(</build>)에 <dependencies>를 추가하고, 그 안에 다음의 hibernate, postgresql dependency를 추가한다.

*hibernate, postgresql dependency

1
2
3
4
5
6
7
8
9
10
11
12
  <dependencies>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.1.Final</version>
      </dependency>
      <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.4</version>
      </dependency>
  </dependencies>
cs

*또는 해당 버전의 lib파일을 받은 다음 build path에서 추가해도 된다.

 

dependency추가를 완료했다면 src에 이름이 'entity'인 패키지를 만들고, 'TableTest'(다른 이름으로 해도 됨)이름의 자바 클래스 파일을 만든다.

그 다음으로 다음과 같이 VO를 작성한다.

이때 작성 항목은 id(일련번호 관리객체), name(이름), age(나이), pnum(전화번호)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@Entity
@Table
public class TableTest {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private int id;
    
    @Column
    private String name;
    
    @Column
    private int age;
    
    @Column
    private String pnum;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getPnum() {
        return pnum;
    }
 
    public void setPnum(String pnum) {
        this.pnum = pnum;
    }
}
cs

*hibernate에서 entity가 vo역할을 한다.

*id 어노테이션(annotation, @)는 primary key를 지정하는 역할을 하고, @GeneratedValue(strategy=GenerationType.AUTO)는 그 대상(id)을 자동적으로 생성되게 한다. id는 보통 정수형으로 사용되고, Generated 어노테이션은 자동으로 그 객체를 생성하는(GenerationType.AUTO) nextVal의 역할을 한다.

*GenerationType.AUTO를 입력할 때 자동완성(ctrl+space)이 안될 것이다. 그러니 다 작성한 다음에 ctrl+space키를 누른다. 그러면 다음 사진처럼 자동완성 창이 뜰 것이다. 거기서 Import 'GenerationType'를 누른다.

*어노테이션(Annotation, @) 작성할 때 주의할 점은 hibernate가 아닌 javax.persistence에 있는 것을 import해야 한다.

 

다음으로 hibernate.cfg.xml로 들어가서 다음과 같이 <mapping class = "entity.TableTest" />을 작성한다.

작성을 마쳤다면 src에 main이름의 패키지를 만들고, 그 안에 'Test'(다른 이름으로 해도 됨)이름의 클래스 파일을 만든다. 이때 public static void main(String[] args)에 체크한다. 그리고, 이 클래스 파일을 다음과 같이 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Test {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        Session session=null;
        Transaction transaction=null;
        try {
            session=hibernate.factory.openSession();
            transaction=session.beginTransaction();
 
            //여기서부터 내용 작성
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            if(transaction!=null)
                if(transaction.isActive())
                    transaction.rollback();
        } finally {
            if(session!=null)
                if(session.isOpen())
                    session.close();
        }
    }
}
cs

transaction 밑에 다음과 같이 작성한다.

다 작성했다면 이 클래스 파일을 실행한다. 정상적으로 실행되었다면 "Data Saved"라는 문자가 콘솔 창에 출력된다.

 

*transaction.commit();은 특정 행동(입력/수정/삭제)을 했을 때 반드시 작성해야 한다.

 

다음으로 앞에서 작성한 코드들을 주석처리 한 후 다음 그림대로 작성한다.

이 때도 정상적으로 실행되었다면 "Data Saved"라는 문자가 콘솔 창에 출력된다. 

pgAdmin 들어가서 다음과 같이 앞에서 입력한 데이터가 저장되었음을 확인한다. 

이제 이 데이터들을 콘솔창에서 확인하자.  

앞에서 작성한 코드들을 주석처리하고 그 밑에 다음의 쿼리문을 작성하고

List<TableTest> tt=session.createQuery("select t from TableTest t").getResultList();

for문을 이용해 데이터들이 콘솔에 입력되도록 한다. 

*자바에서 hibernate 쿼리문 작성할 때 select와 from 사이에 아무 문자, TableTest(entity 이름) 뒤에 아무 문자를 붙이는데 이때 아무 문자는 같은 것을 작성해야 한다. 자세한 건 다음 사이트를 참고할 것:

https://www.onlinetutorialspoint.com/hibernate/hibernate-query-language-hql-select.html

 

Hibernate Query Language (HQL) Select Operation

Hibernate Query Language (HQL) : HQL is mainly used to perform the bulk operations in hibernate. HQL select is an operation to select data fr

www.onlinetutorialspoint.com

데이터를 수정할 때는 다음과 같이 코드를 작성한다.

1
2
3
4
5
TableTest table=new TableTest();
table=session.find(TableTest.class, 1);
table.setPnum("010-5323-6844");
transaction.commit();
cs

*수정할 때 쿼리문을 쓰지 않고 session.find를 이용했는데 쿼리문을 쓰는 것 보다 이 방법이 편리하다. 

특정 id(일련번호 관리객체)에 해당되는 데이터를 찾고 싶을 때 다음과 같이 작성한다.

 

TableTest table=new TableTest();

table=session.find(entity이름.class, id);

 

코드 작성을 완료했다면 실행시킨다.

다음으로 콘솔 창에서 수정된 데이터를 확인하자. 

다음과 같이 코드를 작성하고 실행시킨다.

 

List<TableTest> tt=session.createQuery("select t from TableTest t where t.id=1").getResultList();
System.out.println("변경 후 전화번호:"+tt.get(0).getPnum());

 

그러면 다음과 같이 바뀐 결과를 확인할 수 있다. 

마지막으로 데이터를 삭제하자. 다음과 같이 코드를 작성한다. 

1
2
3
4
5
TableTest table=new TableTest();
table=session.find(TableTest.class,2);
    if(table!=null)
        session.delete(table);
transaction.commit();
cs

코드 작성을 완료했다면 실행시킨다. pgAdmin에서 다음과 같이 삭제되었음을 확인할 수 있다.

 

반응형
Posted by skywalker222