国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Hibernate4-1 Hibernate初識

2019-11-08 02:27:28
字體:
來源:轉載
供稿:網友

  Hibernate是一個開放源代碼的對象關系映射(Object Relation Mapping,簡稱ORM)框架,同時也是java領域的一個持久化框架。


1. Hibernate框架

1.1 框架

  框架可以看做一個半成品,基于此可提高開發效率、減少代碼量、提高程序的健壯性等。

1.2 持久化

  狹義的理解,持久化僅指將對象永久保存在數據庫中;而廣義的理解則包括與數據庫相關的增刪改查和加載操作。   其中,加載是指根據特定的OID將一個對象從數據庫加載到內存中。為了在系統中能夠找到所需對象,需要為每一個對象分配唯一的標識號;在關系數據庫中稱之為主鍵,而在對象術語中,則叫做對象標識(Object identifier,簡稱OID)。

1.3 ORM框架

  ORM框架的功能是實現對象與關系的映射,其思想是將關系數據庫中表的記錄映射為對象,程序員可以把對數據庫的操作直接轉化為對對象的操作。其中,具體映射關系如下圖所示:

面向對象概念 面向關系概念
對象 表的行(記錄)
屬性 表的列(字段)

  ORM框架采用元數據(描述數據的數據)來描述對象關系映射細節,元數據通常采用xml格式存放在專門的對象關系映射文件中。   其中,ORM框架架構如下圖所示:  這里寫圖片描述   就目前而言,較為流行的ORM框架主要有Hibernate、myBatis、TopLink、OJB等。其中,Hibernate框架較為成熟、可完成對象的持久化操作、允許開發者采用面向對象的方式來操作關系數據庫、可消除針對特定數據庫廠商的SQL代碼;然而,myBatis框架相比Hibernate更為靈活、運行速度快,但其開發速度慢、不支持純粹的面向對象操作、需熟悉sql語句并且熟練使用sql語句優化功能。

1.4 插件安裝

  Hibernate插件可使開發更為簡單方便,因此需要在開發前進行安裝;在此,選擇的安裝文件為hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip


2. 實現步驟

  Hibernate的具體實現步驟示意圖如下圖所示: Hibernate實現步驟示意圖

2.1 環境準備

這里寫圖片描述

2.2 創建Hibernate配置文件(hibernate.cfg.xml)

  Hibernate從其配置文件中讀取和數據庫連接的有關信息,該文件應位于應用的classpath下。具體示例代碼如附錄hibernate.cfg.xml文件所示。

2.3 創建持久化Java類

  Hibernate被稱為低浸入式設計框架,因為其持久化類不需要繼承任何父類或實現任何接口,可保證代碼不被污染;該持久化類主要有以下要求:

提供無參的構造器:使Hibernate需要使用Constructor.newInstance()來實例化持久化類;提供標識屬性(identifier PRoperty):其映射為數據庫表的主鍵字段,若沒有該屬性一些功能則不起作用,如session.saveOrUpdate();為類的持久化類字段聲明訪問方法(get/set): Hibernate對JavaBeans風格的屬性實行持久化;使用非final類: 在運行時生成代理是Hibernate的一個重要功能;如果持久化類沒有實現任何接口,Hibnernate使用CGLIB生成代理,但若使用final類,則無法生成CGLIB代理;重寫eqauls()和hashCode()方法:如果需要把持久化類的實例放到Set中(當需要進行關聯映射時), 則需要重寫。

2.4 創建對象關系映射文件(*.hbm.xml)

  Hibernate采用XML格式文件來指定對象和關系數據之間的映射,其在運行時 將根據該映射文件來生成所對應的SQL語句。具體示例代碼如附錄News.hbm.xml文件所示。

2.5 編寫代碼訪問數據庫

2.5.1 Configuration類

  作用:負責管理Hibernate的配置信息,主要包括Hibernate運行的底層信息(如數據庫的URL、用戶名、密碼、JDBC驅動類、數據庫連接池、數據庫Dialect等,對應hibernate.cfg.xml文件)和持久化類與數據表的映射關系(對應*.hbm.xml 文件)。   創建Configuration對象:

若采用hibernate.properties文件配置,則Configuration cfg = new Configuration();若采用hibernate.cfg.xml文件配置,則Configuration cfg = new Configuration().configure(),且Configuration對象的configure()方法還支持帶參數的訪問。
2.5.2 SessionFactory接口
針對單個數據庫映射關系經過編譯后的內存鏡像,是線程安全的;構造SessionFactory很耗資源,一般情況下一個應用中只初始化一個SessionFactory對象;SessionFactory是生成Session的工廠,該對象一旦構造完畢,即被賦予特定的配置信息;Hibernate4新增ServiceRegistry接口,所有基于Hibernate的配置或服務都必須統一向這個ServiceRegistry注冊后才能生效。其中,SessionFactory的具體創建步驟如下:// 1). 創建Configuration對象:對應Hibernate基本配置信息和對象關系映射信息Configuration configuration = new Configuration().configure();// Hibernate4.0之前這樣創建// sessionFactory = configuration.buildSessionFactory();// 2). 創建一個ServiceRegistry對象:Hibernate4.x新增// Hibernate的任何配置和服務都需要在該對象中注冊后才能有效ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry();// 3). 創建SessionFactory對象sessionFactory = configuration.buildSessionFactory(serviceRegistry);
2.5.3 Session接口

  Session對象是應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate的運作中心,所有持久化對象必須在Session的管理下才可以進行持久化操作;另外,此對象生命周期很短,且具有一個一級緩存,顯式執行flush()方法前,所有的持久層操作的數據都緩存在Session對象處,其相當于JDBC中的Connection。   注意:持久化類與Session關聯起來后就具有了持久化的能力。其中,Session接口的常用方法主要有:

