[Java] 在Eclipse中配置Hibernate3

[Java] 在Eclipse中配置Hibernate3

Hibernate是什麼?可以吃嗎?

關於Hibernate,在網路上有相當豐富的資訊可以取得,在這裡不多做介紹。簡單來說,Hibernate 是「物件/關係對應」(Object/Relational Mapping)的解決方案,簡寫為ORM,就是將 Java 中的物件與物件關係,映射至關聯式資料庫中的表格與表格之間的關係, Hibernate 提供了這個過程中自動對應轉換的方案。

想要配置Hibernate,請先至www.hibernate.org下載最新版本的Hibernate(在此使用的是3.6版本),解壓縮之後會得到「hibernate-distribution-3.6.0.CR2」資料夾,當中最重要的為「hibernate3.jar」,除此之外,還需要lib資料中的其他jar檔案(hibernate-distribution-3.6.0.CR2/lib/required),若需使用連接池,可使用C3P0連接池(hibernate-distribution-3.6.0.CR2/lib/optiona/c3p0);也因為Hibernate需要跟資料庫做連結(在此使用的是MySQL),還需要JDBC Driver,總結以上,目前需要用到的jar檔案如下:

  • mysql-connector-java-5.1.13.bin.jar
  • hibernate3.jar
  • antlr-2.7.6.jar
  • commons-collections.jar
  • dom4j.jar
  • javassist-3.12.0.GA.jar
  • jta-1.1.jar
  • slf4j-api-1.6.1
  • c3p0.jar

將以上的.jar放置於專案中的WebContent/WEB-INF/lib內,接下來可以將「hibernate-distribution-3.6.0.CR2/project/etc」的log4j.properties複製至Hibernate專案的Classpath下,並修改一下當中的log4j.logger.org.hibernateerror,也就是只在錯誤發生時顯示必要的訊息。

而在敝人的測試之下,只有上述的.jar檔案是無法成功運行專案的,還需要下載javax.persistence.jarslf4j-1.6.1 binary files。將slf4j-1.6.1.zip解壓縮之後會得到一個資料夾,取其中的四個jar檔:slf4j-jdk14-1.6.1.jar、slf4j-log4j12-1.6.1.jar、slf4j-nop-1.6.1.jar、slf4j-simple-1.6.1.jar,跟本文上述的jar檔一起放進WebContent/WEB-INF/lib裡面

第二步設置Hibernate的基本文件:Hibernate.cfg.xml

以上已經配置完成,跟Spring MVC比起來實在是簡單太多了啊!再來可以寫一個簡單的測試程式囉!


寫程式之前,需先在MySQL建立Table,在此以我建立的memberinfo為例,表格內有idmemberinfo,id,member_name,member_password,sex,department,e_mail,web以上欄位,有多少欄位就要建立相對應的javaBeans,所以再來需要建立「Memberinfo.java」:

public class Memberinfo {
    private Integer idmemberinfo;
    private String id;
    private String member_name;
    private String member_password;
    private Integer sex;
    private Integer department;
    private String e_mail;
    private Integer web;
}

以上只有beans,接下來可以利用Eclipse中的功能,快速建立getter and setter方法:在頁面中按滑鼠右鍵,選擇「source–>Generate Getters and Setters…」,按下「Select All」並且確定,程式就會自動長成下面那個樣子。

package hibernate.domain;
public class Memberinfo {
  private Integer idmemberinfo;
  private String id;
  private String member_name;
  private String member_password;
  private Integer sex;
  private Integer department;
  private String e_mail;
  private Integer web;

