1. 程式人生 > 實用技巧 >Hibernate-框架基礎

Hibernate-框架基礎

Hibernate-基礎


目錄


1.常用介面

  • configuration介面

    用於載入Hibernate的配置檔案及啟動Hibernate,建立SessionFactory例項。

  • SessionFactory介面

    用於對Hibernate進行初始化操作。通常一個專案只有一個SessionFactory物件,對應一個數據庫。

1.1、Session介面

操作資料庫的核心物件,負責管理所有與持久化相關的(CRUD)操作。

Session中的常用方法:

save() 用於執行新增物件操作
update() 用於執行修改物件操作
saveOrUpdate() 用於執行新增或修改物件操作
delete() 用於執行刪除物件操作
get() 根據主鍵查詢資料
load() 根據主鍵查詢資料
createQuery() 用於資料庫操作物件
createSQLQuery() 用於資料庫操作物件
  • Transaction介面

    用於對事務的相關操作,如:事務提交、回滾等。

  • Query介面

    用於對資料庫的查詢操作。其中,面向物件查詢語言HQL通過此介面實現。

  • Criteria介面

    用於對資料的查詢操作。為Hibernate的QBC查詢方式提供了方法。

2.hibernate例項狀態

  • 瞬時態(Transient)
  • 持久態(Persistent)
  • 託管態(Detached)

3.hibernate配置


Hibernate主要通過:

  • 持久化類(*.java)

  • Hibernate對映檔案(*.hbm.xml)

  • Hibernate配置檔案(*.cfg.xml)

與資料庫進行互動。

3.1、持久化類

持久化類是操作物件,用於描述資料表的結構。

package model;
/**
 * 學生持久化類
 */
public class Student {
	private Integer id;			//學號
	private String name;		//姓名
	private Integer age;		//年齡
	private boolean sex;		//性別
	private String description;	//描述資訊
	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;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public boolean isSex() {
		return sex;
	}
	public void setSex(boolean sex) {
		this.sex = sex;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
}
3.2、對映檔案

對映檔案指持久化類與資料表之間的對映關係。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="model.Student" table="tb_student_update">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" length="50" not-null="true"/>
		<property name="age"/>
		<property name="sex">
			<column name="sex" sql-type="int"/>
		</property>
		<property name="description" type="text"/>
	</class>
</hibernate-mapping>
3.3、配置檔案

配置檔案用於指定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>
	<!-- 資料庫連線的URL -->
	<property name="connection.url">
		jdbc:mysql://localhost:3306/db_database13
	</property>
	<!-- 資料庫連線使用者名稱 -->
	<property name="connection.username">root</property>
	<!-- 資料庫連線密碼 -->
	<property name="connection.password"></property>
	<!-- Hibernate方言 -->
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<!-- 列印SQL語句 -->
	<property name="show_sql">true</property>
	<property name="format_sql">false</property>
	
	<!-- 對對映檔案中指定的各表自動建表結構。update:當資料表存在且與對映檔案匹配時不建表,否則重新建表 -->
	<property name="hibernate.hbm2ddl.auto">update</property>
	
	<!-- 開啟二級快取 -->
	<property name="hibernate.cache.use_second_level_cache">
		true
	</property>
	<!-- 指定快取產品提供商 -->
	<property name="hibernate.cache.region.factory_class">
		org.hibernate.cache.ehcache.EhCacheRegionFactory
	</property>

	<!-- 對映檔案  -->
	<mapping resource="employee/Employee.hbm.xml" />
	<mapping resource="model/Medicine.hbm.xml" />
	<mapping resource="model/Customer.hbm.xml" />
	<mapping resource="model/Student.hbm.xml" />

