實(shí)體類的編寫規(guī)則
- 實(shí)體類中屬性私有
- 私有屬性使用公有的set get方法進(jìn)行操作
- 要求屬性中有一個(gè)值都是唯一的
- 實(shí)體類中屬性的數(shù)據(jù)類型,不建議基本數(shù)據(jù)類型,而要使用包裝類
hibernate主鍵生成策略
<!-- 設(shè)置數(shù)據(jù)表字段生成和增長(zhǎng)策略
native 生成表主鍵和自動(dòng)增長(zhǎng)-->
<generator class="native"></generator>
native:
根據(jù)底層數(shù)據(jù)庫對(duì)自動(dòng)生成表示符的能力來選擇,identity,sequence,hio三種生成器的一種,適合跨數(shù)據(jù)庫平臺(tái)開發(fā),適用于代理主鍵.
uuid: hibernate采用128位的uuid算法來生成標(biāo)識(shí)符,該算法能夠在網(wǎng)絡(luò)環(huán)境中生成唯一的字符串標(biāo)識(shí)符,該策略并不流行,因?yàn)樽址愋偷闹麈I比整數(shù)類型的主鍵占用更多的數(shù)據(jù)庫空間,適合于代理主鍵.
演示uuid
- 使用uuid,實(shí)體類中的唯一屬性是String
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name 實(shí)體類的全路徑
table 表的名稱-->
<class name="entity.User" table="user">
<!-- 配置實(shí)體類屬性和表字段一一對(duì)應(yīng)-->
<id name="id" column="id">
<!-- 設(shè)置數(shù)據(jù)表字段生成和增長(zhǎng)策略
native 生成表主鍵和自動(dòng)增長(zhǎng)-->
<generator class="uuid"></generator>
</id>
<!-- 配置其他屬性-->
<property name="name" column="name"></property>
<property name="address" column="address"></property>
</class>
</hibernate-map
實(shí)體類操作
- 添加操作
// 5. 具體操作
// uid 設(shè)置或者不設(shè)置沒有影響
User u = new User();
u.setName("靳飛飛");
u.setAddress("西安");
session.save(u);
- 根據(jù)id查詢
@Test
public void test() {
//
// 2. 創(chuàng)建sessionFactory對(duì)象
// 讀取hibernate配置文件內(nèi)容,創(chuàng)建sessionFactory
// 在過程中,根據(jù)映射關(guān)系,在配置數(shù)據(jù)庫里面將表創(chuàng)建
SessionFactory factory = HibernateFactory.getFactory();
// 3. 獲取session
Session session = factory.openSession();
// 查詢根據(jù)id
User user = session.get(User.class, 1);
System.out.println(user);
// 6. 關(guān)閉
session.close();
factory.close();
}
- 修改操作
先查詢,在修改
// 進(jìn)行操作
User user = session.get(User.class, 1);
user.setName("虎哥");
session.update(user);
transaction.commit();
使用下面這種修改方法,相當(dāng)于重新對(duì)所有的屬性改變,如果沒有設(shè)置,相當(dāng)于是null;
User u = new User();
u.setId(1);
u.setName("飛飛飛");
session.update(u);
- 刪除操作
// 操作
User user = session.get(User.class, 2);
session.delete(user);
或者
// 操作
User user = new User();
user.setId(1);
session.delete(user);
實(shí)體類對(duì)象狀態(tài)
- 瞬時(shí)態(tài)
對(duì)象里面沒有id值,對(duì)象與session沒有關(guān)聯(lián)
User user = new User();
user.setName("戶戶");
- 持久態(tài)
對(duì)象里面有id值,對(duì)象與session有關(guān)聯(lián)
User user = session.get(User.class, 1);
- 托管態(tài)
對(duì)象有id值,對(duì)象與session沒有關(guān)聯(lián)
User u=new User();
u.setId(1);
session.saveOrUpdate()此方法在實(shí)體類為瞬時(shí)態(tài)時(shí)候做添加,托管態(tài)和持久態(tài)時(shí)候做修改
hibernate的一級(jí)緩存
- 什么是緩存?
數(shù)據(jù)存到數(shù)據(jù)庫里面(硬盤),數(shù)據(jù)庫本身是文件系統(tǒng),使用流方式操作文件效率不是很高.
(1) 把數(shù)據(jù)存到內(nèi)存里面,不需要使用流的方式,可以直接讀取內(nèi)存中的數(shù)據(jù)
(2) 把數(shù)據(jù)放到內(nèi)存中,提高讀取效率.
hibernate緩存
hibernate 框架中提供很多優(yōu)化方式,hibernate緩存你就是一個(gè)優(yōu)化方式.
hibernate緩存特點(diǎn)
- 第一類緩存 Hibernate一級(jí)緩存
a. hibernate一級(jí)緩存默認(rèn)打開
b. hibernate一級(jí)緩存使用范圍,是從session創(chuàng)建到session關(guān)閉范圍
c. hibernate一級(jí)緩存中,存儲(chǔ)數(shù)據(jù)必須持久態(tài)數(shù)據(jù). - 第二類緩存 hibernate二級(jí)緩存
a. 目前已經(jīng)不使用了,替代技術(shù)redis
b. 二級(jí)緩存默認(rèn)不是打開的,需要配置
c. 二級(jí)緩存適用范圍,是sessionFactory的范圍
驗(yàn)證一級(jí)緩存
// 進(jìn)行操作
User user = session.get(User.class, 3);
System.out.println(user);
User user1 = session.get(User.class,3);
System.out.println(user1);
第一次查詢時(shí)會(huì)發(fā)送sql語句進(jìn)行查詢
第二次查詢同樣的東西,不會(huì)在發(fā)送sql語句
一級(jí)緩存特性
- 持久態(tài)自動(dòng)更新數(shù)據(jù)
不需要寫update方法

