Hibernate - 試してみようサンプル
<?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回発行されているね。