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