STACKJAVA

Code ví dụ Hibernate Session, SessionFactory (MySQL + Maven + Eclipse)

Code ví dụ Hibernate Session, SessionFactory (MySQL + Maven + Eclipse)

(Xem thêm: Hướng dẫn tự học Hibernate Framework bằng tiếng việt.)

(Xem thêm: Code ví dụ truy vấn Hibernate với EntityManger, EntityManagerFactory)

(Xem thêm: So sánh sự khác nhau Hibernate Session với EntityManager)

Ở bài này mình sẽ thực hiện sử dụng hibernate kết nối với cơ sở dữ liệu là MySQL để thực hiện truy vấn (thêm, sửa, xóa dữ liệu) với hibernate session

Các công nghệ sử dụng

Tạo database trên MySQL

Trong ví dụ này mình tạo cơ sở dữ liệu ‘hibernate-demo’ với table customer (id, name, address) trong đó id tự tăng.

CREATE DATABASE  IF NOT EXISTS `hibernate-demo`;

CREATE TABLE `hibernate-demo`.`customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Tạo Maven Project

Thư viện sử dụng

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>HibernateDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    <hibernate.version>5.1.0.Final</hibernate.version>
  </properties>
  <dependencies>
    <!-- Hibernate -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-c3p0</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <!-- MySQL JDBC driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>
  </dependencies>
</project>

File cấu hình hibernate

Chứa thông tin kết nối tới database (url, username, password), liệt kê các entity class được mapping với các table trong database

(Trường hợp sử dụng hibernate EntityManager thì sẽ sử dụng file META-INF/persistence.xml)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate-demo?useSSL=false</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">admin1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.hibernate.current_session_context_class">thread</property>
        
        <mapping class="stackjava.com.hibernatedemo.model.Customer" />
    </session-factory>
</hibernate-configuration>

File entity

File Customer.java sẽ tương ứng với table customer trong database.

package stackjava.com.hibernatedemo.model;

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

@Entity
@Table(name = "customer")
public class Customer {
  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @Column(name = "name")
  private String name;

  @Column(name = "address")
  private String address;
  
  public Customer() {
  }

  public Customer(String name, String address) {
    this.name = name;
    this.address = address;
  }

  @Override
  public String toString() {
    return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
  }

  // setter-getter

}

File DAO (Data Access Object)

Được dùng để truy vấn tới database.

package stackjava.com.hibernatedemo.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import stackjava.com.hibernatedemo.model.Customer;

public class CustomerDAO {
  SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

  public void save(Customer customer) {
    Session session = sessionFactory.openSession();
    try {
      session.beginTransaction();
      session.save(customer);
      session.getTransaction().commit();
      System.out.println("insert success!");
    } catch (RuntimeException e) {
      session.getTransaction().rollback();
      e.printStackTrace();
    } finally {
      session.flush();
      session.close();
    }
  }
  
  public Customer findById(int id) {
    Session session = sessionFactory.openSession();
    Customer customer = session.load(Customer.class, id);
    System.out.println(customer);
    return customer;
  }

  public void showAll() {
    Session session = sessionFactory.openSession();
    List<Customer> list = session.createQuery("FROM Customer").list();
    for (Customer customer : list) {
      System.out.println(customer);
    }
  }

  public void updateName(int id, String name) {
    Session session = sessionFactory.openSession();
    String sql = "UPDATE Customer u SET u.name = :newName WHERE u.id = :id";
    session.createQuery(sql).setString("newName", name).setInteger("id", id).executeUpdate();
  }

  public void update(Customer customer) {
    Session session = sessionFactory.openSession();
    session.update(customer);
  }

  public void delete(int id) {
    Session session = sessionFactory.openSession();
    try {
      session.beginTransaction();
      Customer customer = session.load(Customer.class, id);
      session.delete(customer);
      session.getTransaction().commit();
      System.out.println("detete success!");
    } catch (RuntimeException e) {
      session.getTransaction().rollback();
      e.printStackTrace();
    } finally {
      session.flush();
      session.close();
    }

  }

  public void searchByName(String name) {
    Session session = sessionFactory.openSession();
    List<Customer> list = session.createQuery("FROM Customer WHERE name LIKE :name")
        .setParameter("name", "%" + name + "%").list();
    for (Customer customer : list) {
      System.out.println(customer);
    }
  }

}

 

Lệnh new Configuration().configure().buildSessionFactory(); sẽ mặc định lấy thông tin từ file hibernate.cfg.xml để tạo đối tượng Session dùng để truy vấn với database.

Trong method save() mình có áp dụng transaction bằng lệnh session.beginTransaction(); và session.getTransaction().commit(); để bắt đầu và kết thúc một transaction. và lệnh session.getTransaction().rollback(); dùng để lấy lại dữ liệu ban đầu nếu có lỗi xảy ra.

File MainApp.java

Thực hiện gọi class DAO để truy vấn dữ liệu.

package stackjava.com.hibernatedemo;

import stackjava.com.hibernatedemo.dao.CustomerDAO;
import stackjava.com.hibernatedemo.model.Customer;

public class MainApp {
  public static void main(String[] args) {
		demoInsert();
		demoSearchByName();
  }
  
  public static void demoInsert() {
    CustomerDAO customerDAO = new CustomerDAO();
    customerDAO.save(new Customer("Kai", "Viet Nam"));
    customerDAO.save(new Customer("Thanos", "Viet Nam"));
    customerDAO.save(new Customer("Thor", "Asgard"));
    customerDAO.save(new Customer("Hulk", "USA"));
    customerDAO.save(new Customer("Iron Man", "USA"));
  }
  
  public static void demoFindById() {
    CustomerDAO customerDAO = new CustomerDAO();
    customerDAO.findById(2);
  }
  
  public static void demoShowAll() {
    CustomerDAO customerDAO = new CustomerDAO();
    customerDAO.showAll();
  }
  
  public static void demoSearchByName() {
    CustomerDAO customerDAO = new CustomerDAO();
    customerDAO.searchByName("th");
  }
  
  public static void demoDelete() {
    CustomerDAO customerDAO = new CustomerDAO();
    customerDAO.delete(1);
  }
}

Demo:

Ví dụ 1: Thực hiện insert 5 đối tượng customer (id tự tăng nên ta không cần truyền id vào đối tượng customer)

public static void demoInsert() {
  CustomerDAO customerDAO = new CustomerDAO();
  customerDAO.save(new Customer("Kai", "Viet Nam"));
  customerDAO.save(new Customer("Thanos", "Viet Nam"));
  customerDAO.save(new Customer("Thor", "Asgard"));
  customerDAO.save(new Customer("Hulk", "USA"));
  customerDAO.save(new Customer("Iron Man", "USA"));
}

Kết quả:

Ví dụ 2: Thực hiện search đối tượng customer theo name (ví dụ search các customer có chữ ‘th’ trong name:

public static void demoSearchByName() {
  CustomerDAO customerDAO = new CustomerDAO();
  customerDAO.searchByName("th");
}

Kết quả:

Customer [id=2, name=Thanos, address=Viet Nam]
Customer [id=3, name=Thor, address=Asgard]

Ví dụ 3:  xóa đối tượng customer có id = 1

CustomerDAO customerDAO = new CustomerDAO();
Customer customer = new Customer();
customer.setId(1);
customerDAO.delete(customer);

Kết quả:

Code ví dụ Hibernate Session, SessionFactory (MySQL + Maven + Eclipse) stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References:

http://docs.jboss.org/hibernate/orm/…Hibernate_User_Guide.html