歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

一  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