hibernate 事務(wù)規(guī)范寫法
@Test
public void updateTest() {
SessionFactory factory = null;
Session session = null;
Transaction tx = null;
try {
// 獲取sessionFactory
factory = HibernateFactory.getFactory();
// 獲取session
session = factory.openSession();
tx = session.beginTransaction();
// 進(jìn)行操作
User user = session.get(User.class, 3);
user.setName("飛飛");
int i = 10/0;
tx.commit();
}catch (Exception e){
// 事務(wù)回滾
tx.rollback();
}finally {
// 關(guān)閉
session.close();
factory.close();
}
}
hibernate綁定session
- session類似于jdbc中的connection,
- hibernate幫忙實(shí)現(xiàn)與本地線程綁定session
- 獲取與本地線程綁定的session
(1) 在hibernate核心配置文件中配置
<!--配置本地線程綁定session-->
<property name="hibernate.current_session_context_class">thread</property>
(2) 調(diào)用sessionFactory里面的方法得到session
/**
* 獲取與本地線程綁定的session
* @return
*/
public static Session getSession(){
return factory.getCurrentSession();
}
(3) 獲取與本地線程綁定的session時(shí)候,關(guān)閉session報(bào)錯(cuò),不需要在手動(dòng)關(guān)閉session了.
query對(duì)象查詢所有記錄
- 使用query對(duì)象,不需要寫sql語句,但是寫hql語句
(1) hql:hibernate query language 提供查詢語言,這個(gè)sql語句和普通sql語句很相似.
(2) hql和sql語句的區(qū)別
- 使用sql操作表和表字段
- 使用hql 操作實(shí)體類和屬性.
查詢所有hql語句
(1) from 實(shí)體類名稱query 對(duì)象的使用
(1) 創(chuàng)建query對(duì)象
(2) 調(diào)用里面的方法
@Test
public void queryTest(){
Session session = null;
Transaction tx = null;
try{
session = HibernateFactory.getSession();
tx = session.beginTransaction();
Query query = session.createQuery("from User");
List<User> list = query.list();
for(User u:list){
System.out.println(u);
}
} catch (Exception e) {
tx.rollback();
}finally {
session.close();
}
}
- Criteria對(duì)象的使用,必須先開啟事務(wù),在獲取對(duì)象
@Test
public void testCritera() {
Session session = null;
Transaction tx = null;
try {
session = HibernateFactory.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for (User u : list) {
System.out.println(u);
}
} catch (Exception e) {
tx.rollback();
} finally {
// session.close();
}
}
- sqlquery對(duì)象的使用
sqlQuery默認(rèn)返回的是List<Object[]>
@Test
public void testSQLQuery(){
Session session = null;
Transaction tx = null;
try{
session = HibernateFactory.getSession();
// 開啟事務(wù)
tx = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from user");
List<Object[]> list = sqlQuery.list();
for(Object[] u:list){
System.out.println(Arrays.toString(u));
}
}catch (Exception e){
tx.rollback();
}finally {
}
}
讓list()直接返回User對(duì)象
@Test
public void testSQLQuery(){
Session session = null;
Transaction tx = null;
try{
session = HibernateFactory.getSession();
// 開啟事務(wù)
tx = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from user");
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();
for(User u:list){
System.out.println(u);
}
}catch (Exception e){
tx.rollback();
}finally {
session.close();
}
}