自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解說(shuō)Hibernate的工作原理實(shí)例

開(kāi)發(fā) 后端
原理是什么呢?hibernate可以理解為是一個(gè)中間件它負(fù)責(zé)把java程序的sql語(yǔ)句接收過(guò)來(lái)發(fā)送到數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)返回來(lái)的信息hibernate接收之后直接生成一個(gè)對(duì)象傳給java。

大家可能對(duì)Hibernate 有大概了解,但Hibernate 原理到底是什么,不一定清楚,這篇文章主要通過(guò)一個(gè)實(shí)例說(shuō)明Hibernate 原理。希望對(duì)大家的學(xué)習(xí)有所幫助。

我們知道如果用java連接數(shù)據(jù)庫(kù)我們首先想到的就是JDBC,那么Hibernate 原理是什么呢?hibernate可以理解為是一個(gè)中間件它負(fù)責(zé)把java程序的sql語(yǔ)句接收過(guò)來(lái)發(fā)送到數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)返回來(lái)的信息hibernate接收之后直接生成一個(gè)對(duì)象傳給java。

在說(shuō)Hibernate 原理之前,先說(shuō)說(shuō)Hibernate的文件吧。
假設(shè)一個(gè) student 的學(xué)生表:
sql語(yǔ)句:

  1. create table student(id Number(10),name varchar2(20)) 

接下來(lái)呢.我們需要有兩個(gè)hibernate特有的文件。一個(gè)是以.cfg.xml結(jié)尾的文件.一個(gè)是以.hbm.xml結(jié)尾的文件。 這兩個(gè)文件做什么用的呢?

 .cfg.xml 的作用就是連接數(shù)據(jù)庫(kù),文件內(nèi)部其實(shí)就是一個(gè)由user,password,url,driver組成的一個(gè)連接庫(kù)的基本信息。

文件的內(nèi)容是這樣的:

  1. xml version='1.0' encoding='UTF-8'?> 
  2.   PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
  4.  
  5. <hibernate-configuration> 
  6.  <session-factory> 
  7.   <property name="connection.username">111property> 
  8.   <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:risproperty> 
  9.   <property name="dialect">org.hibernate.dialect.Oracle9Dialectproperty> 
  10.   <property name="connection.password">111property> 
  11.                 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriverproperty> 
  12.  
  13.   <mapping resource="Student.hbm.xml"/> 
  14.         session-factory> 
  15. hibernate-configuration> 

這個(gè)文件的全稱應(yīng)該是"你的應(yīng)用名字.cfg.xml"。當(dāng)前例子建立的項(xiàng)目名稱是one.cfg.xml 。


簡(jiǎn)單分析一下這個(gè)文件:

包含的是程序里面的 configuration 的實(shí)例的信息。通過(guò)這個(gè)實(shí)例的方法configure我們可以從 mapping 里得到對(duì)應(yīng)的表的信息和類的信息。

這個(gè)標(biāo)簽是我們?cè)诔绦蚶锿ㄟ^(guò) configure 的方法 BuildSessionFactory 所得到的一個(gè) SessionFactory 對(duì)象,這個(gè)對(duì)象可以理解為一個(gè) statement ,我們對(duì)數(shù)據(jù)庫(kù)的所有操作都是通過(guò)它的一系列方法來(lái)實(shí)現(xiàn)的。

里面的那些 property 是一些連接需要的東西。其中dialect 這個(gè)是hibernate的方言屬性值,對(duì)于不同的數(shù)據(jù)庫(kù),方言的值dialect是不同的,那么下面就列出在不同的數(shù)據(jù)庫(kù)中如何設(shè)置該dialect值(參見(jiàn)下表):   

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

跟住繼續(xù)講 Student.hbm.xml 這個(gè)文件。這個(gè)文件是對(duì)數(shù)據(jù)庫(kù)的表的映射文件,我們用這個(gè)文件指出哪個(gè)類對(duì)應(yīng)著哪個(gè)表,而且還指出哪個(gè)類中的屬性對(duì)應(yīng)著表中的哪個(gè)字段。
文件的內(nèi)容是這樣的:

  1. xml version="1.0"?> 
  2.   PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3.   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4.  
  5. <hibernate-mapping> 
  6.  <class name="src.Student" table="student"> 
  7.   <id name="id" column="id"> 
  8.    <generator class="increment"/> 
  9.   id> 
  10.   <property name="name" column="name"/> 
  11.  class> 
  12. hibernate-mapping> 

到此這個(gè)文件就結(jié)束了。特別說(shuō)一下這個(gè)id 的問(wèn)題。我們看到文件里面有個(gè) ,這個(gè)是什么呢?這個(gè)是可以實(shí)現(xiàn)自動(dòng) id 增加,也就是說(shuō)如果我們往數(shù)據(jù)庫(kù)中插入一個(gè) name 那么就id自動(dòng)加1 。

這個(gè)文件解釋一下了這個(gè)所包含的就是我們前一個(gè)文件里面說(shuō)的mapping。我們?cè)趈ava類中configure得到的mapping就是從這個(gè)文件里面讀取出來(lái)的。類如果帶包的話一定要帶包名(推薦一切寫的類都要帶包).包名和類名要注意.包名小寫,類名的第一個(gè)大寫。我是怕出錯(cuò),這里提醒大家一下, 這個(gè)就是先指定了類對(duì)應(yīng)的表。然后里面的那些就是指定表中的字段與類中的屬性的對(duì)應(yīng)關(guān)系了。


