解說Hibernate的工作原理實例
大家可能對Hibernate 有大概了解,但Hibernate 原理到底是什么,不一定清楚,這篇文章主要通過一個實例說明Hibernate 原理。希望對大家的學習有所幫助。
我們知道如果用java連接數據庫我們首先想到的就是JDBC,那么Hibernate 原理是什么呢?hibernate可以理解為是一個中間件它負責把java程序的sql語句接收過來發送到數據庫,而數據庫返回來的信息hibernate接收之后直接生成一個對象傳給java。
在說Hibernate 原理之前,先說說Hibernate的文件吧。
假設一個 student 的學生表:
sql語句:
- create table student(id Number(10),name varchar2(20))
接下來呢.我們需要有兩個hibernate特有的文件。一個是以.cfg.xml結尾的文件.一個是以.hbm.xml結尾的文件。 這兩個文件做什么用的呢?
.cfg.xml 的作用就是連接數據庫,文件內部其實就是一個由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">111< SPAN>property>
- <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:ris< SPAN>property>
- <property name="dialect">org.hibernate.dialect.Oracle9Dialect< SPAN>property>
- <property name="connection.password">111< SPAN>property>
- <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver< SPAN>property>
- <mapping resource="Student.hbm.xml"/>
- < SPAN>session-factory>
- < SPAN>hibernate-configuration>
這個文件的全稱應該是"你的應用名字.cfg.xml"。當前例子建立的項目名稱是one.cfg.xml 。
簡單分析一下這個文件:
里面的那些 property 是一些連接需要的東西。其中dialect 這個是hibernate的方言屬性值,對于不同的數據庫,方言的值dialect是不同的,那么下面就列出在不同的數據庫中如何設置該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 |
MySQL |
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 |
跟住繼續講 Student.hbm.xml 這個文件。這個文件是對數據庫的表的映射文件,我們用這個文件指出哪個類對應著哪個表,而且還指出哪個類中的屬性對應著表中的哪個字段。
文件的內容是這樣的:
- 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"/>
- < SPAN>id>
- <property name="name" column="name"/>
- < SPAN>class>
- < SPAN>hibernate-mapping>
到此這個文件就結束了。特別說一下這個id 的問題。我們看到文件里面有個
這個文件解釋一下了
到這里這兩個特殊的文件就介始完了。下面就開始講我們的 java 類了。主要有兩個:一個是Pojo類,一個是我們的Test類。
Pojo類其實就是簡單的一個javaBean。(Plain Old Java Objects, 簡單潔凈Java對象)。看下面的代碼:
- 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;
- }
- }
就是這么簡單的一個類。就是和數據庫的字段對應然后取值的。
下面是我們關鍵的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);先不遞交最后通過另外一個方法遞交。我們看到下面我們循環里把咱們寫好的Student實例化了。既然實例化了我們就能用里面的方法了。
每次都要session來save一下。一個對象set之后要保存,很好理解吧,保存在了session中。最后遞交commit(); 這個方法實際上是實現了兩個作用
- conn.commit();
- conn.setAutoCommit(true);
這樣才能把我們的數據放進數據庫中。 很奇怪沒有sql語句吧.最后提醒一下.想想hibernate的特性.我們對數據庫的操作就是對對象的操作.這就是OR-Mapping。呵呵,實例分析結束。
【編輯推薦】