hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等...
核心API
Configuration
描述的是一個封裝所有配置信息的對象
1.加載hibernate.properties(非主流,早期)
Configuration conf = new Configuration();
conf.addResource("cn/itcast/h3/helloworld/vo/UserModel.hbm.xml");
2.加載hibernate.cfg.xml(主流)
Configuration conf = new Configuration().configure();
SessionFactory
描述的是創建Session對象的工廠類,它需要通過Configuration對象創建得到
SessionFactory sf = conf.buildSessionFactory();
線程安全的
Session
描述的是一次應用程序與數據庫間進行數據交換的對象
Session對象描述的是一次操作過程,因此多次操作,應該使用不同的Session對象
Session對象需要依賴SessionFactory對象每次開啟全新的對象
Session s = sf.openSession();
線程不安全的
Session是一個數據倉庫(臨時)
操作:
增刪改:Session對象獲取到要操作的數據,和操作的種類后,自動根據操作方法生成SQL語句
做數據變更操作,一定要基于事務
查詢:查詢操作也是臨時操作
做數據查詢操作,可以不使用事務(通常開啟事務)
Session使用完畢,關閉Session對象
s.close();
開發一個工具類
HibernateUtil.java
Transaction
對象描述Hibernate執行過程中事務對象
Transaction對象需要依賴Session對象開啟
開啟事務
Transaction t = s.beginTransaction();
提交事務
t.commit();
回滾事務
t.rollback();
Query
描述的是Hibernate中進行查詢的對象
1.Query對象的獲取
獲取Query對象,需要依賴1.Session對象,2.HQL
String hql = "from UserModel"; //HQL語句必須按照規則來寫,所以操作以對象為基礎
Query q = s.createQuery(hql);
2.獲取查詢結果方式
2.1使用list方法,得到一個集合List
基于查詢的內容不同,可以得到兩種信息
1.對象模型
如果查詢的是所有數據,得到的是封裝好的對象
如果查詢的只是一個屬性,得到是該屬性對應的數據類型數據
2.對象數組Object[]
如果查詢的數據超過一個,此時范圍的是對象數組Object[]
投影(不推薦使用):將查詢的多個散的數據,包裝成一個數據模型,需要提供對應的構造方法
注意:
1.一定要提供默認無參的構造方法
2.添加的構造方法根據使用需求來添加,盡量不要使用該形式
2.2使用uniqueResult方法,得到一個對象
注意:
1.集合函數count返回的是Long型數據
2.如果使用該操作,查詢的結果返回了超過1條數據,報錯
3.查詢結果可以是單個數據,也可以是多個數據,規則與list相同
3.分頁查詢
操作,設置要查詢的第一條數據,和數據總量
規定查詢的結果是從第幾條開始
q.setFirstResult(1);
規定查詢的結果一共多少條
q.setMaxResults(10);
4.條件查詢
固定值查詢(略)
傳入可變參數查詢
1.HQL:from UserModel where *** = ? and **** = ?
賦值是對Query對象添加參數
q.setParameter(索引,數據);
q.setParameter(0,"aa"); //為第一個參數賦值為字符串的"aa"
q.setParameter(4,33); //為第五個參數賦值為int型的33
弊端:索引傳遞參數,必須位置全完匹配,如果不匹配,錯誤
2.HQL:from UserModel where age >= :aa and userName like :userName
賦值是對Query對象添加參數,以變量的格式進行添加
q.setParameter(變量名,數據); //變量名一定是在HQL中前面有個冒號的名稱
q.setParameter("age","aa"); //為名稱為age的參數賦值為字符串的"aa"
q.setParameter("name",33); //為名稱為name的參數賦值為int型的33
弊端:由于當前傳遞的參數是沒有類型限定的,因此需要開發者傳遞參數時明確數據類型
3.HQL:from UserModel where age >= ? and userName like ?
賦值是對Query對象添加參數,以索引的格式進行添加,并且規定了參數的數據類型
q.set數據類型(索引,數據);
q.setInteger(0,123);
q.setString(4,"aaa");
q.setDouble(5,3.5);
4.(推薦格式)HQL:from UserModel where age >= :aa and userName like :userName
賦值是對Query對象添加參數,以變量的格式進行添加,并且規定了參數的數據類型
q.set數據類型(變量名,數據);
q.setInteger("aa",123);
q.setString("bb","aaa");
q.setDouble("cc",3.5);
Criteria
描述的是Hibernate中按條件查詢的對象
Criteria對象通過Session對象創建出來的
描述查詢條件時,按照Java面向對象的方式添加條件,每種不同的條件被封裝成了一個對應的方法
Criteria對象查詢支持分頁
Criteria對象查詢支持投影
Criteria對象支持list和uniqueResult查詢結果
-----------------------------------------------------------
系統配置文件(cfg.xml)
數據庫連接的配置
hibernate.connection.driver_class
JDBC驅動類類名
hibernate.connection.url
JDBC連接字符串
hibernate.connection.username
JDBC連接用戶名
hibernate.connection.password
JDBC連接用戶名對應的密碼
連接池的配置
1.Hibernate有一個默認的連接池,可以對其修改連接池連接數量
hibernate.connection.pool_size = 10
更改連接的數量
2.可以使用外部技術開啟連接池(c3p0)
2.1首先導入c3p0連接池jar包 lib/optional/c3p0/*.jar
2.2在cfg.xml中配置下列配置屬性
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.max_size">1000</property>
<property name="hibernate.c3p0.timeout">181</property>
可選配置
1.(必選)方言
SQL語句基于不同的數據庫,寫出來,格式,關鍵字,都不一定完全相同
配置方言,可以讓H3生成對應數據庫使用的SQL語句
dialect 配置對應的數據庫方言(到文檔中查找)
2.控制SQL語句的顯示與分行顯示
show_sql true/false
format_sql true/false
資源注冊
H3只能控制在配置文件中聲明的資源文件對應的類
<mapping resource="cn/itcast/h3/helloworld/vo/UserModel.hbm.xml"/>
映射關系中的Object制作規范
1.提供公共無參的構造方法(可使用自動生成的)
注意:如果使用投影技術,一定要顯式聲明公共無參的構造方法
2.提供一個標識屬性,作為對象的主鍵,映射數據庫表主鍵
通常使用uuid作為主鍵
3.對所有其他屬性進行私有化聲明,并進行標準封裝
注意:屬性聲明時使用封裝類模型,避免使用基本數據類型
4.不要使用final修飾符(否則將無法生成代理對象進行優化)
OID
是H3用于區分對象的,不同的對象OID一定不同,相同的對象OID一定相同
自然主鍵:具有業務含義
代理主鍵:不具有業務含義
OID選擇應盡量避免使用自然主鍵,改用代理主鍵(uuid)
屬性的數據類型選擇問題
基本數據類型 long,int
封裝類類型 Long,Integer
封裝類類型可以區分出數據是否輸入了
基本數據類型的默認值是無法確認是用戶輸入的還是自動添加的
優先使用封裝類
映射配置文件(hbm.xml)
類與表的映射class
name:模型類的全路徑名格式
table:數據庫表名
schema:數據庫名
主鍵的映射id
H3使用OID,這里配置的主鍵映射就是OID
name:數據模型中的OID,通常使用uuid屬性(必須)
column:數據庫表的主鍵,通常使用uuid字段(可選)
如省略column配置,則默認column值與name值相同
type:標識屬性或字段的類型(兼容Java、DB、Hibernate類型)
length:標識數據庫字段的長度
主鍵生成策略generator
手工控制
assigned(不限制類型)
必須手工提供OID
自動生成
uuid(字符串類型)
長度必須是大于等于32位,生成策略是由JVM完成
increment(整型數值類型)(不常用)
數據庫端與模型必須都制作成整型,數據庫端不需要做自增策略
每次使用時獲取當前的最大值,然后+1,給當前使用(具有風險性)
identity (整型數值類型)(安全)
數據庫端需要做【自增策略】,數據庫端與模型必須都制作成整型
MySQL可用
sequence (整型數值類型)
序列完成,基于數據庫
Oracle可用
native(整型數值類型)
根據配置的數據庫類型不同,選擇對應的自增生成策略
MySQL:整型,自增策略
雙主鍵,多主鍵(了解)
<composite-id>
<key-property name="uuid"/>
<key-property name="userName"/>
</composite-id>
屬性與字段的映射
配置Java模型中屬性與數據庫表中字段間的關系
常用屬性
name:數據模型中的屬性名,也就是Java字段名(必須)
column:數據庫表的字段名(可選)
如省略column配置,則默認column值與name值相同
其他屬性
type:標識屬性或字段的類型(兼容Java、DB、Hibernate類型)
length:標識數據庫字段的長度
not-null:是否為空
unique:是否唯一
配置格式:3種
<property name="userName" column="name" type="java.lang.String" length="30"/>
<property name="age" column="age" type="int" length="3"></property>
<property name="address">
<column name="address" sql-type="string" length="30"/>
</property>
<property name="userName"/>(常用)
自動生成表結構
寫在cfg.xml中,屬于可選配置
<property name="hbm2ddl.auto">create</property>
自動提交事務
寫在cfg.xml中,屬于可選配置
<property name="connection.autocommit">true</property>
問題:任意一個Session中,執行任意操作,將對應一個事務
s.save(um);
s.delete(um);
s.update(um);
---------------------------------------------------------
總結:
H3簡介
ORM
H3HelloWorld(重點)
1.環境搭建
2.ORM制作
3.cfg制作
4.客戶端
完成
H3基本操作 (重點)
核心API
6個對象
Query (重點)
配置
cfg.xml
hbm.xml
模型
轉載于:https://www.cnblogs.com/xyhero/p/9348815.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原创】6年测试经验,总结一下我心中的开
- 下一篇: 明清美文四卷本(共四册)