Web Framework) Hibernate 관련 실습(Session Methods 사용하기)

Jay Kim·2022년 1월 17일
0

Web Framework

목록 보기
1/10

이번 시간에는 spring을 사용하지 않고 오로지 java application을 사용하여 Hibernate 실습을 하겠습니다.

다음에 spring을 활용하여 실습하도록 하겠습니다.

SQL를 사용하지 않고 객체지향적으로 코드를 생성하였습니다.

본 실습은 eclipse에서 프로젝트를 생성하여 하였습니다.

1)pom.xml 수정

plugin 추가
dependency 추가
hibernate-core 관련 dependency
mysql 관련 dependency
lombok 관련 dependency
logging 관련 dependency

2)hibernate 관련 config xml 파일 생성하기

java-resources 아래 hibernate.cfg.xml 생성

코드는 hibernate.cfg.xml example for mysql 8을 검색하여 예시 코드를 넣어주기

3)Entity class 생성하기 (테이블에 매핑되는 자바 클래스)

Product.java를 생성한 후 어노테이션 달아주기

@Entity
@Table(name="product")
@Column(name="product_id") // 칼럼 이름을 지정 안 할시 필드 name 그대로 사용

save(), get(), close() 등 Session Methods 사용하기와 createQuery()로 실제로 쿼리 작성해보기

  • Session Methods 사용
 Product savedProduct = session.get(Product.class, id1); //get()
 System.out.println("saved product" + savedProduct);
  • createQuery() 사용
Query<Product> aQuery = session.createNamedQuery("form Product", Product.class); //HQL 사용"form Product order by name"으로 할 시 순서 맞춰서 나옴 (book2, book1으로 저장하여도 출력은 book1 book2 순서로)
List<Product> products = aQuery.getResultList();	//조회		
System.out.println(products);//출력

4)Entity 클래스를 만든 후 hibernate.cfg.xml에서 mapping class 값 넣어주기

5)실행 할 TestMain 클래스 만들기

실행하여 mysql workbanch DB에 저장 되었는지 확인하기


아래에 코드를 첨부하겠습니다. (깃허브 github.com/hhi9920/helloHibernate.git에서도 코드 확인이 가능합니다.)

<pom.xml>

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>kr.ac.hansung.cse</groupId>
	<artifactId>helloHibernate</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.4.28.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.20</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.12</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.3</version>
			<scope>runtime</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<source>1.11</source>
					<target>1.11</target>
					<compilerArgument>-Xlint:all</compilerArgument>
					<showWarnings>true</showWarnings>
					<showDeprecation>true</showDeprecation>
				</configuration>

			</plugin>
		</plugins>
	</build>

</project>

<hibernate.cfg.xml>

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- JDBC Database connection settings -->
		<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://localhost:3306/testdb?useSSL=false&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Seoul</property>
		<property name="connection.username">root</property>
		<property name="connection.password">csedbadmin</property> <!-- password는 mysql server에 지정해둔 비밀번호로 입력 -->


		<!-- Select our SQL dialect -->
		<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
				
		<property name="show_sql">true</property>
		<property name="current_session_context_class">thread</property>
		<property name="hbm2ddl.auto">create</property>
		
		
		<mapping class="helloHibernate.Product" />
	</session-factory>
</hibernate-configuration>

<Product.java>

package helloHibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString

@Entity
@Table(name="product")
public class Product {
	
	@Id
	@GeneratedValue
	@Column(name="product_id")
	private int id;
	
	private String name;
	
	private int price;
	
	private String description;
}

<TestMain.java>

package helloHibernate;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

public class TestMain {

	private static SessionFactory sessionFactory; // 멤버변수 만들기

	public static void main(String[] args) {

		/*
		 * 이렇게 3줄은 아래 한 줄과 같다.chained method방법 Configuration conf = new Configuration();
		 * //conf 객체 만들고 conf.configure("hibernate.cfg.xml"); // 설정파일 명시 디폴트 name이라 생략은
		 * 가능 sessionFactory = conf.buildSessionFactory();
		 */

		// chained method
		sessionFactory = new Configuration().configure().buildSessionFactory(); // sessionFactory 생성

		Product product1 = new Product(); // product 객체 생성
		product1.setName("Notebook");
		product1.setPrice(2000);
		product1.setDescription("Awesome notebook!!");

		Product product2 = new Product(); // product 객체 생성
		product1.setName("Notebook2");
		product1.setPrice(3000);
		product1.setDescription("Power notebook!!");

		Session session = sessionFactory.openSession(); // session 생성
		Transaction tx = session.beginTransaction(); // 트랜젝션 수행

		// 개별적으로
		// Serializable id1= session.save(product1); //product1 저장 따라서 자동적으로 DB에 저장됨 ,
		// id1에 id값 저장하기

		// list로 출력 시 아이디 저장 필요 없음
		session.save(product1);
		session.save(product2);

		/*
		 * session methods 사용하기 Product savedProduct = session.get(Product.class, id1);
		 * //get() System.out.println("saved product" + savedProduct);
		 */

		// createQuery() 사용하기 -리스트 조회
		Query<Product> aQuery = session.createNamedQuery("form Product", Product.class); // HQL 사용 "form Product order by name"으로 할 시 순서 맞춰서 나옴 (book2, book1으로 저장하여도 출력은 book1 book2 순서로)
		List<Product> products = aQuery.getResultList(); // 조회
		System.out.println(products);// 출력

		tx.commit();

		session.close(); // session 닫기
		sessionFactory.close(); // sessionFactory 닫기

	}

}

<logback.xml>

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
	<appender name="consoleAppender"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n
			</Pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>TRACE</level>
		</filter>
	</appender>

	<logger name="kr.ac.hansung.cse">
		<level value="DEBUG" />
	</logger>
	
	<logger name="org.hibernate.type.descriptor.sql">
		<level value="TRACE" />
	</logger>
	
	<root>
		<level value="INFO" />
		<appender-ref ref="consoleAppender" />
	</root>
</configuration>

0개의 댓글