
// persistence.xml
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
<persistence-unit name= "exmaple" transaction-type = "RESOURCE_LOCAL">
<description>jpa basic</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/exmaple"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="1234"/>
</properties>
</persistence-unit></persistence>
// Product Entity
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
private long id; // PK는 반드시 @Id를 선언해야 한다.
private String name;
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;
}
}
// Main
import com.mycom.myapp.entity.Product;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class Main {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("exmple");
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
// 트랜잭션을 시작하는 코드
entityManager.getTransaction().begin();
// ----- 실제 작업
Product product = new Product(); // Entity 인스턴스를 생성한다.
product.setId(2L); // SQL로 치면 INSERT 절이다.
product.setName("Phone");
entityManager.persist(product); // context 내부로 들어온다.
// 작업 끝 ------
// Commit을 통해 트랜잭션을 완료시킨다.
entityManager.getTransaction().commit();
} finally {
entityManager.close();
}
}
}
즉, Entity class로 선언한 Product 객체를 갖고, SQL 문법 없이 INSERT를 한 것이다.
EntityManagerFactory에서 xml에서 작성한 config를 적용하고,
EntityManager를 통해 JPA에 접근하여 JDBC API가 작동 된 것이다.
// --- JPA
// Update
{
entityManager.getTransaction().begin();
Product product1 = entityManager.find(Product.class, 1); // entity 객체와 pk 전달
product1.setName("수정 닉네임");
entityManager.getTransaction().commit();
}
// Update2
{
entityManager.getTransaction().begin();
Product product2 = new Product();
product2.setId(2);
product2.setName("홍길동");
/*
Merge는 다음과 같은 특징을 갖는다.
해당 Id가 존재한다면 Update를 수행하고, 존재하지 않다면 새로운 인스턴스를 생성한다.
즉, 존재 여부에 따라 생성 되거나 수정 되는 메소드이다.
반대로, persist()는 예외를 발생시킨다.
해당 Id가 존재한다면 Duplicate Error 를 반환한다.
*/
entityManager.merge(product2)
entityManager.getTransaction().commit();
}
// Delete
{
entityManager.getTransaction().begin();
Product product1 = entityManager.find(Product.class, 1);
entityManager.remove(product1);
entityManager.getTransaction().commit();
}
// Typed SELECT Query
{
String jpql = "SELECT p FROM Product p";
// Product Entity 객체와 jpql을 전달하여 query에 할당한다.
TypedQuery<Product> query = entityManager.createQuery(jpql, Product.class);
// query.getResultList()를 통해 List로 결과를 반환 받는다.
List<Product> productList = query.getResultList();
// 출력
for (Product product : productList) {
System.out.println(product);
}
}
// Named Parameter Query
{
String jpql = "SELECT p FROM Product p WHERE p.id = :id";
TypedQuery<Product> query = entityManager.createQuery(jpql, Product.class);
query.setParameter("id", 1); // :id => 해당 name에 값을 전달 해야한다.
Product product = query.getSingleResult(); // 결과 1개 반환
System.out.println(product);
}
// Named Parameter Query with LIKE
{
String searchWord = "덤벨";
String searchPattern = "%" + searchWord + "%";
String jpql = "SELECT p FROM Product p WHERE p.name LIKE :searchPattern";
TypedQuery<Product> query = entityManager.createQuery(jpql, Product.class);
query.setParameter("searchPattern", searchPattern); // :id => 해당 name에 값을 전달 해야한다.
List<Product> productList = query.getResultList();
for (Product product : productList) {
System.out.println(product);
}
}