1 Hibernate的基本配置
添加所需 jar 包
hibernate-distribution-3.6.10.Final 下的 hibernate.jar;
- \hibernate-distribution-3.6.10.Final\lib\required下的所有 jar 包。
編寫(xiě) hibernate.cfg.xml (hibernate 配置文件) 配置 hibernate 如何連接到數(shù)據(jù)庫(kù)
- <?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>
- <!-- 配置如何連接數(shù)據(jù)庫(kù) -->
- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
- <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
- <property name="hibernate.connection.username">hr</property>
- <property name="hibernate.connection.password">hr</property>
- <!-- hibernate支持多種數(shù)據(jù)庫(kù), 需要選擇一種方言 -->
- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10g Dialect</property>
- <!-- 二級(jí)緩存配置 -->
- <!-- 啟用二級(jí)緩存 -->
- <property name="hibernate.cache.use_second_level_cache">true</property>
- <!-- 啟用hql查詢(xún)緩存 -->
- <property
- name="hibernate.cache.use_query_cache">true</property>
- <!-- 選擇緩存實(shí)現(xiàn)類(lèi) -->
- <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
- <!-- 跟連接池相關(guān)的配置 -->
- <!-- 連接的***個(gè)數(shù) -->
- <property name="hibernate.c3p0.max_size">10</property>
- <!-- 每次創(chuàng)建連接的增長(zhǎng)數(shù) -->
- <property name="hibernate.c3p0.acquire_increment">2</property>
- <!-- 連接最小保留個(gè)數(shù) -->
- <property name="hibernate.c3p0.min_size">2</property>
- <!-- 獲取連接的超時(shí)時(shí)間 -->
- <property name="hibernate.c3p0.timeout">20</property>
- <property name="current_session_context_class">thread</property>
- <!-- 加入sql監(jiān)控 -->
- <property name="hibernate.show_sql">true</property>
- <mapping resource="entity/User.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
配置映射文件
在java實(shí)體類(lèi)和數(shù)據(jù)庫(kù)表之間建立對(duì)應(yīng)關(guān)系,來(lái)簡(jiǎn)化增刪改查操作對(duì)象(java實(shí)體類(lèi)) 關(guān) 系(關(guān)系型數(shù)據(jù)庫(kù)) 映射(對(duì)應(yīng)關(guān)系) ORM(object relationship mapping)
對(duì)實(shí)體類(lèi)的要求:
1. 要有無(wú)參構(gòu)造方法
2. 實(shí)體類(lèi)不能加 final
3. 建議實(shí)現(xiàn) Serializable 接口(以后二級(jí)緩存會(huì)用到)
映射文件(格式為 xml):
習(xí)慣上格式為 實(shí)體類(lèi)名.hbm.xml
hibernate 主鍵生成方式:
- increment 取 id 的***值+1
- sequence 默認(rèn)找 hibernate_sequence `<generator class="sequence"/>`
- 如果要自定義序列名:
- <generator class="sequence">
- <param name="sequence">自定義序列名</param>
- </generator>
- assigned 由應(yīng)用程序指定 id
- identity 例如 sqlserver, mysql 需要使用這種方式生成主鍵值
- native (會(huì)根據(jù)方言選擇是用 sequence 或是 identity)
例:
- -- 數(shù)據(jù)庫(kù)
- create table person
- (
- id number(10) primary key, name varchar2(10),
- age number(2),
- gender varchar2(4),
- city varchar2(10)
- );
- //實(shí)體類(lèi)
- public class Person {
- private Integer id;
- private String name;
- private Integer age;
- private String gender;
- }
- <!--person.hbm.xml(映射文件)-->
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping package="com.zyb.entity">
- <class name="Person" table="person">
- <id name="id">
- <generator class="increment"/>
- </id>
- <property name="name" />
- <property name="age" />
- <property name="gender" />
- </class>
- </hibernate-mapping>
使用 hibernate 的 api 進(jìn)行 CRUD
session.save(實(shí)體對(duì)象); 執(zhí)行 insert 來(lái)保存數(shù)據(jù)
session.delete(實(shí)體對(duì)象); 執(zhí)行 delete 來(lái)刪除數(shù)據(jù)
要先查詢(xún)、后刪除
session.get(實(shí)體類(lèi)型, 實(shí)體 id 主鍵值) ; 執(zhí)行 select 來(lái)查詢(xún)單個(gè)實(shí)體
session.update(實(shí)體對(duì)象);
在 session 打開(kāi)的過(guò)程中, 對(duì)實(shí)體的修改,***事務(wù)提交時(shí),hibernate 都會(huì)將這些修改同步到數(shù)據(jù)庫(kù),如果實(shí)體對(duì)象的數(shù)據(jù)與數(shù)據(jù)庫(kù)數(shù)據(jù)不一致,就稱(chēng)此數(shù)據(jù)變”臟”了。hibernate 會(huì)進(jìn)行臟數(shù)據(jù)檢查,事務(wù)提交時(shí),如果數(shù)據(jù)變”臟”了,hibernate才會(huì)執(zhí)行 update 查詢(xún)多個(gè)實(shí)體。
session.createQuery(hql 語(yǔ)句).list(); 返回一個(gè) List 集合
例:
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public static void main(String[] args) {
- // 1. 讀取配置文件
- Configuration cfg = new Configuration().configure();
- // 2. 創(chuàng)建SessionFactory
- SessionFactory sf = cfg.buildSessionFactory();
- // 3. Session <-> Connection (類(lèi)似于)
- Session session = sf.openSession(); // 打開(kāi)新session, 類(lèi)似 于打開(kāi)一個(gè)數(shù)據(jù)庫(kù)連接
- // 4. 進(jìn)行實(shí)體類(lèi)的增刪改查
- Person p = new Person();
- p.setName("王五"); p.setAge(19);
- p.setGender("男");
- // 開(kāi)始事務(wù)
- session.beginTransaction();
- // 參數(shù)即為實(shí)體對(duì)象
- session.save(p);
- // 提交事務(wù) rollback()回滾事務(wù)
- session.getTransaction().commit();
- // 5. 釋放資源
- session.close();
- sf.close();
- }
掌握 HibernateUtil 的工具類(lèi)
理解同一個(gè)線(xiàn)程要使用同一個(gè) session 對(duì)象的實(shí)現(xiàn)方式
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtil {
- private static Configuration cfg;
- private static SessionFactory sf;
- static {
- try {
- cfg = new Configuration().configure(); sf = cfg.buildSessionFactory();
- } catch (HibernateException e) {
- e.printStackTrace();
- }
- }
- private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
- /**
- * 同一個(gè)線(xiàn)程要使用同一個(gè)session對(duì)象
- *
- * @return
- */
- public static Session getSession() {
- Session session = threadLocal.get();
- if (session == null) {
- // ***次調(diào)用,線(xiàn)程中還沒(méi)有session,這時(shí)創(chuàng)建新的session對(duì)象
- session = sf.openSession();
- threadLocal.set(session);
- }
- return session;
- }
- public static void closeSession() {
- Session session = threadLocal.get();
- if (session != null) {
- session.close(); // 關(guān)閉session
- threadLocal.remove(); // 并從當(dāng)前線(xiàn)程清除此session
- }
- }
- }
使用 jUnit 來(lái)進(jìn)行單元測(cè)試
它是一種單元測(cè)試工具junit類(lèi)中的方法都可以作為程序入口點(diǎn), 要添加@Test注解到方法上
【本文是51CTO專(zhuān)欄作者張勇波的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)通過(guò)51CTO獲取作者授權(quán)】