到這里這兩個(gè)特殊的文件就介始完了。下面就開(kāi)始講我們的 java 類了。主要有兩個(gè):一個(gè)是Pojo類,一個(gè)是我們的Test類。

Pojo類其實(shí)就是簡(jiǎn)單的一個(gè)javaBean。(Plain Old Java Objects, 簡(jiǎn)單潔凈Java對(duì)象)。看下面的代碼:

  1. package src;  
  2.  
  3.  public class Student{  
  4.  
  5.     private int id;  
  6.     private String name;  
  7.  
  8.     public void setId(int id){  
  9.        this.id=id;  
  10.     }  
  11.  
  12.  
  13.     public void setName(String name){  
  14.        this.name=name;  
  15.     }  
  16.  
  17.     public int getId(){  
  18.      return id;  
  19.     }  
  20.  
  21.     public String getName(){  
  22.      return name;  
  23.     }  
  24.  }  

就是這么簡(jiǎn)單的一個(gè)類。就是和數(shù)據(jù)庫(kù)的字段對(duì)應(yīng)然后取值的。

下面是我們關(guān)鍵的Test類:

  1. package src;  
  2.  
  3. import org.hibernate.*;  
  4. import org.hibernate.cfg.*;  
  5.  
  6. public class Test{  
  7.    public static void main(String bb[]){  
  8.       try{  
  9.          SessionFactory sf=new Configuration().configure().BuildSessionFactory();  
  10.          Session s=sf.opension();  
  11.          Transaction ts=s.beginTransaction();  
  12.          for(int i=0;i<3;i++){  
  13.             Student st=new Student();  
  14.             st.setName("begin go "+ i);  
  15.             s.save(st);  
  16.         }  
  17.          ts.commit();  
  18.          s.close();  
  19.        }catch(Exception e){  
  20.          e.printStackTrace();  
  21.       }  
  22.    }  
  23. }  

這里的第一句 SessionFactory sf=new Configuration().configure().BuildSessionFactory(); 得到configuration的實(shí)例.這個(gè)開(kāi)始要和最前面的哪個(gè).cfg.xml對(duì)應(yīng)著看了。

我們?nèi)〉脤?shí)例,然后通過(guò)configure()讀取mapping對(duì)應(yīng)的.hbm.xml文件的信息。然后我們通過(guò)BuildSessionFactory得到SessionFactory對(duì)象,然后我們?cè)谕ㄟ^(guò)opensession() 建立連接 .Session 就是指一個(gè)session被建立。這個(gè)需要有servlet的基礎(chǔ)理解,這里等于是一個(gè)connection被建立好。

下面通過(guò)session對(duì)象開(kāi)啟事務(wù)(Transaction)這個(gè)相當(dāng)于conn.setAutoCommit(false);先不遞交最后通過(guò)另外一個(gè)方法遞交。我們看到下面我們循環(huán)里把咱們寫好的Student實(shí)例化了。既然實(shí)例化了我們就能用里面的方法了。

每次都要session來(lái)save一下。一個(gè)對(duì)象set之后要保存,很好理解吧,保存在了session中。最后遞交commit();  這個(gè)方法實(shí)際上是實(shí)現(xiàn)了兩個(gè)作用

  1. conn.commit();    
  2.  conn.setAutoCommit(true);  

這樣才能把我們的數(shù)據(jù)放進(jìn)數(shù)據(jù)庫(kù)中。  很奇怪沒(méi)有sql語(yǔ)句吧.最后提醒一下.想想hibernate的特性.我們對(duì)數(shù)據(jù)庫(kù)的操作就是對(duì)對(duì)象的操作.這就是OR-Mapping。呵呵,實(shí)例分析結(jié)束。

【編輯推薦】

  1. Hibernate入門學(xué)習(xí)寶典
  2. Hibernate屬性簡(jiǎn)單分析
  3. Struts-Spring-Hibernate案例
  4. 簡(jiǎn)述Hibernate配置連接池
  5. 對(duì)Hibernate中g(shù)et()與load()不同點(diǎn)分析
責(zé)任編輯:仲衡 來(lái)源: 21jn
相關(guān)推薦

2009-06-17 09:17:41

Hibernate3

2012-05-17 10:16:00

HibernateJavamerge

2009-06-03 09:11:03

Hibernate工作原理體系結(jié)構(gòu)

2009-09-23 17:05:52

Hibernate S

2009-06-05 11:01:23

struts mvcMVC工作原理

2009-06-03 09:16:03

Hibernate工作原理使用

2009-09-27 16:21:22

Hibernate C

2022-06-08 09:56:46

靜態(tài)鏈接Linux命令

2011-07-11 13:20:13

linuxuniq

2009-09-24 10:06:42

Hibernate實(shí)例

2009-09-23 17:18:16

Hibernate S

2009-09-22 08:39:59

Hibernate F

2009-06-30 10:33:00

JSP JavaBeaServlet

2010-07-14 15:51:30

Perl 字符匹配

2009-09-23 10:28:49

使用Hibernate

2009-09-22 10:09:21

Hibernate S

2009-09-23 15:12:41

Hibernate視圖

2011-05-23 10:27:09

網(wǎng)絡(luò)測(cè)試IP承載網(wǎng)

2009-09-28 13:39:01

Hibernate工作

2019-07-18 11:00:45

自動(dòng)化運(yùn)維測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)