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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hibernate教程--常用配置和核心API详解

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate教程--常用配置和核心API详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Hibernate的常用的配置及核心API.

1.1?Hibernate的常見配置:

1.1.1、核心配置:

核心配置有兩種方式進行配置:

?1)屬性文件的配置:

* hibernate.properties

* 格式:

* key=value

?hibernate.connection.driver_class=com.mysql.jdbc.Driver

?注意:沒有辦法在核心配置文件中加載映射文件.(必須手動編碼的方式進行加載.)

2)XML格式文件配置:

* hibernate.cfg.xml

* 格式:

<property name="hibernate.connection.username">root</property>

3)核心配置中:

1.必須的配置:

* 連接數據庫4個基本參數:

hibernate.connection.driver_class ?連接數據庫驅動程序

hibernate.connection.url ??連接數據庫URL

hibernate.connection.username ?數據庫用戶名

hibernate.connection.password ??數據庫密碼

* Hibernate的方言:

hibernate.dialect ??操作數據庫方言

2.可選的配置:

hibernate.show_sql ?true 在控制臺上輸出SQL語句

hibernate.format_sql ?true ?格式化控制臺輸出的SQL語句

hibernate.connection.autocommit ?true 事務是否自動提交

hibernate.hbm2ddl.autocreate/create-drop/update/validate

* create:每次執行的時候,創建一個新的表.(如果以前有該表,將該表刪除重新創建.) 一般測試的時候的使用.

* create-drop:每次執行的時候,創建一個新的表,程序執行結束后將這個表,刪除掉了.一般測試的時候使用.

* update:如果數據庫中沒有表,創建一個新的表,如果有了,直接使用這個表.可以更新表的結構.

* validate:會使用原有的表.完成校驗.校驗映射文件與表中配置的字段是否一致.不一致報錯.

3.映射的配置:

* 在核心配置文件中加載映射文件:

?<mapping resource="cn/itcast/hibernate3/demo1/Customer.hbm.xml" />

* 使用手動編碼的方式進行加載 :

核心配置實例

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///hibernate3_test</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123</property><!-- Hibernate的方言 --><!-- 生成底層SQL不同的 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 可選的屬性 --><!-- 顯示SQL --><property name="hibernate.show_sql">true</property><!-- 格式化SQL --><property name="hibernate.format_sql">true</property><property name="hibernate.connection.autocommit">false</property><!-- hbm:映射 to DDL: create drop alter --><property name="hibernate.hbm2ddl.auto">update</property><!-- C3P0連接池設定--><!-- 使用c3po連接池 配置連接池提供的供應商--><property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property><!--在連接池中可用的數據庫連接的最少數目 --><property name="c3p0.min_size">5</property><!--在連接池中所有數據庫連接的最大數目 --><property name="c3p0.max_size">20</property><!--設定數據庫連接的過期時間,以秒為單位,如果連接池中的某個數據庫連接處于空閑狀態的時間超過了timeout時間,就會從連接池中清除 --><property name="c3p0.timeout">120</property><!--每3000秒檢查所有連接池中的空閑連接 以秒為單位--><property name="c3p0.idle_test_period">3000</property><!-- 通知Hibernate加載那些映射文件 --><mapping resource="com/sihai/hibernate3/demo1/Customer.hbm.xml" /></session-factory> </hibernate-configuration>

1.1.2、映射文件的配置:

ORM:對象和關系映射.

* 配置Java對象與表映射.

* 配置類與表的映射:

* name:類的全路徑:

* table:表的名稱:(可以省略的.使用類的名稱作為表名.)

<class name="com.sihai.hibernate3.demo1.Order"?table=”orders”>

?配置普通屬性與字段映射:

<property name="name" column="name" type="string"?length=”20”/>

type:三種寫法

* Java類型:java.lang.String

* Hibernate類型:string

* SQL類型:不能直接使用type屬性,需要子標簽<column>

* <column name="name" sql-type="varchar(20)"/>

配置唯一標識與主鍵映射:

