1. 程式人生 > >Hibernate+Java+Oracle實現資料庫存取資料

Hibernate+Java+Oracle實現資料庫存取資料

一、Hibernate簡介

Hibernate是基於物件/關係對映(ORM,Object/Relational Mapping)的一個解決方案。ORM方案的思想是將物件模型表示的物件對映到關係型資料庫中,或者反之。Hibernate目前是ORM思想在Java中最成功、最強大的實現。它於2001年的年末釋出第一個版本,立即引起了廣泛的注意。2003年6月,Hibernate2發表,並且獲得Jolt大獎,進而被JBoss吸納成為它的一個子專案。2005年3月,Hibernate 3發表,其中做了一些比較重大的改進。本文以Hibernate3為基礎編寫。

另外,Hibernate除了可以在J2EE容器中執行外,還可以執行在Java應用程式中。本文就是以Java應用程式為例來介紹它。

二、配置開發環境

本文以一個Java應用程式(Java Application)為例,介紹如何使用Hibernate來進行資料庫操作。
在進行Hibernate開發之前,需要首先獲得Hibernate類庫、相應資料庫的JDBC驅動類庫。Hibernate類庫可以從http://www.hibernate.org中下載,目前的版本是3.0。而JDBC驅動可以根據不同的資料庫來選擇,在這個例子中,使用的是Oracle資料庫,那麼相應的JDBC驅動可以從Oracle安裝目錄\ora92\jdbc下獲得。其他的資料庫請根據相關的說明獲得。

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

做完這些配置後,就可以在此基礎上進行基於Hibernate的Java程式開發了。

三、開發基於Hibernate的應用

現在假設我們在Oracle資料庫中建立了一個表Student,它的欄位如下表所示:

欄位 說明
Student_ID 學員編號,整型,PK,自動增長
Student_Name 學員姓名,字串型別
Student_Age 學員年齡,整型
如果我們在Oracle中定義這個資料庫表,我們可以定義一個建立資料庫表的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來作為自動增長型別欄位的資料。在這裡,我們也可以定義一個sequence來給Student_ID欄位提供資料。建立sequence的SQL指令碼如下:

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

我們在這裡建立了一個student_sequence,準備用來作為Student_ID欄位的值。

接著,我們需要一個hibernate.cfg.xml或者屬性檔案hibernate.properties來指定Hibernate所使用的資料庫以及使用者名稱、密碼等其他相關的配置,我們在此使用xml檔案,它的內容如下:

原始檔:hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
<!--程式執行的時候是否顯示真正的sql語句-->
  <property name="show_sql">true</property>
  <!--使用的SQL對應的“方言”,此處是Oracle9的“方言”-->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect
</property>
  <!--連線資料庫的Driver-->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
  <!--資料庫連線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>

做完前面的這些準備工作後,下面就讓我們進入激動人心的Hibernate程式設計吧!

首先,我們需要定義一個用於表示“學生”物件的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,分別對應資料庫表Student中的三個欄位,並且在這個類中定義了對應各個屬性的setter/getter方法。

接下來,我們需要給這個類定義一個XML對映檔案“Student.hbm.xml”,檔案內容如下:

原始檔:Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<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類和資料庫表之間的關係,在這裡,我們定義的Java類和資料庫表名稱都是Student,然後,我們使用id元素定義了主鍵名稱、型別等,它有一個子元素generator來說明主鍵的產生方式,此處指定的是“native”,表示根據資料庫來選擇,比如,對於Oracle資料庫,它會去尋找一個sequence(預設情況下,它會去尋找一個名為“hibernate_sequence”的sequence),我們可以用引數param來指定一個sequence。而property用來指定Student.java類中的屬性和Student資料庫表之間的對應關係,以及各個欄位的資料型別。在這個例子中,我們指定的資料型別是Java語言中的資料型別(此時需要指定引用型別資料),我們也可以使用Hibernate中自定義的資料型別,限於篇幅,在本文中不一一講解。

然後,我們需要在hibernate.cfg.xml中加入這個檔案的對映,可以在之前加入下面的語句:

<mapping resource="Student.hbm.xml"/>

最後,我們需要編寫一個測試類來測試一下,能否通過Hibernate和前面我們定義的相關程式,完成對資料庫的操作。我們編寫一個測試類如下:
原始檔: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();
            //開始一個事務
            Transaction tx = session.beginTransaction();
            //建立一個Student物件
            Student stu = new Student();
            //通過Student的setter方法改變它的屬性
            //注意student_id不用我們設定
            stu.setStudent_name("zhangsan");
            stu.setStudent_age(18);
            //通過session的save()方法將Student物件儲存到資料庫中
            session.save(stu);
            //提交事務
            tx.commit();
            //關閉會話
            session.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }    
}

編譯並執行這個程式,如果前面的配置和程式都沒有問題,應該可以正確的往資料庫表Student中插入一條資料,並且在控制檯上能夠得到如下輸出(只列出部分輸出內容):

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

可以看到,雖然我們自己沒有編寫SQL語句進行插入資料的操作,但是其實Hibernate還是要使用SQL語句來進行資料庫的操作,只是這個過程對程式設計師來說是透明的。