Java && C#

          要學(xué)得東西很多,但我們的時間卻不是很多!
          數(shù)據(jù)加載中……
          編寫你的第一個Hibernate程序

          一、 Hibernate介紹
          ??? Hibernate是基于對象/關(guān)系映射(ORM,Object/Relational Mapping)的一個解決方案。ORM方案的思想是將對象模型表示的對象映射到關(guān)系型數(shù)據(jù)庫中,或者反之。Hibernate目前是ORM思想在 Java中最成功、最強大的實現(xiàn)。它于2001年的年末發(fā)布第一個版本,立即引起了廣泛的注意。2003年6月,Hibernate2發(fā)表,并且獲得 Jolt大獎,進而被JBoss吸納成為它的一個子項目。2005年3月,Hibernate 3發(fā)表,其中做了一些比較重大的改進。本文以Hibernate3為基礎(chǔ)編寫。

          ??? 另外,Hibernate除了可以在J2EE容器中運行外,還可以運行在Java應(yīng)用程序中。本文就是以Java應(yīng)用程序為例來介紹它。

          二、配置開發(fā)環(huán)境
          ??? 本文以一個Java應(yīng)用程序(Java Application)為例,介紹如何使用Hibernate來進行數(shù)據(jù)庫操作。
          ??? 在進行Hibernate開發(fā)之前,需要首先獲得Hibernate類庫、相應(yīng)數(shù)據(jù)庫的JDBC驅(qū)動類庫。Hibernate類庫可以從http://www.hibernate.org中下載,目前的版本是3.0。而JDBC驅(qū)動可以根據(jù)不同的數(shù)據(jù)庫來選擇,在這個例子中,使用的是Oracle數(shù)據(jù)庫,那么相應(yīng)的JDBC驅(qū)動可以從Oracle安裝目錄\ora92\jdbc下獲得。其他的數(shù)據(jù)庫請根據(jù)相關(guān)的說明獲得。

          ??? 下載Hibernate包后,可以將它解壓到一個文件夾,此處假設(shè)為C:\hibernate-3.0,然后將C:\hibernate-3.0\下的 hibernate.jar和C:\hibernate-3.0\lib下的那些第三方類庫也放到環(huán)境變量CLASSPATH中。(通常,只需要 dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、 antlr這些類庫就可以了)

          ??? 做完這些配置后,就可以在此基礎(chǔ)上進行基于Hibernate的Java程序開發(fā)了。

          三、開發(fā)基于Hibernate的應(yīng)用
          ??? 現(xiàn)在假設(shè)我們在Oracle數(shù)據(jù)庫中創(chuàng)建了一個表Student,它的字段如下表所示:

          字段?說明
          Student_ID?學(xué)員編號,整型,PK,自動增長
          Student_Name?學(xué)員姓名,字符串類型
          Student_Age?學(xué)員年齡,整型
          如果我們在Oracle中定義這個數(shù)據(jù)庫表,我們可以定義一個創(chuàng)建數(shù)據(jù)庫表的SQL腳本如下:
          create table Student(
          ?Student_ID? number(6) NOT NULL PRIMARY KEY,
          ?Student_Name varchar2(10) NOT NULL,
          ?Student_Age number(2) NOT NULL
          );

          ??? 另外,因為在Oracle中沒有“自動增長”類型的字段,所以通常情況下我們需要定義一個sequence來作為自動增長類型字段的數(shù)據(jù)。在這里,我們也可以定義一個sequence來給Student_ID字段提供數(shù)據(jù)。創(chuàng)建sequence的SQL腳本如下:

          CREATE SEQUENCE student_sequence
          INCREMENT BY 1
          START WITH 1000
          NOMAXVALUE
          NOCYCLE
          CACHE 10;

          ??? 我們在這里創(chuàng)建了一個student_sequence,準(zhǔn)備用來作為Student_ID字段的值。

          ??? 接著,我們需要一個hibernate.cfg.xml或者屬性文件hibernate.properties來指定Hibernate所使用的數(shù)據(jù)庫以及用戶名、密碼等其他相關(guān)的配置,我們在此使用xml文件,它的內(nèi)容如下:

          源文件:hibernate.cfg.xml
          <!DOCTYPE hibernate-configuration PUBLIC
          ?"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          ?"<hibernate-configuration>
          ?<session-factory>
          <!--程序執(zhí)行的時候是否顯示真正的sql語句-->
          ??<property name="show_sql">true</property>
          ??<!--使用的SQL對應(yīng)的“方言”,此處是Oracle9的“方言”-->
          <property name="dialect">org.hibernate.dialect.Oracle9Dialect
          </property>
          ??<!--連接數(shù)據(jù)庫的Driver-->
          <property name="connection.driver_class">
          oracle.jdbc.driver.OracleDriver
          </property>
          ??<!--數(shù)據(jù)庫連接url-->
          <property name="connection.url">
          jdbc:oracle:thin:@localhost:1521:nitpro
          </property>
          ??<!--用戶名-->
          <property name="connection.username">system</property>
          <!--密碼-->
          ??<property name="connection.password">manager</property>
          ?</session-factory>
          </hibernate-configuration>

          ??? 做完前面的這些準(zhǔn)備工作后,下面就讓我們進入激動人心的Hibernate編程吧!

          ??? 首先,我們需要定義一個用于表示“學(xué)生”對象的Student類:

          源文件:Student.java
          public class Student
          {
          ??? private int student_id;
          ??? private String student_name;
          ??? private int student_age;
          ???
          ??? public int getStudent_id()
          ??? {
          ??????? return student_id;
          ??? }
          ??? public String getStudent_name()
          ??? {
          ??????? return student_name;
          ??? }
          ??? public int getStudent_age()
          ??? {
          ??????? return student_age;;
          ??? }
          ??? public void setStudent_id(int id)
          ??? {
          ??????? this.student_id = id;
          ??? }
          ??? public void setStudent_name(String name)
          ??? {
          ??????? this.student_name = name;
          ??? }
          ??? public void setStudent_age(int age)
          ??? {
          ??????? this.student_age = age;
          ??? }
          }

          ??? 這個類很簡單,就是一個典型的JavaBean的定義:有三個屬性:student_id、student_name和student_age,分別對應(yīng)數(shù)據(jù)庫表Student中的三個字段,并且在這個類中定義了對應(yīng)各個屬性的setter/getter方法。

          ??? 接下來,我們需要給這個類定義一個XML映射文件“Student.hbm.xml”,文件內(nèi)容如下:

          源文件:Student.hbm.xml
          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-mapping
          ???? PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          ???? "
          <hibernate-mapping>????
          ??? <class name="Student" table="Student">????????
          ??????? <id name="student_id" column="student_id" type="java.lang.Integer">????????????
          ??????????? <generator class="native">????????
          ??????????????? <param name="sequence">student_sequence</param>
          ??????????? </generator>
          ??????? </id>????????
          ??????? <property name="student_name" column="Student_Name"
          ?type="java.lang.String"/>
          ??????? <property name="student_age" column="Student_Age"
          type="java.lang.Integer"/>
          ??? </class>
          </hibernate-mapping>

          ??? 注意,在這個xml文件中,我們首先使用class元素定義了我們定義的Java類和數(shù)據(jù)庫表之間的關(guān)系,在這里,我們定義的Java類和數(shù)據(jù)庫表名稱都 是Student,然后,我們使用id元素定義了主鍵名稱、類型等,它有一個子元素generator來說明主鍵的產(chǎn)生方式,此處指定的是 “native”,表示根據(jù)數(shù)據(jù)庫來選擇,比如,對于Oracle數(shù)據(jù)庫,它會去尋找一個sequence(默認(rèn)情況下,它會去尋找一個名為 “hibernate_sequence”的sequence),我們可以用參數(shù)param來指定一個sequence。而property用來指定 Student.java類中的屬性和Student數(shù)據(jù)庫表之間的對應(yīng)關(guān)系,以及各個字段的數(shù)據(jù)類型。在這個例子中,我們指定的數(shù)據(jù)類型是Java語言 中的數(shù)據(jù)類型(此時需要指定引用類型數(shù)據(jù)),我們也可以使用Hibernate中自定義的數(shù)據(jù)類型,限于篇幅,在本文中不一一講解。

          ??? 然后,我們需要在hibernate.cfg.xml中加入這個文件的映射,可以在</session-factory>之前加入下面的語句:

          <mapping resource="Student.hbm.xml"/>
          最后,我們需要編寫一個測試類來測試一下,能否通過Hibernate和前面我們定義的相關(guān)程序,完成對數(shù)據(jù)庫的操作。我們編寫一個測試類如下:
          源文件:Test.java
          import org.hibernate.*;
          import org.hibernate.cfg.*;

          public class Test
          {
          ??? public static void main(String[] args)
          ??? {
          ??????? try
          ??????? {
          ??????????? //通過Configuration獲得一個SessionFactory對象
          SessionFactory sf
          = new Configuration().configure().buildSessionFactory();
          ??????????? //打開一個Session
          ??????????? Session session = sf.openSession();
          ??????????? //開始一個事務(wù)
          ??????????? Transaction tx = session.beginTransaction();
          ??????????? //創(chuàng)建一個Student對象
          ??????????? Student stu = new Student();
          ??????????? //通過Student的setter方法改變它的屬性
          ??????????? //注意student_id不用我們設(shè)置
          ??????????? stu.setStudent_name("zhangsan");
          ??????????? stu.setStudent_age(18);
          ??????????? //通過session的save()方法將Student對象保存到數(shù)據(jù)庫中
          ??????????? session.save(stu);
          ??????????? //提交事務(wù)
          ??????????? tx.commit();
          ??????????? //關(guān)閉會話
          ??????????? session.close();
          ??????? }
          ??????? catch(Exception e)
          ??????? {
          ??????????? e.printStackTrace();
          ??????? }
          ??? }???
          }

          ??? 編譯并運行這個程序,如果前面的配置和程序都沒有問題,應(yīng)該可以正確的往數(shù)據(jù)庫表Student中插入一條數(shù)據(jù),并且在控制臺上能夠得到如下輸出(只列出部分輸出內(nèi)容):

          Hibernate: select student_sequence.nextval from dual
          Hibernate: insert into Student (Student_Name, Student_Age, student_id) values (?,?,?)

          ??? 可以看到,雖然我們自己沒有編寫SQL語句進行插入數(shù)據(jù)的操作,但是其實Hibernate還是要使用SQL語句來進行數(shù)據(jù)庫的操作,只是這個過程對程序員來說是透明的。

          posted on 2007-03-13 14:30 Bill111 閱讀(593) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 郯城县| 灵宝市| 上林县| 鄂尔多斯市| 商南县| 普兰店市| 诏安县| 汝南县| 华阴市| 三亚市| 天全县| 富顺县| 潢川县| 太康县| 建平县| 思茅市| 盐城市| 海晏县| 柳州市| 抚松县| 泾源县| 漳平市| 萨迦县| 黄骅市| 云浮市| 花莲县| 砀山县| 玉门市| 嘉义市| 临安市| 镇原县| 肃南| 玉龙| 达拉特旗| 巴彦县| 云安县| 贵港市| 扶风县| 金坛市| 茌平县| 绵竹市|