日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate的常用API

發布時間:2025/1/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate的常用API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hibernate的核心類和接口一共有6個,分別為:Session、SessionFactory、
Transaction、Query、Criteria和Configuration。這6個核心類和接口在任何開發中都會用到

Configuration

它主要是用于加載hibernate配置.
Configuration config=new Configuration().config(); 主要加載src下的hibernate.cfg.xml
Configuration config=new Configuration();主要加載的src下的hibernate.properties
Configuration config=new Configuration().config(核心配置文件名稱);加載指定的名稱的配置文件
問題:我們是在hibernate.cfg.xml文件中有xxx.hbm.xml文件的位置。如果我們使用的是hibernate.properties這種核心配置,它如何加載映射配置?

// 手動加載映射// config.addResource("cn/nwtxxb/domain/Customer.hbm.xml"); 直接加載映射配置文件// config.addClass(Customer.class); //這種方式它會直接在實體類所在包下查找規范映射配置文件

SessionFactory

首先SessionFactory它的獲取是通過Configuration得到。

// 1.創建Configuration來加載配置文件 Configuration config = new Configuration().configure();// 2.得到SessionFactory SessionFactory sessionFactory = config.buildSessionFactory();

SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個數據庫指定一個SessionFactory。

通過SessionFactory可以得到Session.

是從連接池中獲取一個連接。W
通過SessionFactory可以得到Session.
獲取一個與線程綁定的Session.

SessionFactory它不是輕量級的,不要頻繁創建關閉它。在一個項目中有一個SessionFactory就可以,通過SessionFactory來獲取Session進行操作。
問題:怎樣可以保證在一個項目中所使用的SessionFactory是同一個?

public class HibernateUtils {private static Configuration config;private static SessionFactory sessionFactory;static{config=new Configuration().configure();sessionFactory=config.buildSessionFactory();}public static Session openSession(){return sessionFactory.openSession();} }