* 一個表中只有一個主鍵的形式:

<id name=”id”?column=”id”>

* 生成策略:

* 一個表對應多個主鍵形式:(復合主鍵:)---了解.

* <composite-id></composite-id>

* 關聯關系:

* 命名SQL:

<query name="findAll">from Customer</query><sql-query name="sqlFindAll">select * from customer</sql-query>

<?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><!-- 建立類與表的映射 --><!-- class標簽:用于映射類與表的關系 name :類的全路徑 table:表名稱 --><class name="com.sihai.hibernate3.demo1.Customer" table="customer"><!-- 建立類中屬性與表中的字段映射 --><!-- 唯一標識 --><!-- 使用id的標簽 配置唯一屬性 --><!-- 在<id>標簽中配置一個主鍵的生成策略. --><id name="id" column="id"><generator class="assigned"/></id><!-- 普通屬性 --><!-- property標簽:映射類中的普通屬性 name:類中的屬性名稱, column:表中字段名稱 --><!-- type:三種寫法* Java類型 :java.lang.String* Hibernate類型 :string* SQL類型 :不能直接使用type屬性,需要子標簽<column>* <column name="name" sql-type="varchar(20)"/>--><property name="name" column="name" type="string" length="20"/><property name="age" column="age"/></class></hibernate-mapping>

二、 Hibernate的核心API:

2.1?Hibernate的核心API:

Configuration:負責管理 Hibernate 的配置信息

2.1.1.加載核心配置文件:

核心配置有兩種:

* hibernate.properties:

* 加載:

* Configuration configuration = new Configuration();

* hibernate.cfg.xml:

* 加載:

* Configuration configuration = new Configuration().configure();

2.1.2.加載映射文件:

* 第一種寫法:

* configuration.addResource("cn/itcast/hibernate3/demo1/Customer.hbm.xml");

* 第二種寫法:(要求:映射文件名稱要規范,類與映射在同一個包下)

* configuration.addClass(Customer.class);

SessionFactory:Session工廠.

Configuration對象根據當前的配置信息生成 SessionFactory對象

SessionFactory 對象中保存了當前的數據庫配置信息和所有映射關系以及預定義的SQL語句

SessionFactory 對象是線程安全的

SessionFactory還負責維護Hibernate的二級緩存

SessionFactory對象根據數據庫信息,維護連接池,創建Session(相當于Connection)對象.

抽取工具類:

public class HibernateUtils {private static Configuration configuration;private static SessionFactory sessionFactory;static{configuration = new Configuration().configure();sessionFactory = configuration.buildSessionFactory();}public static Session openSession(){return sessionFactory.openSession();}public static void main(String[] args) {openSession();}}

2.2.3在Hibernate中使用c3p0連接池:

* 引入c3p0的jar包

* 在核心配置中添加一段配置:

<!-- C3P0連接池設定--><!-- 使用c3po連接池 配置連接池提供的供應商--><property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property><!--在連接池中可用的數據庫連接的最少數目 --><property name="c3p0.min_size">5</property><!--在連接池中所有數據庫連接的最大數目 --><property name="c3p0.max_size">20</property><!--設定數據庫連接的過期時間,以秒為單位,如果連接池中的某個數據庫連接處于空閑狀態的時間超過了timeout時間,就會從連接池中清除 --><property name="c3p0.timeout">120</property><!--每3000秒檢查所有連接池中的空閑連接 以秒為單位--><property name="c3p0.idle_test_period">3000</property>

2.2.4、Session:

相當于 JDBC的 Connection

Session 是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心

Session是線程不安全的

所有持久化對象必須在 session 的管理下才可以進行持久化操作

Session 對象有一個一級緩存,顯式執行 flush 之前,所有的持久化操作的數據都緩存在 session 對象處

持久化類與 Session 關聯起來后就具有了持久化的能力

Session維護了Hiberante一級緩存.

save()/persist():添加.

update() :修改

saveOrUpdate() :增加和修改對象

delete() ?:刪除對象

get()/load() ?:根據主鍵查詢

