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