開啟事務:beginTransaction();  取得持久化對象的方法:get()、load();持久化對象的操作:save()、update()、saveOrUpdate()、delete();管理Session對象:isOpen()、flush()、clear()、evict()、close()等。
2.5.4 Transaction(事務)

  其代表一次原子操作,具有數據庫事務的概念,即所有持久層操作都應該在事務管理下進行,包括只讀操作。其常用方法主要有:

rollback():撤銷事務操作;wasCommitted():檢查事務是否提交;commit():提交事務,即提交相關聯的session實例。

附錄:示例代碼

代碼結構: 這里寫圖片描述

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 1. 配置連接數據庫的基本信息 --> <property name="connection.username">root</property> <property name="connection.passWord">root</property> <property name="connection.driver_class">com.MySQL.jdbc.Driver</property> <!-- jdbc:mysql://localhost:3306/hibernate localhost:3306為默認的,可以去除 --> <property name="connection.url">jdbc:mysql:///hibernate</property> <property name="connection.username"></property> <!-- 2. 配置Hibernate的基本信息 --> <!-- 2.1 配置Hibernate所使用的數據庫方言 --> <!-- 可在hibernate-release-4.2.4.Final/project/etc/hibernate.properties文件中查找 --> <property name="dialect">hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect</property> <!-- 2.2 執行操作時是否在控制臺打印SQL語句 --> <property name="show_sql">true</property> <!-- 2.3 執行操作時是否是否對SQL進行格式化 --> <property name="format_sql">true</property> <!-- 2.4 指定執行操作時自動生成數據表的策略,共有四種取值 --> <!-- create : 根據*.hbm.xml文件來生成數據表,但每次運行都會刪除舊表創建新表,即使數據表內容沒有改變; create-drop : 根據*.hbm.xml文件生成數據表,但SessionFactory對象關閉即刪除數據表; update : 最常用的屬性值,也會根據*.hbm.xml文件生成數據表表, 但若*.hbm.xml文件與數據庫中對應數據表結構不同,Hiberante將更新數據表結構,但不會刪除已有的行和列; validate : 會與數據庫中的表進行比較,若*.hbm.xml文件中的列在數據表中不存在,則拋出異常。 --> <property name="hbm2ddl.auto">update</property> <!-- 2.5 指定所關聯的對象關系映射文件 --> <mapping resource="com/qiaobc/hibernate/helloworld/News.hbm.xml"/> </session-factory></hibernate-configuration>

News.java:

package com.qiaobc.hibernate.helloworld;import java.sql.Date;public class News { private Integer id; private String title; private String author; private Date date; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public News(Integer id, String title, String author, Date date) { super(); this.id = id; this.title = title; this.author = author; this.date = date; } public News() { super(); } @Override public String toString() { return "News [id=" + id + ", title=" + title + ", author=" + author + ", date=" + date + "]"; }}

News.hbm.xml:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-2-19 16:24:21 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="com.qiaobc.hibernate.helloworld.News" table="NEWS"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <!-- 指定主鍵的生成方式 native:使用數據庫本地的方式 --> <generator class="native" /> </id> <property name="title" type="java.lang.String"> <column name="TITLE" /> </property> <property name="author" type="java.lang.String"> <column name="AUTHOR" /> </property> <property name="date" type="java.sql.Date"> <column name="DATE" /> </property> </class></hibernate-mapping>

HibernateTest.java:

package com.qiaobc.hibernate.helloworld;import java.sql.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.Test;public class HibernateTest { @Test public void test() { // 1. 創建SessionFactory對象 SessionFactory sessionFactory = null; // 1). 創建Configuration對象:對應Hibernate基本配置信息和對象關系映射信息 Configuration configuration = new Configuration().configure(); // Hibernate4.0之前這樣創建 // sessionFactory = configuration.buildSessionFactory(); // 2). 創建一個ServiceRegistry對象:Hibernate4.x新增 // Hibernate的任何配置和服務都需要在該對象中注冊后才能有效 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); // 3). 創建SessionFactory對象 sessionFactory = configuration.buildSessionFactory(serviceRegistry); // 2. 創建Session對象 Session session = sessionFactory.openSession(); // 3. 開啟事務 Transaction transaction = session.beginTransaction(); // 4. 執行保存操作 News news = new News(null, "qiaobc", "qiaob", new Date( new java.util.Date().getTime())); session.save(news); // 5. 提交事務 transaction.commit(); // 6. 關閉Session對象 session.close(); // 7. 關閉SessionFactory對象 sessionFactory.close(); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐至县| 延吉市| 奉节县| 石嘴山市| 进贤县| 武夷山市| 南皮县| 岳阳县| 葵青区| 固阳县| 淮南市| 阳原县| 曲阜市| 乾安县| 林西县| 醴陵市| 公主岭市| 淳化县| 桓台县| 呼和浩特市| 扶沟县| 三都| 南召县| 沙湾县| 固安县| 榆树市| 海阳市| 如皋市| 安徽省| 龙口市| 阿荣旗| 贵港市| 咸宁市| 定陶县| 永泰县| 四川省| 沽源县| 镇原县| 农安县| 读书| 土默特右旗|