1、Hibernate初識java
一、ORM:(Object/Relationship Mapping)--對象/關係映射mysql
二、寫SQL語句的缺點:sql
a.不一樣的數據庫使用的SQL語法不一樣。好比:PL/SQL(oracle數據庫)與T/SQL(微軟版本)數據庫
b.一樣的功能在不一樣的數據庫中有不一樣的實現方式。好比分頁SQL,Oracle--rownumber、MySQL---使用關鍵字limit、SQLServer----還可使用top關鍵字windows
c.程序過度依賴SQL對程序的一直及擴展,維護等帶來很大的麻煩。瀏覽器
三、Hibernate是一種可以減小對SQL語句依賴,可行的ORM框架技術。session
1)Hibernate簡介oracle
Hibernate是java領域的一款開源的ORM框架技術app
Hibernate對JDBC進行了很是輕量級的對象封裝框架
2)Hibernate在咱們的應用程序中充當着什麼樣的角色呢?
舉例,以下圖所示:咱們要開發不一樣的系統
持久化層 --- 處於業務邏輯層和數據庫之間的一個角色
做用 -- 把程序中生成的對象持久化到數據庫中,換句話說,就是把這些對象經過對象關係映射保存到數據庫的表中
3)其餘主流的ORM框架技術
①MyBatis: 前身就是著名的iBatis
②Toplink:後被Oracle收購,並從新包裝爲Oracle AS TopLink
③EJB:自己是JAVAEE的規範
編寫Hibernate例子的步驟:
(1)建立Hibernate的配置文件(hibernate.cfg.xml)
(2)建立持久化類
(3)建立對象-關係映射文件
(4)經過HIbernate API編寫訪問數據庫的代碼
hibernate必須的jar包:
hibernate-release-4.2.4.Final\lib\required;
Mysql的JDBCjar包:mysql-connecttor-java-5.1.7-bin.jar;
Junit4的jar包:junit-4.10.jar
導入hibernate,Junit,mysql的驅動包步驟
1.建立一個普通的java工程
2.構建用戶類庫:windows --> preferences --> java --> build path --> user libraries --> new...(建立類庫文件) --> Add Extra jars...(導入jar包)
3.添加用戶類庫:在項目名上右鍵 --> properties --> java build path --> libraries --> Add libraries --> user libraries --> 勾選上 --> 完成
Hibernate配置文檔(cfg.xml)
<property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernamte.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">create</property>
編寫持久化類(實體類),持久化類的設計原則要遵循javabean的設計原則,設計原則有四點:
1. 這個類是一個公有類
2. 提供公有的不帶參數的默認的構造方法
3. 屬性要私有化private
4. 屬性要用setter/getter封裝
建立對象關係映射文件
1.src -> New -> other - > Hibernate -> Hibernate XML Mapping file (hbm.xml) 選擇須要映射的剛建立的實體類,會將建立的字段和數據庫字段進行映射。
2.在cfg.xml中配置文件聲明:<mapping resource="Student.hbm.xml" ></mapping>
使用Junit進行測試
@Before 初始化方法
@Test 測試註釋標籤
@After 釋放資源
/**新版本方法 * 在eclipse中能夠查看數據庫的,具體步驟:Winows->Show view->other->Data soure Explorer便可。 * 必定要導數據庫的jar包。數據庫瀏覽器(Data soure Explorer)的jar包和項目的 * jar包並不能通用,需分別倒入。 * 使用數據庫逆向生成實體類的小夥伴,必定要在數據庫中設置主鍵,要不就等着報錯吧!!!!!!! */ public class StudentTest { private SessionFactory sessionfactory; private Session session; private Transaction transaction; @Before public void init() { Configuration configuration = new Configuration().configure(); /*注意,並不調用ServiceRegistry方法,並且在新版本中調用該方法有概率會出現必定的錯誤. 老師講的課是由實體類直接生成的hbm.xml文件,會在hibernate.cfg.xml中的<session-factory>中生成一個 name屬性,即<session-factory name="">,把name屬性刪除,不然會報錯 */ sessionfactory = configuration.buildSessionFactory(); session = sessionfactory.openSession(); transaction = session.beginTransaction(); } @Test public void studentTest() { Student student=new Student(1,"zhanhgsa","man",new Date()); session.save(student); } @After public void destory() { transaction.commit(); session.close(); sessionfactory.close(); } }
2、Hibernate進階
1.hibernate.cfg.xml經常使用配置
2.session簡介
3.transaction簡介
4.session詳解
5.對象關係映射經常使用配置
一、Hibernate經常使用配置
hibernate.cfg.xml配置文檔的經常使用配置.
程序在運行的時候會讀取hibernate.cfg.xml配置文檔,從而實現鏈接數據庫,而且生成表結構.
設置了<property name="show_sql">true</property>與<property name="format_sql">true</property>則會把hibernate運行時對數據庫的操做時的sql語句會顯示在控制檯而且格式化.
<property name="hbm2ddl.auto">create</property>即從新刪除表結構再建立.因此以前的記錄消失.
<property name="hbm2ddl.auto">update</property>它不會刪除表結構也不會建立新的表結構,會保留原有的數據,只是更新.沒有"hbm2ddl.auto"屬性同樣也是能夠添加新的數據,會保留原有的數據.
<property name="hibernate.default_schema">hibernate</property>則在控制檯輸出的sql語句中,會在表名以前加上數據庫名.
二、session簡介
1.不建議直接使用jdbc的connection操做數據庫,而是經過session操做數據庫。
2.session能夠理解爲操做數據庫的對象,操做數據庫以前必須先獲取session的實例
3.session與connection,是多對一關係,每一個session都有一個與之對應的connection,一個connection不一樣時刻能夠供多個session使用。
4.把對象保存到關係數據庫中須要調用session的各類方法:save(),update(),delete(),createQuery
三、transaction簡介
Transaction事務簡介:
1. hibernate對數據庫的操做都是封裝在事務當中的,而且默認是非自動提交的方式。因此用session保存對象時,若是不開啓事務而且沒有手工提交事務,對象並不會真正保存在數據庫中。
2. 若是你想讓hibernate像jdbc那樣自動提交事務,必須調用session對象的doWork()方法,得到jdbc的connection後,設置其爲自動提交事務模式(注意:一般並不推薦這樣作)
綜上,咱們必須開啓事務。
使用Session的doWork()方法提交事務(須要重寫execute()方法,在方法中設置connection自動提交事務)。須要注意的是:在使用save()方法後並不會真正輸出sql語句,須要調用flush()強制輸出sql語句才能夠。而後由於採用了自動提交方式(setAutoCommit(true)),數據才真正保存在數據庫。
四、session詳解
如何得到session對象?
(1)openSessionion
(2)getCurrentSession
若是使用getCurrentSession須要在hibernate.cfg.xml文件中進行配置:
若是是本地事務(jdbc事務) <property name="hibernate.current_session_context_class">thread</property>
若是是全局事務(jta事務) <property name="hibernate.current_session_context_class">jta</property>
1,事務: 事務表示一個由一系列的數據庫操做組成的不可分割的邏輯單位,其中的操做要麼全作要麼全都不作
2,JDBC事務:JDBC事務由Connnection對象控制管理,也就是說,事務管理其實是在JDBC Connection中實現。事務週期限於Connection的生命週期。
3,JTA事務:提供了跨數據庫鏈接(或其餘JTA資源)的事務管理能力
openSession 每次使用都是打開一個新的session,使用完須要調用close方法關閉session;
getCurrentSession 是獲取當前session對象,連續使用屢次時,獲得的session都是同一個對象,這是與openSession的區別之一 ;
通常在實際開發中,每每使用getCurrentSession多,由於通常是處理同一個事務,因此在通常狀況下比較少使用openSession;
openSession與getCurrentSession的區別:
(1)getCurrentSession在事務提交或者回滾以後會自動關閉,而openSesssion須要你手動關閉。若是使用openSession而沒有手動關閉,屢次以後會致使鏈接池溢出!
(2)openSession每次建立新的session對象,getCurrentSession使用現有的session對象
五、對象關係映射經常使用配置 hbm.xml
<hibernate-mapping schema="schemaName" //模式的名字 catalog="catalogName" //目錄的名稱 default-cascade="cassade_style" //級聯風格 default-access="field/property/CalssName" //訪問策略 default-lazy="true/false" //加載策略 package="packagename" //默認包名 /> <class name="ClassName" //對應映射的類 table="tableName" //對應映射數據庫的表 batch-size="N" //抓取策略,一次抓取多少記錄 where="condition" //條件 eg:抓取條件 entity-name="EntiyName" //若是須要映射多張表 /> <id //表的主鍵 name="propertyName" //對應的屬性 type="typeName" //對應類型 column="column_nam" //映射數據庫中表當中字段名的名稱 length="length" //指定長度 <generator class="generatorClass">//主鍵生成策略 />
一、代理主鍵:是指與業務無關且能惟一標識數據庫中記錄,通常是數據庫自動生成的,好比mysql可使用auto_increment,Sql2000可使用identity生成方式,oracle可使用sequence生成方式。
二、天然主鍵:指業務相關,由用戶指定,且能惟一標識數據庫中的任意一條記錄。