liguofeng29’s blog

個人勉強用ブログだっす。

Hibernate - 試してみようサンプル

設定ファイル : 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>
        <!-- ドライバ -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 接続情報 -->
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">xxxx#</property>
        <!-- 各種設定 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.min_size">1</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- プール内最大Statement -->
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>

        <property name="hibernate.c3p0.validate">true</property>
        <!-- DB方言解消 -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 必要に応じて表生成? -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 生成SQL表示 -->
        <property name="show_sql">true</property>
        <property name="hibernate.format_sql">true</property>

        <!-- マッピングテーブル -->
        <mapping class="entity.Item"/>
    </session-factory>
</hibernate-configuration>

永久化クラス : Item.java

package entity;

import java.math.BigDecimal;

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

@Entity
@Table(name="m_item")
public class Item {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private BigDecimal price;

    public BigDecimal getPrice() {
        return price;
    }
    public void setPrice(BigDecimal price) {
        this.price = price;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Dao親クラス : DaoSupport.java

package dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public abstract class DaoSupport {
    protected Session getSession() {
        // Configurationインスタンス化
        Configuration conf = new Configuration()
        // 引数なし : hibernate.cfg.xml
        // 引数あり : 引数の設定ファイル
            .configure();

        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(conf.getProperties()).build();

        // SessionFactory生成
        SessionFactory sf = conf.buildSessionFactory(serviceRegistry);
        // Session生成
        Session session = sf.openSession();

        return session;
    }
}

ItemのDaoクラス : ItemDao.java

package dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Item;

public class ItemDao extends DaoSupport {

    public void save(Item item) {
        Session session = super.getSession();

        // TX開始
        Transaction tx = session.beginTransaction();
        session.save(item);
        tx.commit();
        session.close();
    }

    public Item load(Integer id) {
        Session session = super.getSession();

        // loadすると
        // Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Sessionが発生する
        // Item item = (Item) session.load(Item.class, id);
        Item item = (Item) session.get(Item.class, id);
        session.close();

        return item;
    }

    public void update(Item item) {
        Session session = super.getSession();

        // TX開始
        Transaction tx = session.beginTransaction();
        session.update(item);
        tx.commit();
        session.close();
    }

    public void delete(Item item) {
        Session session = super.getSession();

        // TX開始
        Transaction tx = session.beginTransaction();
        session.delete(item);
        tx.commit();
        session.close();
    }

    public List<Item> searchAll() {
        Session session = getSession();

        @SuppressWarnings("unchecked")
        List<Item> list = session.createCriteria(Item.class).list();

        return list;
    }
}

・登録テスト

import java.math.BigDecimal;

import dao.ItemDao;
import entity.Item;

public class TestEntity {
    public static void main(String[] args) {
        ItemDao itemDao = new ItemDao();

        Item item = new Item();
        // Item生成
        item.setPrice(new BigDecimal(100));
        item.setName("item01");

        // 登録
        itemDao.save(item);

//     // 更新
//     item.setPrice(new BigDecimal(200));
//     itemDao.update(item);
//
        // 検索
//     Item item2 = itemDao.load(1);
//     System.out.println(item2.getId());
//     System.out.println(item2.getName());
//     System.out.println(item2.getPrice());
//
//
//     // 削除
//     itemDao.delete(item);
    }
}
Hibernate: 
    insert 
    into
        m_item
        (name, price, id) 
    values
        (?, ?, ?)

mysql> select * from m_item;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  1 | item01 |   100 |
+----+--------+-------+
1 row in set (0.00 sec)

・更新テスト

   // 更新
    item.setPrice(new BigDecimal(200));
    itemDao.update(item);
Hibernate: 
    update
        m_item 
    set
        name=?,
        price=? 
    where
        id=?

mysql> select * from m_item;
+----+--------+-------+
| id | name   | price |
+----+--------+-------+
|  1 | item01 |   200 |
+----+--------+-------+
1 row in set (0.00 sec)

・検索テスト

   // 検索
    Item item2 = itemDao.load(1);
    System.out.println(item2.getId());
    System.out.println(item2.getName());
    System.out.println(item2.getPrice());
Hibernate: 
    select
        item0_.id as id1_0_0_,
        item0_.name as name2_0_0_,
        item0_.price as price3_0_0_ 
    from
        m_item item0_ 
    where
        item0_.id=?
1
item01
200

・削除テスト

 // 削除
    itemDao.delete(item);
Hibernate: 
    select
        item_.id,
        item_.name as name2_0_,
        item_.price as price3_0_ 
    from
        m_item item_ 
    where
        item_.id=?
Hibernate: 
    delete 
    from
        m_item 
    where
        id=?


mysql> select * from m_item;
Empty set (0.00 sec)

※deleteの場合は、SQLがseleteとdelete2回発行されているね。