createQuery() :創建一個Query接口,編寫HQL語句

createSQLQuery() :創建一個SQLQuery接口,編寫SQL語句數據庫操作對象

createCriteria() ?:返回一個Criteria接口.條件查詢

?

2.2.5、Transaction:

獲得:

Transaction tx = session.beginTransaction();

常用方法:

commit():提交相關聯的session實例

rollback():撤銷事務操作

wasCommitted():檢查事務是否提交

?

如果沒有開啟事務,那么每個Session的操作,都相當于一個獨立的事務

2.2.6、Query

Query代表面向對象的一個Hibernate查詢操作

session.createQuery 接受一個HQL語句

HQL是Hibernate Query Language縮寫, 語法很像SQL語法,但是完全面向對象的

2.2.7、Criteria

Criteria條件查詢:

package com.sihai.hibernate3.demo1;import java.util.List;import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Restrictions; import org.junit.Test;/*** Hibernate入門案例的測試:* @author sihai**/ public class HibernateTest1 {@Test// 查詢所有記錄:SQLpublic void demo7(){// 1.加載核心配置文件Configuration configuration = new Configuration().configure();// 2.構建Session工廠SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通過工廠創建SessionSession session = sessionFactory.openSession();// 4.開啟事務Transaction tx = session.beginTransaction();// 5.操作// 查詢所有:SQL/*SQLQuery query = session.createSQLQuery("select * from customer");List<Object[]> list = query.list();for (Object[] objs : list) {System.out.println(Arrays.toString(objs));}*/SQLQuery query = session.createSQLQuery("select * from customer");query.addEntity(Customer.class);List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();}@Test// 查詢所有:QBCpublic void demo6(){// 1.加載核心配置文件Configuration configuration = new Configuration().configure();// 2.構建Session工廠SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通過工廠創建SessionSession session = sessionFactory.openSession();// 4.開啟事務Transaction tx = session.beginTransaction();// 5.操作:// 查詢所有 :QBC./*Criteria criteria = session.createCriteria(Customer.class);List<Customer> list = criteria.list();*/Criteria criteria = session.createCriteria(Customer.class);criteria.add(Restrictions.eq("name", "sihai"));List<Customer> list = criteria.list();for (Customer customer : list) {System.out.println(customer);}// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();}@Test// 查詢所有:HQL.// HQL:Hibernate Query Language.Hibernate查詢語言.面向對象的查詢.public void demo5(){// 1.加載核心配置文件Configuration configuration = new Configuration().configure();// 手動編碼加載映射文件:// configuration.addResource("com/sihai/hibernate3/demo1/Customer.hbm.xml");// configuration.addClass(Customer.class);// 2.構建Session工廠SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通過工廠創建SessionSession session = sessionFactory.openSession();// 4.開啟事務Transaction tx = session.beginTransaction(); // 5.操作// 1.查詢所有的客戶/*Query query = session.createQuery("from Customer");List<Customer> list = query.list();*/// 2.按名稱查詢/*Query query = session.createQuery("from Customer where name = ?");query.setParameter(0, "sihai");*/Query query = session.createQuery("from Customer where name = :aaa");query.setParameter("aaa", "sihai");List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();}@Test// 刪除記錄public void demo4(){// 1.加載核心配置文件Configuration configuration = new Configuration().configure();// 2.構建Session工廠SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通過工廠創建SessionSession session = sessionFactory.openSession();// 4.開啟事務Transaction tx = session.beginTransaction(); // 5.操作// 刪除記錄有兩種方式:// 5.1手動創建對象的方式/*Customer customer = new Customer();customer.setId(2);session.delete(customer);*/// 5.2先查詢在刪除的方式Customer customer = (Customer)session.get(Customer.class, 1);session.delete(customer);// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();}@Test// 修改記錄public void demo3(){// 1.加載核心配置文件Configuration configuration = new Configuration().configure();// 2.構建Session工廠SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通過工廠創建SessionSession session = sessionFactory.openSession();// 4.開啟事務Transaction tx = session.beginTransaction(); // 5.操作:// 修改記錄:兩種方式可以進行修改.// 5.1手動創建對象的方式/*Customer customer = new Customer();customer.setId(2);customer.setName("sihai");session.update(customer);*/// 5.2先查詢在修改的方式Customer customer = (Customer) session.get(Customer.class, 1);customer.setName("sihai");session.update(customer);// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();}@Test// 按id進行查詢// get和load方法區別public void demo2(){// 1.加載核心配置文件Configuration configuration = new Configuration().configure();// 2.構建Session工廠SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通過工廠創建SessionSession session = sessionFactory.openSession();// 4.開啟事務Transaction tx = session.beginTransaction();// 5.操作// 根據id進行查詢:// get方法進行查詢Customer customer = (Customer) session.get(Customer.class, 100); // 馬上發生一條SQL進行查詢System.out.println(customer);// load方法進行查詢//Customer customer = (Customer) session.load(Customer.class, 100); // 沒有發送SQL//System.out.println(customer);// 發送SQL.// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();}@Test// 保存記錄public void demo1(){// 1.Hiberante框架加載核心配置文件(有數據庫連接信息)Configuration configuration = new Configuration().configure();// 2.創建一個SessionFactory.(獲得Session--相當連接對象)SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.獲得Session對象.Session session = sessionFactory.openSession();// 4.默認的情況下,事務是不自動提交.Transaction tx = session.beginTransaction();// 5.業務邏輯操作// 向數據庫中插入一條記錄:Customer customer = new Customer();customer.setName("sihai");customer.setAge(38);session.save(customer);// 6.事務提交tx.commit();// 7.釋放資源session.close();sessionFactory.close();} }

三、 Hibernate中的持久化類:

持久化類:實體類 + 映射文件.

3.1、持久化類是有編寫規范:

1、提供一個無參數 public訪問控制符的構造器:用到反射.

2、提供一個標識屬性,映射數據表主鍵字段:

3、java區分兩個對象是否是同一個使用 地址.

4、 數據庫區分兩條記錄是否一致:使用 ?主鍵.

5、 Hibernate中區分持久化對象是否是同一個,根據唯一標識:

6、 所有屬性提供public訪問控制符的 set ?get 方法:框架中存值和取值的時候使用.

7、 標識屬性應盡量使用基本數據類型的包裝類型

8、 持久化類盡量不要使用final進行修飾:

?用final修飾的類是不能被繼承.無法生成代理對象.(延遲加載的時候返回代理對象.延遲加載就失效.)

9、 盡量要Hibernate自己去維護主鍵:

?3.2、主鍵的生成策略:

1、 increment:自動增長.適合 short int long...不是使用數據庫的自動增長機制.使用Hibernate框架提供的自動增長方式.

2、 select max(id) from 表; 在最大值的基礎上+1.(多線程的問題.)在集群下不要使用

3、identity:自動增長.適合 short int long...采用數據庫的自動增長機制.不適合于Oracle數據庫.

4、 sequence:序列.適用于 short int long ... 應用在Oracle上 .

5、 uuid:適用于字符串類型的主鍵.采用隨機的字符串作為主鍵.

6、 native:本地策略.底層數據庫不同.自動選擇適用identity 還是 sequence.

7、 assigned:Hibernate框架不維護主鍵,主鍵由程序自動生成.

8、 foreign:主鍵的外來的.(應用在多表一對一的關系.)

package com.sihai.hibernate3.demo1;import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.sihai.utils.HibernateUtils;/*** 主鍵生成策略* @author sihai**/ public class HibernateTest3 {@Test// 演示increment的問題:public void demo1(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = new Customer();customer.setName("芙蓉");customer.setAge(26);session.save(customer);tx.commit();session.close();}@Test// 演示increment的問題:public void demo2(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = new Customer();// customer.setId(100);customer.setName("sihai");customer.setAge(26);session.save(customer);tx.commit();session.close();} }

總結

以上是生活随笔為你收集整理的hibernate教程--常用配置和核心API详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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