PO:persistent object ,用於與數據庫交互數據。--dao層 (JavaBean + hbm )java
BO:Business object 業務數據對象。--service層mysql
VO:Value Object 值對象。--web層web
開發中:直接使用JavaBean 描述三個對象。spring
l hibernate 核心配置文件種類sql
hibernate.cfg.xml 一般使用xml配置文件,能夠配置內容更豐富。數據庫
hibernate.properties 用於配置key/value 形式的內容,key不能重複的。配置有不少的侷限性。通常不用。api
參考文件:hibernate-distribution-3.6.10.Final\project\etc\ hibernate.properties緩存
提供了核心配置文件經常使用的配置項,及選擇參數。安全
1.提供構造 new Configuration() hibernate將自動加載 hibernate.properties文件session
hibernate.properties文件必須存放在類路徑(src)下
2.提供方法 configure() 將加載src下的hibernate.cfg.xml
3.擴展api
configure(String) 加載指定目錄下的 xml文件
4.手動加載配置文件
// 手動加載指定的配置文件
config.addResource("com/itheima/a_hello/User.hbm.xml");
// 手動加載指定類,對應的映射文件 User--> User.hbm.xml
config.addClass(User.class);
l 常見異常:
開發中:將hbm.xml映射 配置 hibernate.cfg.xml
學習中:可使用 addClass 或 addResource
l SessionFactory 至關於java web鏈接池,用於管理全部session
l 得到方式:config.buildSessionFactory();
l sessionFactory hibernate緩存配置信息 (數據庫配置信息、映射文件,預約義HQL語句 等)
l SessionFactory線程安全,能夠是成員變量,多個線程同時訪問時,不會出現線程併發訪問問題。
l 提供api:
//打開一個新的會話 session
factory.openSession();
//得到當前線程中綁定的會話session
factory.getCurrentSession();
hibernate支持,將建立的session綁定到本地線程中,底層使用ThreadLocal,在程序之間共享session。
1.必須在hibernate.cfg.xml 配置
<!-- 2 與本地線程綁定 --> <property name="hibernate.current_session_context_class">thread</property>
|
2.若是提交或回滾事務,底層將自動關閉session
l Session 至關於 JDBC的 Connection -- 會話
l 經過session操做PO對象 --增刪改查
l session單線程,線程不安全,不能編寫成成員變量。
l session api
save 保存
update 更新
delete 刪除
get 經過id查詢,若是沒有 null
load 經過id查詢,若是沒有拋異常
createQuery("hql") 得到Query對象
createCriteria(Class) 得到Criteria對象
開啓事務 beginTransaction()
得到事務 getTransaction()
提交事務:commit()
回滾事務:rollback()
try{ //開啓 //session操做 //提交 } catch(e){ //回滾 } 擴展:不須要手動的管理事務,以後全部的事務管理都交予spring。 |
l hibernate執行hql語句
l hql語句:hibernate提供面向對象查詢語句,使用對象(類)和屬性進行查詢。區分大小寫。
l 得到 session.createQuery("hql")
l 方法:
list() 查詢全部
uniqueResult() 得到一個結果。若是沒有查詢到返回null,若是查詢多條拋異常。
setFirstResult(int) 分頁,開始索引數startIndex
setMaxResults(int) 分頁,每頁顯示個數 pageSize
l QBC(query by criteria),hibernate提供純面向對象查詢語言,提供直接使用PO對象進行操做。
l 得到方式:Criteria criteria = session.createCriteria(User.class);
l 條件
criteria.add(Restrictions.eq("username", "tom"));
// Restrictions.gt(propertyName, value) 大於
// Restrictions.ge(propertyName, value) 大於等於
// Restrictions.lt(propertyName, value) 小於
// Restrictions.le(propertyName, value) 小於等於
// Restrictions.like(propertyName, value) 模糊查詢,注意:模糊查詢值須要使用 % _
public class H3Utils {
// 會話工廠,整個程序只有一份。 private static SessionFactory factory;
static{ //1 加載配置 Configuration config = new Configuration().configure();
//2 得到工廠 factory = config.buildSessionFactory(); //3 關閉虛擬機時,釋放SessionFactory Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override public void run() { System.out.println("虛擬機關閉!釋放資源"); sf.close(); } })); }
/** * 得到一個新的session * @return */ public static Session openSession(){ return factory.openSession(); }
/** * 得到當前線程中綁定session * * 注意:必須配置 * @return */ public static Session getCurrentSession(){ return factory.getCurrentSession(); }
} |
|
<!-- SessionFactory,至關於以前學習鏈接池配置 --> <session-factory> <!-- 1 基本4項 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///h_day01_db</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property>
<!-- 2 與本地線程綁定 --> <property name="hibernate.current_session_context_class">thread</property>
<!-- 3 方言:爲不一樣的數據庫,不一樣的版本,生成sql語句(DQL查詢語句)提供依據 * mysql 字符串 varchar * orcale 字符串 varchar2 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 4 sql語句 --> <!-- 顯示sql語句 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property>
<!-- 5 自動建立表(瞭解) ,學習中使用,開發不使用的。 * 開發中DBA 先建立表,以後根據表生產 PO類 * 取值: update:【】 若是表不存在,將建立表。 若是表已經存在,經過hbm映射文件更新表(添加)。(映射文件必須是數據庫對應) 表中的列能夠多,不負責刪除。 create :若是表存在,先刪除,再建立。程序結束時,以前建立的表不刪除。【】 create-drop:與create幾乎同樣。若是factory.close()執行,將在JVM關閉同時,將建立的表刪除了。(測試) validate:校驗 hbm映射文件 和 表的列是否對應,若是對應正常執行,若是不對應拋出異常。(測試) --> <property name="hibernate.hbm2ddl.auto">create</property>
<!-- 6 java web 6.0 存放一個問題 * BeanFactory 空指針異常 異常提示:org.hibernate.HibernateException: Unable to get the default Bean Validation factory * 解決方案:取消bean校驗 --> <property name="javax.persistence.validation.mode">none</property>
<!-- 添加映射文件 <mapping >添加映射文件 resource 設置 xml配置文件 (addResource(xml)) class 配置類 (addClass(User.class)) 配置的是全限定類名 --> <mapping resource="com/itheima/a_hello/User.hbm.xml"/> </session-factory> |
3 核心配置文件詳解
<!-- SessionFactory,至關於以前學習鏈接池配置 --> <session-factory> <!-- 1 基本4項 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///h_day01_db</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property>
<!-- 2 與本地線程綁定 --> <property name="hibernate.current_session_context_class">thread</property>
<!-- 3 方言:爲不一樣的數據庫,不一樣的版本,生成sql語句(DQL查詢語句)提供依據 * mysql 字符串 varchar * orcale 字符串 varchar2 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 4 sql語句 --> <!-- 顯示sql語句 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property>
<!-- 5 自動建立表(瞭解) ,學習中使用,開發不使用的。 * 開發中DBA 先建立表,以後根據表生產 PO類 * 取值: update:【】 若是表不存在,將建立表。 若是表已經存在,經過hbm映射文件更新表(添加)。(映射文件必須是數據庫對應) 表中的列能夠多,不負責刪除。 create :若是表存在,先刪除,再建立。程序結束時,以前建立的表不刪除。【】 create-drop:與create幾乎同樣。若是factory.close()執行,將在JVM關閉同時,將建立的表刪除了。(測試) validate:校驗 hbm映射文件 和 表的列是否對應,若是對應正常執行,若是不對應拋出異常。(測試) --> <property name="hibernate.hbm2ddl.auto">create</property>
<!-- 6 java web 6.0 存放一個問題 * BeanFactory 空指針異常 異常提示:org.hibernate.HibernateException: Unable to get the default Bean Validation factory * 解決方案:取消bean校驗 --> <property name="javax.persistence.validation.mode">none</property>
<!-- 添加映射文件 <mapping >添加映射文件 resource 設置 xml配置文件 (addResource(xml)) class 配置類 (addClass(User.class)) 配置的是全限定類名 --> <mapping resource="com/itheima/a_hello/User.hbm.xml"/> </session-factory> |
l Java按地址區分同一個類的不一樣對象.
l 關係數據庫用主鍵區分同一條記錄
l Hibernate使用OID來創建內存中的對象和數據庫中記錄的對應關係
結論: 對象的OID和數據庫的表的主鍵對應。爲保證OID的惟一性,應該讓Hibernate來爲OID付值
主鍵須要具有: 不爲空/不能重複/不能改變
天然主鍵: 在業務中,某個屬性符合主鍵的三個要求.那麼該屬性能夠做爲主鍵列.
代理主鍵: 在業務中,不存符合以上3個條件的屬性,那麼就增長一個沒有意義的列.做爲主鍵.
l 基本數據類型和包裝類型對應hibernate的映射類型相同
l 基本類型沒法表達null、數字類型的默認值爲0。
l 包裝類默認值是null。當對於默認值有業務意義的時候須要使用包裝類。
Java數據類型 |
Hibernate數據類型 |
標準SQL數據類型 |
byte、java.lang.Byte |
byte |
TINYINT |
short、java.lang.Short |
short |
SMALLINT |
int、java.lang.Integer |
integer |
INGEGER |
long、java.lang.Long |
long |
BIGINT |
float、java.lang.Float |
float |
FLOAT |
double、java.lang.Double |
double |
DOUBLE |
java.math.BigDecimal |
big_decimal |
NUMERIC |
char、java.lang.Character |
character |
CHAR(1) |
boolean、java.lang.Boolean |
boolean |
BIT |
java.lang.String |
string |
VARCHAR |
boolean、java.lang.Boolean |
yes_no |
CHAR(1)('Y'或'N') |
boolean、java.lang.Boolean |
true_false |
CHAR(1)('Y'或'N') |
java.util.Date、java.sql.Date |
date |
DATE |
java.util.Date、java.sql.Time |
time |
TIME |
java.util.Date、java.sql.Timestamp |
timestamp |
TIMESTAMP |
java.util.Calendar |
calendar |
TIMESTAMP |
java.util.Calendar |
calendar_date |
DATE |
byte[] |
binary |
VARBINARY、BLOB |
java.lang.String |
text |
CLOB |
java.io.Serializable |
serializable |
VARBINARY、BLOB |
java.sql.Clob |
clob |
CLOB |
java.sql.Blob |
blob |
BLOB |
java.lang.Class |
class |
VARCHAR |
java.util.Locale |
locale |
VARCHAR |
java.util.TimeZone |
timezone |
VARCHAR |
java.util.Currency |
currency |
VARCHAR |
<hibernate-mapping> package 用於配置PO類所在包 例如: package="com.itheima.d_hbm" <class> 配置 PO類 和 表 之間對應關係 name:PO類全限定類名 例如:name="com.itheima.d_hbm.Person" 若是配置 package,name的取值能夠是簡單類名 name="Person" table : 數據庫對應的表名 dynamic-insert="false" 是否支持動態生成insert語句 dynamic-update="false" 是否支持動態生成update語句 若是設置true,hibernate底層將判斷提供數據是否爲null,若是爲null,insert或update語句將沒有此項。 普通字段 <property> name : PO類的屬性 column : 表中的列名,默認name的值相同 type:表中列的類型。默認hibernate本身經過getter得到類型,通常狀況不用設置 取值1: hibernate類型 string 字符串 integer 整形 取值2: java類型 (全限定類名) java.lang.String 字符串 取值3:數據庫類型 varchar(長度) 字符串 int 整形 <property name="birthday"> <column name="birthday" sql-type="datetime"></column> </property> javabean 通常使用類型 java.util.Date jdbc規範提供3中 java類型 mysql類型 java.sql.Date date java.sql.time time java.sql.timestamp timestamp null datetime
以上三個類型都是java.util.Date子類
length : 列的長度。默認值:255 not-null : 是否爲null unique : 是否惟一 access:設置映射使用PO類屬性或字段 property : 使用PO類屬性,必須提供setter、getter方法 field : 使用PO類字段,通常不多使用。 insert 生成insert語句時,是否使用當前字段。 update 生成update語句時,是否使用當前字段。 默認狀況:hibernate生成insert或update語句,使用配置文件全部項 注意:配置文件若是使用關鍵字,列名必須使用重音符 |
主鍵 <id>配置主鍵 name:屬性名稱 access="" 設置使用屬性仍是字段 column="" 表的列名 length="" 長度 type="" 類型 <generator> class屬性用於設置主鍵生成策略 1.increment 由hibernate本身維護自動增加 底層經過先查詢max值,再+1策略 不建議使用,存在線程併發問題 2.identity hibernate底層採用數據庫自己自動增加列 例如:mysql auto_increment 3.sequence hibernate底層採用數據庫序列 例如:oracle 提供序列 4.hilo
</generator> 5.native 根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個。【】 ##以上策略使用整形,long, short 或者 int 類型 6.uuid 採用字符串惟一值【】 ##以上策略 代理主鍵,有hibernate維護。 7.assigned 天然主鍵,由程序本身維護。【】 |