歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Hibernate概念深入和CURD(增刪改查)

Hibernate概念深入和CURD(增刪改查)

日期:2017/3/1 10:49:05   编辑:Linux編程

一 Hibernate開發流程

1.hibernate需要的三個條件

(1)domian類

(2)映射文件 User.hbm.xml

(3)創建表

2.開發流程

(1)站在面向對象的角度

由domain Object---àmapping ---àdb(官方推薦)

(2)站在關系模型的角度

由DB開始,用工具生成mapping和Domain object(使用較多)

(3)從映射文件開始寫(用的較少)

注:以上任何兩個都可以互相生成

二 開發中的細節

1.Domian Object限制(實體類對象限制)

(1)默認的構造是必須的,如果寫了一個有參數的構造,必須要寫上無參構造

原因是Hibernate會用反射的機制生成一個class對象,創建對象的時候用newInstance()方法去創建,用的是無參構造,例:

Class clazz = User.class;

User user = clazz.newInstance();

(2)有無意義的標識符id(主鍵)(可選)

在實際中用到,如果有id,會充分發揮它的特性

(3)非final的,對懶加載有影響(可選)

懶加載內部會自動的創建一個子類,如果是final,懶加載會有影響

2.映射文件 --- 把類映射成二維表

(1)一個java類在映射文件中用一對<class>標簽表示,如果有多個java類,那麼在映射文件中應該有多個<class>標簽

(2)對於<class>標簽來說,<clas>標簽可以放到一個映射文件中,可以放到多個映射文件中

(3)映射文件的命名規范:類名.hbm.xml

三 代碼編寫

(1)HibernateUitl 工具類 -- 提取和數據庫連接的寶貴資源

public final class HibernateUtil {

private static SessionFactory sessionFactory;

private HibernateUtil() {

}

//耗時資源放到代碼塊中,只執行一次

static {

Configuration cfg = new Configuration();

cfg.configure();// 用來完成Hibernate的初始化---用來讀取配置文件中的信息,可以指定配置文件的位置

// cfg.configure("");

// 得到sessionFactoroy的工廠對象,相當於DirverManager,

sessionFactory = cfg.buildSessionFactory();

}

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

public static Session getSession() {

return sessionFactory.openSession();

}

}

(2)添加用戶 --- 使用上面的工具類優化代碼

public static void addUser1(User user) {

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();// 開啟事務

session.save(user);

tx.commit();

} finally {

// 使資源得到釋放

if (session != null) {

session.close();

}

}

}

(3)查詢用戶

//查 ---查詢不用開啟事務,不修改數據庫中的東西

public static User getUser(int id){

Session session = null;

try {

session = HibernateUtil.getSession();

Class clazz = User.class;//通過映射文件查找class對象

//User user = (User) session.load(clazz, id);//懶加載,運行後沒有立刻訪問相應的數據庫,返回的是代理對象,永遠不可能為空,當第一次使用該對象的時候,才去訪問

User user = (User) session.get(clazz, id);

return user;

} finally {

// 使資源得到釋放

if (session != null) {

session.close();

}

}

}

四 session接口中的方法

Transation beginTransaction() 開啟事務

Void clear() 清除緩存

Connection close() 關閉session釋放資源的方法

Session只能按id查詢,所以有了:

Criteria createCirteria(Class persistentClass) 查詢所有...

Query createQuert(String queryString)

void delete(Object object)

Object load(Class theClass,Serializable id) 懶加載,當調用的時候,不是立刻去查數據庫,只有第一次使用的時候才去查

Void persist(Object object) 保存對象

Void save(Object object) 保存對象 兩者不同是:

在沒有開啟事務的時候,persist插入的語句沒有做,而save插入的操作確做了,可是回滾了

五 對象狀態

1.瞬時狀態:自己new出來的對象就是瞬時狀態

User user =new User() ;

user是一個瞬時對象,在數據庫的表中沒有記錄和瞬時對象想對應的,也不管理瞬時 對象

當調用 session.save(user)方法之後,為持久狀態

2.持久狀態:數據庫表中有記錄和這個對象相對應的,當持久態的對象發生變化的時候,session中也變化

3.脫管狀態:數據庫的表中有一條記錄和對象相對應的,並且這個對象不被session管理,但是在數據庫表中有記錄和它相對應,當對象再發生變化的時不會改變

當對象處於脫管狀態的時候,又更新了數據庫中的值,要調用更新的方法來通知Hibernate

Copyright © Linux教程網 All Rights Reserved