	<!-- 指定二級快取應用到的實體物件 -->
	<class-cache class="model.Medicine" usage="read-write" />

</session-factory>
</hibernate-configuration>
3.4、hibernate初始化
  1. 呼叫Configuration物件的configure()方法,載入hibernate配置資訊。
  2. 呼叫Configuration物件的buildSessionFactory()方法,建立SessionFactory物件。
  3. 呼叫SessionFactory物件的openSession()方法,獲取Session物件。
  4. 呼叫Session物件的close()方法,關閉Session。
package util;
/*
 * 初始化類,用於建立SessionFactory物件,該物件的建立比較耗時,一般只建立一次
 * */
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	private static SessionFactory sessionFactory = null; // SessionFactory物件
	// 靜態塊
	static {
		try {
			Configuration cfg = new Configuration().configure(); // 載入Hibernate配置檔案
			sessionFactory = cfg
					.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties())
							.buildServiceRegistry());
		} catch (Exception e) {
			System.err.println("建立會話工廠失敗");
			e.printStackTrace();
		}
	}

	/**
	 * 獲取Session
	 * 
	 * @return Session
	 * @throws HibernateException
	 */
	public static Session getSession() throws HibernateException {
		Session session = (Session) threadLocal.get();
		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}
		return session;
	}

	/**
	 * 重建會話工廠
	 */
	public static void rebuildSessionFactory() {
		try {
			Configuration cfg = new Configuration().configure(); // 載入Hibernate配置檔案
			sessionFactory = cfg
					.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties())
							.buildServiceRegistry());
		} catch (Exception e) {
			System.err.println("建立會話工廠失敗");
			e.printStackTrace();
		}
	}

	/**
	 * 獲取SessionFactory物件
	 * 
	 * @return SessionFactory物件
	 */
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	/**
	 * 關閉Session
	 * 
	 * @throws HibernateException
	 */
	public static void closeSession() throws HibernateException {
		Session session = (Session) threadLocal.get();
		threadLocal.set(null);
		if (session != null) {
			session.close(); // 關閉Session
		}
	}
}

4.hibernate持久化


4.1、新增資料
  • save()方法,返回生成的標識。

public Serializable save(Object object)throws HibernateException

4.2、查詢資料
  • get()方法,返回實際物件。
  • load()方法,返回物件的代理,只有在被呼叫時,hibernate才發出SQL語句查詢物件。

public Object get(Class class,Serializable id)throws HibernateException
public Object load(Class class,Serializable id)throws HibernateException

4.3、刪除資料
  • delete()方法。如要刪除的物件不在Session管理中,先載入物件,使其處於持久態,然後再刪除物件。

public void delete(Object object)throws HibernateException

4.4、修改資料
  • 自動更新:
  • 手動更新:update()方法。

public void update(Object object)throws HibernateException

5.hibernate事務管理


try{
    //獲取Session
    session = Hibernate.getSession();
    //開啟事務
    session.beginTransaction();
    ...
    /*持久化操作*/
    ...
    //提交事務
    session.getTransaction().commit();
}catch(Exception e){
    e.printStackTrace();
    //事務回滾
    session.getTransaction().rollback();
}finally{
    //關閉session
    session.close();
}

6.HQL基本語法


HQL是面向物件查詢語言,HQL語句對大小寫敏感。

select "屬性名" from "物件"
where "條件"
group by "屬性名" having "條件"
order by "屬性名" desc/asc

例:select * from User u where u.id>5 order by u.id asc


6.1、實體物件查詢
  • 實體物件查詢

    • Query query=session.createQuery("from User");
      
  • 條件查詢及別名使用

    • Query query=session.createQuery("from User u where u.id = 1");
      
6.1、HQL語句動態賦值查詢
  • 按引數位置查詢

在HQL語句中使用"?"定義引數位置,通過Query物件的setXxx()方法進行賦值。

String hql="from User u where u.name=?"
Query query=session.createQuery(hql);
query.setString(0,"haha");
list=query.list();
  • 按引數名稱查詢

在HQL語句中定義引數名稱(引數名稱由:和自定義引數名組合),通過Query物件的setParameter()方法進行賦值。

String hql="from User u where u.name=:name"
Query query=session.createQuery(hql);
query.setParameter("name","haha");
list=query.list();
6.2、HQL語句動態例項查詢
  • 投影查詢:只對需要的屬性查詢
String hql="select id,name from User"
  • 動態例項查詢:投影查詢返回的是Object型別陣列,失去了物件狀態,破壞了資料的封裝性。將檢索出的資料重新封裝到一個實體的例項中,就是動態例項查詢。
String hql="select new User(id,name) from User"
6.3、分頁查詢

Query介面中,提供了兩個方法

  • setFirstResult(int firstResult)
    • 設定從哪個物件開始查詢,引數firstResult表示物件在查詢結果中的索引(索引從0開始)。
  • setMaxResult(int maxResult)
    • 設定一次返回多少個物件。通常與setFirstResult(int firstResult)方法結合使用。預設返回結果中的所有物件。

更新中。。。