SessionFactory內部還維護了一個連接池,如果我們要想使用c3p0連接池,應該怎樣處理?

  • 我們要導入c3p0的相關jar包
    在hibernate/lib/options下有關于c3p0連接池jar包

  • 在hibernate.cfg.xml文件中配置c3p0連接
    可以查看etc/hibernate.properties中關于c3p0的配置

  • <!-- 設置連接提供者 --> <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!-- c3p0連接池的配置 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 最大連接池 --> <property name="hibernate.c3p0.min_size">5</property> <!-- 最小連接數 --> <property name="hibernate.c3p0.timeout">120</property> <!-- 超時 --> <property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 空閑連接 -->

    Session

    Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。
    問題:我們如何解決session的安全問題?
    我們只需要在方法內部來使用Session就可以。

    問題:Session如何獲取到?
    SessionFactory.openSession() ; 相當于直接通過SessionFactory創建一個新的Session,使用完成后要手動調用close來關閉。
    SessionFactory.getCurrentSession(); 獲取一個與線程綁定的Session,當我們提交或事務回滾后會自動關閉。
    Session常用的方法:
    save 保存對象
    update 修改操作
    delete刪除
    get/load 根據id進行查詢
    savenOrUpdate 執行save或update操作
    createQuery()獲取一個Query對象
    CreateSQLQUery()獲取一個可以操作sql的SQLQuery對象
    createCriteria() 獲取一個Criteria它可以完成條件查詢

    Transaction

    Transaction接口主要用于管理事務,它是hibernate的事務接口,對底層的事務進行了封裝。使用它可以進行事務操作。
    commit 事務提交
    rollback 事務回滾

    問題:如果獲取一個Transaction對象
    Session.beginTransaction();

    問題:如果在程序中沒有開啟事務,是否存在事務?
    有事務,session的每一個操作就會開啟一個事務。

    默認情況下事務是不會自動提交的。

    <!-- 用于設置事務提交方式 --><property name="hibernate.connection.autocommit">false</property>

    設置事務自動提交.

    <!-- 用于設置事務提交方式 --><property name="hibernate.connection.autocommit">true</property>

    Query

    Query接口讓你方便地對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。Query經常被用來綁定查詢參數、限制查詢記錄數量,并最終執行查詢操作。
    通過Query主要完成查詢操作.
    我們通過Query可以執行hql語句.
    Query query=Session.createQuery(hql);
    下面這個可以執行sql語句
    SQLQUery sqlQuery=Session.createSQLQuery(sql);

    SQLQuery是Query的子.

    查詢所有操作—使用HQL

    public class HibernateTest3 {// 使用hql完成查詢所有操作@Testpublic void test1() {Session session = HibernateUtils.openSession();Query query = session.createQuery("from Customer");// from后面是類名List<Customer> list = query.list();System.out.println(list);session.close();} }

    分頁查詢

    // 分頁查詢 一頁顯示10條 要得到第二頁數據 @Test public void test3() {Session session = HibernateUtils.openSession();session.beginTransaction();// 一頁顯示10條 要得到第二頁數據Query query = session.createQuery("from Customer");query.setFirstResult(10); // 開始位置query.setMaxResults(10); // 本次查詢結果回顯的條數List<Customer> list = query.list();System.out.println(list);session.getTransaction().commit();session.close(); }

    查詢指定列信息

    // 查詢指定列信息 @Test public void test4() {Session session = HibernateUtils.openSession();session.beginTransaction();// Query query = session.createQuery("select name,address from// Customer"); //這時我們得到的不在是Customer對象,而是Object[]// List<Object[]> list = query.list();Query query = session.createQuery("select new Customer(name,address) from Customer");List<Customer> list = query.list();// 我們可不可以得到List<Customer>,我們要想得到這個結果,可以使用hibernate中投影查詢。我們只需要在Customer類中提供name與address做為參數的構造方法System.out.println(list);session.getTransaction().commit();session.close(); }

    Select name ,address from Customer; 得到的是List< Object[]>結果
    要想得到List< Customer>結果
    1. 在Customer類中生成以name,address為參數的構造,注意,無參數構造也要有。
    2. Select new Customer(name,address) from Customer;

    條件查詢

    可以使用where關鍵字

    // 條件查詢 @Test public void test5() {Session session = HibernateUtils.openSession();session.beginTransaction();// 查詢name=姓名0的信息// Query query = session.createQuery("from Customer where name=?");// //無名稱參數Query query = session.createQuery("from Customer where name=:myname"); // 有名稱參數// 要對參數進行賦值// query.setParameter(0, "姓名0");// 對有名稱參數進行賦值query.setParameter("myname", "姓名0");// List<Customer> list = query.list();// System.out.println(list);// 如果能保證結果就是唯一的,那么可以使用Customer c = (Customer) query.uniqueResult();System.out.println(c);session.getTransaction().commit();session.close(); }

    無名稱參數 from Customer where name=?
    對其進行賦值 query.setParameter(0,”張三”)

    有名稱參數 from Customer where name=:myname;
    對其進行賦值 query.setParameter(“myname”,”李四”);

    如果查詢結果可以保證就是唯一 的,我們可以使用
    query. uniqueResult()來得到一個單獨對象.

    執行本地SQL

    要想執行本地sql

    SQLQuery sqlQuery=session.createSqlQuery(String sql);

    使用addEntity方法來將結果封裝到指定的對象中,如果不封裝,得到的是List< Object>
    如果sql中有參數,我們使用setParameter方法完成參數傳遞。
    如果結果就是一個可以使用uniqueResult()來得到一個單獨對象。

    // 執行本地sql----查詢全部 @Test public void test6() {Session session = HibernateUtils.openSession();session.beginTransaction();// 執行select * from t_customer;SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");// List<Object[]> list = sqlQuery.list();// System.out.println(list);// 想要將結果封裝到Customer對象中sqlQuery.addEntity(Customer.class);List<Customer> list = sqlQuery.list();System.out.println(list);session.getTransaction().commit();session.close(); } // 執行本地sql----條件查詢 @Test public void test7() {Session session = HibernateUtils.openSession();session.beginTransaction();// 執行select * from t_customer where name=?;SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer where name=?");// 對參數進行賦值sqlQuery.setParameter(0, "姓名1");// 想要將結果封裝到Customer對象中sqlQuery.addEntity(Customer.class);// List<Customer> list = sqlQuery.list();// System.out.println(list);Customer c = (Customer) sqlQuery.uniqueResult();System.out.println(c);session.getTransaction().commit();session.close(); }

    Criteria

    Criteria接口與Query接口非常類似,允許創建并執行面向對象的標準化查詢。值得注意的是Criteria接口也是輕量級的,它不能在Session之外使用。

    首先我想使用Criteria,必須得到Criteria
    Criteria criteria=Session.createCriteria()

    // 測試Criteria @Test public void test8() {Session session = HibernateUtils.openSession();session.beginTransaction();// 得到CriteriaCriteria criteria = session.createCriteria(Customer.class);// 查詢所有// List<Customer> list = criteria.list();// System.out.println(list);// 分頁查詢// criteria.setFirstResult(firstResult)// criteria.setMaxResults(maxResults)// 多條件查詢// 1.查詢name='姓名1'//criteria.add(Restrictions.eq("name", "姓名1")); // where name='姓名1';// 2.查詢address='上海'//criteria.add(Restrictions.eq("address", "上海"));//Customer c = (Customer) criteria.uniqueResult();//System.out.println(c);//查詢name='姓名1' 或者 address='上海' criteria.add(Restrictions.or(Restrictions.eq("name", "姓名1"),Restrictions.eq("address","上海")));List<Customer> list = criteria.list();System.out.println(list);session.getTransaction().commit();session.close();}

    查詢所有操作
    Session.createCriteria(實體類.class)得到一個Criteria對象,調用list查詢所有
    分頁操作與query的方法一樣
    setFirstResult() setMaxResults()
    條件查詢

    criteria.add(Restrictions.eq(“name”,”xxxx”));
    criteria.add(Restrictions.or(Restricitons.eq(),Restrictions.list()…..))

    我們使用Criteria可以更加面向對象去操作,它非常適合進行多條件組合查詢。

    總結

    以上是生活随笔為你收集整理的Hibernate的常用API的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。