您好,登錄后才能下訂單哦!
怎樣解說Hibernate的工作原理實例,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
大家可能對Hibernate 有大概了解,但Hibernate 原理到底是什么,不一定清楚,這篇文章主要通過一個實例說明Hibernate 原理。希望對大家的學習有所幫助。
我們知道如果用java連接數(shù)據(jù)庫我們首先想到的就是JDBC,那么Hibernate 原理是什么呢?hibernate可以理解為是一個中間件它負責把java程序的sql語句接收過來發(fā)送到數(shù)據(jù)庫,而數(shù)據(jù)庫返回來的信息hibernate接收之后直接生成一個對象傳給java。
在說Hibernate 原理之前,先說說Hibernate的文件吧。
假設一個 student 的學生表:
sql語句:
create table student(id Number(10),name varchar2(20))
接下來呢.我們需要有兩個hibernate特有的文件。一個是以.cfg.xml結尾的文件.一個是以.hbm.xml結尾的文件。 這兩個文件做什么用的呢?
.cfg.xml 的作用就是連接數(shù)據(jù)庫,文件內部其實就是一個由user,password,url,driver組成的一個連接庫的基本信息。
文件的內容是這樣的:
<?xml version='1.0' encoding='UTF-8'?> PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.username">111property> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:risproperty> <property name="dialect">org.hibernate.dialect.Oracle9Dialectproperty> <property name="connection.password">111property> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriverproperty> <mapping resource="Student.hbm.xml"/> session-factory> hibernate-configuration>
這個文件的全稱應該是"你的應用名字.cfg.xml"。當前例子建立的項目名稱是one.cfg.xml 。
簡單分析一下這個文件:
里面的那些 property 是一些連接需要的東西。其中dialect 這個是hibernate的方言屬性值,對于不同的數(shù)據(jù)庫,方言的值dialect是不同的,那么下面就列出在不同的數(shù)據(jù)庫中如何設置該dialect值(參見下表):
RDBMS | 方言 |
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
org.hibernate.dialect.MySQLDialect | |
MySQL with InnoDB | org.hibernate.dialect.MySQLInnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle (any version) | org.hibernate.dialect.OracleDialect |
Oracle 9i/10g | org.hibernate.dialect.Oracle9Dialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server | org.hibernate.dialect.SQLServerDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
Ingres | org.hibernate.dialect.IngresDialect |
Progress | org.hibernate.dialect.ProgressDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
Firebird | org.hibernate.dialect.FirebirdDialect |
跟住繼續(xù)講 Student.hbm.xml 這個文件。這個文件是對數(shù)據(jù)庫的表的映射文件,我們用這個文件指出哪個類對應著哪個表,而且還指出哪個類中的屬性對應著表中的哪個字段。
文件的內容是這樣的:
<?xml version="1.0"?> PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="src.Student" table="student"> <id name="id" column="id"> <generator class="increment"/> id> <property name="name" column="name"/> class> hibernate-mapping>
到此這個文件就結束了。特別說一下這個id 的問題。我們看到文件里面有個
這個文件解釋一下了
到這里這兩個特殊的文件就介始完了。下面就開始講我們的 java 類了。主要有兩個:一個是Pojo類,一個是我們的Test類。
Pojo類其實就是簡單的一個javaBean。(Plain Old Java Objects, 簡單潔凈Java對象)??聪旅娴拇a:
package src; public class Student{ private int id; private String name; public void setId(int id){ this.id=id; } public void setName(String name){ this.name=name; } public int getId(){ return id; } public String getName(){ return name; } }
就是這么簡單的一個類。就是和數(shù)據(jù)庫的字段對應然后取值的。
下面是我們關鍵的Test類:
package src; import org.hibernate.*; import org.hibernate.cfg.*; public class Test{ public static void main(String bb[]){ try{ SessionFactory sf=new Configuration().configure().BuildSessionFactory(); Session s=sf.opension(); Transaction ts=s.beginTransaction(); for(int i=0;i<3;i++){ Student st=new Student(); st.setName("begin go "+ i); s.save(st); } ts.commit(); s.close(); }catch(Exception e){ e.printStackTrace(); } } }
這里的第一句 SessionFactory sf=new Configuration().configure().BuildSessionFactory(); 得到configuration的實例.這個開始要和最前面的哪個.cfg.xml對應著看了。
我們取得實例,然后通過configure()讀取mapping對應的.hbm.xml文件的信息。然后我們通過BuildSessionFactory得到SessionFactory對象,然后我們在通過opensession() 建立連接 .Session 就是指一個session被建立。這個需要有servlet的基礎理解,這里等于是一個connection被建立好。
下面通過session對象開啟事務(Transaction)這個相當于conn.setAutoCommit(false);先不遞交最后通過另外一個方法遞交。我們看到下面我們循環(huán)里把咱們寫好的Student實例化了。既然實例化了我們就能用里面的方法了。
每次都要session來save一下。一個對象set之后要保存,很好理解吧,保存在了session中。最后遞交commit(); 這個方法實際上是實現(xiàn)了兩個作用
conn.commit(); conn.setAutoCommit(true);
這樣才能把我們的數(shù)據(jù)放進數(shù)據(jù)庫中。 很奇怪沒有sql語句吧.最后提醒一下.想想hibernate的特性.我們對數(shù)據(jù)庫的操作就是對對象的操作.這就是OR-Mapping。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。