Hibernate-框架基礎
阿新 • • 發佈:2021-01-09
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初始化
- 呼叫Configuration物件的configure()方法,載入hibernate配置資訊。
- 呼叫Configuration物件的buildSessionFactory()方法,建立SessionFactory物件。
- 呼叫SessionFactory物件的openSession()方法,獲取Session物件。
- 呼叫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)方法結合使用。預設返回結果中的所有物件。
更新中。。。