Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则
Hibernate( ORM框架 )
Hibernate是一個(gè)數(shù)據(jù)持久化層的ORM框架. 它通過JavaBean, 數(shù)據(jù)庫中的表與自身的映射關(guān)系達(dá)到表中數(shù)據(jù)的增刪改查
特性
1.對(duì)JDBC訪問數(shù)據(jù)庫的代碼進(jìn)行封裝, 簡(jiǎn)化數(shù)據(jù)訪問的重復(fù)性代碼
2.使用反射機(jī)制完成對(duì)Bean的封裝
3.輕量級(jí)框架,支持關(guān)系型數(shù)據(jù)庫
核心配置文件的編寫
Hibernate的核心配置文件用于連接數(shù)據(jù)庫, 以及添加映射文件(映射文件就是JavaBean屬性與數(shù)據(jù)表之間的對(duì)應(yīng)關(guān)系)
核心配置文件文件名必須是: hibernate.cfg.xml //此處的cfg不是文件后綴類型
文件的地址位于src目錄下
下面通過例子說明:
<?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就是對(duì)數(shù)據(jù)庫連接的配置--><session-factory><!--以下都是固定寫法--><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--配置數(shù)據(jù)庫驅(qū)動(dòng)類--><property name="hibernate.connection.url">jdbc:mysql:///test</property> <!--配置數(shù)據(jù)庫服務(wù)地址--><property name="hibernate.connection.username">root</property> <!--配置數(shù)據(jù)庫用戶名--><property name="hibernate.connection.password">1234</property> <!--配置數(shù)據(jù)庫登錄密碼--><!--向控制臺(tái)打印Hibernate執(zhí)行的sql語句--><property name="show_sql">true</property><!--優(yōu)化控制臺(tái)輸出的sql語句格式--><property name="format_sql">true</property><!--表結(jié)構(gòu)生成策略--><property name="hbm2ddl.auto">update</property><!--配置數(shù)據(jù)庫使用的sql, 固定寫法--><property name="hibernate.dialect">org.hibernate.dialect.MYSQLDialect</property><!--事務(wù)自動(dòng)提交--><property name="hibernate.connection.autocommit">true</property><!--將hibernate核心Session與線程綁定, 使得線程安全--><property name="hibernate.current_session_context_class">thread</property><mapping resource="com/hibernatetest/User.hbm.xml"> <!--配置映射文件, resource對(duì)應(yīng)映射文件的相對(duì)路徑--></session-factory> </hibernate-configuration>表結(jié)構(gòu)生成策略
在hibernate中, 如果數(shù)據(jù)庫中沒有對(duì)應(yīng)的table, 在配置了hbm2ddl.auto屬性, hibernate將為你自動(dòng)生成表結(jié)構(gòu), 下面將詳細(xì)介紹該屬性的取值
- update: 當(dāng)數(shù)據(jù)庫中不存在表結(jié)構(gòu), hibernate將會(huì)自動(dòng)創(chuàng)建表結(jié)構(gòu), 如果存在表結(jié)構(gòu), hibernate會(huì)檢查數(shù)據(jù)庫中的表結(jié)構(gòu)與映射文件配置的結(jié)構(gòu)是否對(duì)應(yīng), 如果不對(duì)應(yīng), 那么hibernate將會(huì)在原有的結(jié)構(gòu)上添加不存在的列, 不存在的數(shù)據(jù)使用null填充
- create: 無論數(shù)據(jù)庫中是否存在表結(jié)構(gòu), 每次啟動(dòng)hibernate, hibernate都會(huì)新建一個(gè)表結(jié)構(gòu), 表中原有的數(shù)據(jù)會(huì)丟失
- create-drop: 無論數(shù)據(jù)庫中是否存在表結(jié)構(gòu), 每次啟動(dòng)hibernate, hibernate都會(huì)新建一個(gè)表結(jié)構(gòu), 在hibernate運(yùn)行結(jié)束后, 刪除表結(jié)構(gòu)
- validate: 啟動(dòng)hibernate, 會(huì)自動(dòng)檢查表結(jié)構(gòu)是否與映射文件結(jié)構(gòu)對(duì)應(yīng), 不對(duì)應(yīng)就拋異常, 它不會(huì)自動(dòng)創(chuàng)建/刪除/維護(hù)表結(jié)構(gòu)
JavaBean與映射文件
- 數(shù)據(jù)庫中表結(jié)構(gòu):
- JavaBean就通過User表示
- 映射文件:
就是建立JavaBean中屬性與表結(jié)構(gòu)相對(duì)應(yīng)
文件名: 遵守規(guī)范, 與JavaBean同名, 例如: User.hbm.xml
文件位置: 放在JavaBean同一目錄下
下面舉例說明:
id標(biāo)簽中的generator屬性:配置主鍵生成策略
配置generator, 使得表中數(shù)據(jù)的主鍵可以由數(shù)據(jù)庫自增, 我們自己指定, 或者由Hibernate自動(dòng)生成(表必須有主鍵).
property標(biāo)簽常用屬性:
property主要用于配置數(shù)據(jù)庫中column與Bean的對(duì)應(yīng)關(guān)系, 以及column的屬性(數(shù)據(jù)類型, 長(zhǎng)度, 有效位, 是否為空, 是否唯一)
使用Hibernate進(jìn)行數(shù)據(jù)庫操作
下面使用一個(gè)簡(jiǎn)單的例子說明:
@Test public void demo(){//1. 加載核心配置文件和映射文件//由于核心配置文件文件名符合規(guī)則, 使用默認(rèn)的configure方法來加載Configuration c = new Configuration().configure();//2.獲得SessionFactory, 相當(dāng)于獲得數(shù)據(jù)庫連接池SessionFactory factory = c.buildSessionFactory();//3.獲得Session對(duì)象, 相當(dāng)于獲得connectionSession session = factory.openSession();//4.開啟事務(wù)Transaction transaction = session.beginTransaction();//5.執(zhí)行數(shù)據(jù)庫增刪改查操作................//6.提交事務(wù)transaction.commit();//7.釋放資源session.close();factory.close(); }上面的7個(gè)步驟就可以完成數(shù)據(jù)庫的操作, 操作過程與JDBC差不多
封裝Hibernate工具類
由于加載配置文件, 獲得session對(duì)象, 關(guān)閉資源都是相同的代碼, 所以將相同的代碼封裝為工具類
package com.utils;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory sf;static {Configuration cf = new Configuration().configure();sf = cf.buildSessionFactory();Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){//當(dāng)虛擬機(jī)關(guān)閉的時(shí)候關(guān)閉資源@Overridepublic void run() {System.out.println("虛擬機(jī)關(guān)閉, 釋放資源");sf.close();}}));}public static Session openSession(){return sf.openSession();}//用于獲得ThreadLocal中的Sessionpublic static Session getCurrentSession(){return sf.getCurrentSession();} }HibernateAPI解析:
- Configuration配置核心文件
1.new Configuration().configure(): Hibernate能做到自動(dòng)加載src下的Hibernate核心配置文件和Bean同目錄下的User.hbm.xml, 前提必須是文件放置的位置符合規(guī)范.
2.當(dāng)放置的文件不符合規(guī)則的時(shí)候使用new Configuration().configure(file/path); 通過file/path進(jìn)行加載
3.手動(dòng)加載映射文件:
- SessionFactory
SessionFactory用于管理所有的Session,線程安全, 使用configure.buildSessionFactory()獲得
factory.openSession()與factory.getCurrentSession的區(qū)別:
注: 使用getCurrentSession, 必須在核心配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>-
Session對(duì)象
Session對(duì)象就相當(dāng)于JDBC中的Connection操作,單線程, session可以用來對(duì)數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行增刪改查操作(都是建立在有主鍵的情況下). -
Transaction事務(wù)
開啟事務(wù): session.beginTransaction();
獲得事務(wù): session.getTransaction();
提交事務(wù): transaction.commit();
回滾事務(wù): transaction.rollback();
事務(wù)處理結(jié)構(gòu):
Session對(duì)象基本操作:
準(zhǔn)備操作:
Configuration c = new Configuration().configure(); SessionFactory factory = c.buildSessionFactory(); Session session = factory.openSession();- get查找數(shù)據(jù)庫中對(duì)象
- load查找數(shù)據(jù)庫中對(duì)象
- createQuery批量查詢
- createCriteria批量查詢
注: Criteria做到面向?qū)ο蟛樵? 完全不需要使用SQL語句, 但是在一定程度上缺少靈活性
- createSQLQuery執(zhí)行原生SQL實(shí)現(xiàn)批量查詢
- save將Bean對(duì)象保存到數(shù)據(jù)庫中
- update對(duì)數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行修改
- delete刪除數(shù)據(jù)庫中對(duì)應(yīng)的對(duì)象
load與get的區(qū)別
get: 一旦調(diào)用get操作,Hibernate就會(huì)使用SQL去數(shù)據(jù)庫中查找指定對(duì)象, 然后將這個(gè)對(duì)象封裝到User中
load: 調(diào)用load操作的時(shí)候, Hibernate先在內(nèi)部使用動(dòng)態(tài)代理, 生成只具有id屬性的代理對(duì)象, 只有當(dāng)使用該代理對(duì)象的屬性的時(shí)候, 才會(huì)去數(shù)據(jù)庫中查詢指定對(duì)象, 然后初始化該動(dòng)態(tài)代理對(duì)象
總結(jié): get操作立馬就SQL查詢, load操作只有在使用該對(duì)象屬性才會(huì)去查詢(延遲操作,一定程度上節(jié)約資源)
Hibernate持久化類
- 持久化類編寫規(guī)則:
1.提供無參public修飾的構(gòu)造方法
2.提供一個(gè)"主鍵"屬性, 映射表中的主鍵
3.所有屬性提供public修飾的get, set方法
4.屬性盡量使用包裝類 (防止基本數(shù)據(jù)類型自動(dòng)初始化為0/""/false/0.0…, 使用包裝類就直接初始化為null, 便于數(shù)據(jù)庫操作)
5.不要使用final修飾實(shí)例 (無法生存代理對(duì)象) - 持久化對(duì)象的唯一標(biāo)識(shí)OID
對(duì)象的id要與表中的主鍵對(duì)應(yīng), 為了保證OID的唯一性, 應(yīng)該使用OID賦值 - 類型對(duì)應(yīng)
上面有錯(cuò), 還請(qǐng)指出, 如果認(rèn)為我寫的還不錯(cuò), 還請(qǐng)點(diǎn)個(gè)贊, 多多支持一下, O(∩_∩)O~~
總結(jié)
以上是生活随笔為你收集整理的Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 威纶触摸屏与电脑连接_PLC与这7种设备
- 下一篇: c语言sort函数_C语言的那些经典程序