hibernate教程--常用配置和核心API
一、Hibernate的常用的配置及核心API.
1.1Hibernate的常見配置:
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.1Hibernate的核心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條件查詢:
三、 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate教程--快速入门(增删
- 下一篇: hibernate教程--常用配置和核心