  public Integer getIdmemberinfo() {
    return idmemberinfo;
  }
  public void setIdmemberinfo(Integer idmemberinfo) {
    this.idmemberinfo = idmemberinfo;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getMember_name() {
    return member_name;
  }
  public void setMember_name(String member_name) {
    this.member_name = member_name;
  }
  public String getMember_password() {
    return member_password;
  }
  public void setMember_password(String member_password) {
    this.member_password = member_password;
  }
  public Integer getSex() {
    return sex;
  }
  public void setSex(Integer sex) {
    this.sex = sex;
  }
  public Integer getDepartment() {
    return department;
  }
  public void setDepartment(Integer department) {
    this.department = department;
  }
  public String getE_mail() {
    return e_mail;
  }
  public void setE_mail(String e_mail) {
    this.e_mail = e_mail;
  }
  public Integer getWeb() {
    return web;
  }
  public void setWeb(Integer web) {
    this.web = web;
  }
}

寫完.java,在來需要設置memberinfo.hbm.xml,將javaBeans與資料庫表格做映射關連。

標籤的name屬性為所映射的物件,而table為所映射的表格中 column屬性指定了表格欄位,而 type屬性指定了User實例的中的id之型態。中主鍵的產生方式在這邊設定為”native”,表示主鍵的生成方式由Hibernate根據資料庫Dialect 的定義來決定,之後還會介紹其它主鍵的生成方式。

同樣的,標籤中的column與type都各自指明了表格中欄位與物件中屬性的對應。

設置好memberinfo.hbm.xml,記得至hibernate.cfg.xml指名映射文件的位置(請參閱上圖最下方的code),同理可證,之後每設置好一個xxxxx.hbm.xml就要記得指名映射文件。在使用Hibernate之前,必須先讀入hibernate.cfg.xml文件訊息,配置文件訊息在 Hibernate中對應的代表物件是Configuration物件,當中包括了配置文件訊息,您可以從Configuration中建立 SessionFactory物件,顧名思義,SessionFactory是用來建立Session物件,其作用類似於JDBC中的 Connection物件,不過負責更多關於一次資料庫操作會話的功能。


再來看看神奇的Hibernate如何將資料insert into資料庫中囉:

FirstHibernate.java

package hibernate.util;

import hibernate.domain.Memberinfo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class FirstHibernate {
  public static void main(String[] args) {
    Configuration config = new Configuration().configure();
    SessionFactory sessionFactory = config.buildSessionFactory();

    Memberinfo memberinfo = new Memberinfo();
    memberinfo.setId("Lawrance");
    memberinfo.setMember_name("Lawrance");
    memberinfo.setMember_password("lawrance");
    memberinfo.setSex(new Integer(2));
    memberinfo.setWeb(new Integer(2));

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.save(memberinfo);
    tx.commit();
    session.close();
    sessionFactory.close();
  }
}

只要剛剛以上的設置都沒有錯誤的話,新增FirstHibernate.java並且存檔執行之後,資料庫中就會出現資料囉!且console會顯示以下訊息:
Hibernate: insert into memberinfo (id, member_name, member_password, sex, department, e_mail, web) values (?, ?, ?, ?, ?, ?, ?)

如您所看到的,程式中只需要直接操作User物件,並進行Session與Transaction的相關操作,Hibernate就會自動完成對資料庫的操作,您看不到任何一行JDBC或SQL的陳述。


覺得還不夠神奇嗎?可以先去MySQL的memberinfo表格中新增一堆資料,新增十筆資料之後,咱們來建立一個新的class來測試好玩的Hibernate如何從資料庫中select資料吧。

HibernateDemo.java:

package hibernate.util;

import hibernate.domain.Memberinfo;
import java.util.Iterator;
import org.hibernate.Query;
import org.hibernate.Session;

public class HibernateDemo {
  public static void main(String[] args) {
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    // 使用HQL建立查詢
    Query query = session.createQuery("from Memberinfo");
    Iterator memberinfo = query.list().iterator();
    System.out.println("id \t name/e_mail");
    while(memberinfo.hasNext()) {
      Memberinfo m= (Memberinfo) memberinfo.next(); 
      System.out.println(m.getId() + " \t " + m.getMember_name() + "/" + m.getE_mail()); 
    }
    System.out.println();
    // 使用HQL建立查詢
    query = session.createQuery("from Memberinfo m where m.member_name like ?");
    // 設定查詢參數
    query.setParameter(0, "bluegray");
    memberinfo = query.list().iterator();
    System.out.println("id \t name/e_mail");
    while(memberinfo.hasNext()) {
      Memberinfo m= (Memberinfo) memberinfo.next(); 
      System.out.println(m.getId() + " \t " + m.getMember_name() + "/" + m.getE_mail());
    }
    session.close();
    HibernateUtil.shutdown();
    }
}

將上述的HibernateDemo.java編譯並執行之後,您在console發現什麼訊息了嗎?

(Visited 101 time, 1 visit today)
Facebooktwittergoogle_plusredditpinterestlinkedinmail
Comments are closed.