이번 시간에는 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()로 실제로 쿼리 작성해보기
Product savedProduct = session.get(Product.class, id1); //get()
System.out.println("saved product" + savedProduct);
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&characterEncoding=UTF-8&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>