在resin3.0中配置hibernate2.1.2連mysql
在resin3.0中配置hibernate2.1.2連mysql
Author : hamal
約定:
resin3 代表resin3.0的安裝根目錄
hibernate2 代表hibernate2.1.2的安裝根目錄
1. 在resin3下建立我們的web應用根,如resin3mydomain目錄(mydomain的目錄名可以隨意取,之後在配置文件中配置即可)
2. 在resin3mydomain目錄下分別建立resin3mydomainWEB-INFclasses目錄和resin3mydomainWEB-INFlib目錄。
這兩個目錄對應本web應用程序上下文的類裝載器搜索路徑(對於jar來說是resin3mydomainWEB-INFlib,對於class文件來說是resin3mydomainWEB-INFclasses)。我們把這兩個路徑分別稱為應用庫類路徑(用於存放和本應用相關的jar類庫)和上下文類路徑(用於存放本應用的class文件和xml配置文件)。
另外還有一個路徑是resin3lib目錄,我們稱該路徑為全局庫類路徑(存放於resin3服務器上,供該服務器上所有web應用共享使用的相關jar類庫)。
3. 本示例使用的是mysql數據庫,所以我們將mysql的jdbc驅動jar包(mm.mysql-2.0.4-bin.jar)放入resin3lib目錄中,之後該驅動將能被所有web應用所用。
4. 將hibernate2 hibernate2.jar文件拷貝到resin3mydomainWEB-INFlib 目錄下,然後拷貝hibernate2lib 目錄下必須的jar文件也拷貝到resin3mydomainWEB-INFlib 目錄下。如果你不是很清楚哪些包是你所需要的,可以參看hibernate2libREADME.txt文件,或者,再簡單一點,我們將hibernate2lib 目錄下的所有jar文件都拷貝到resin3mydomainWEB-INFlib 目錄下。
5. 現在我們開始配置resin的jdbc數據庫連接池。修改resin3confresin.conf文件
a) 搜索webapps,將webapps替換為我們自定義的應用目錄mydomain。
b) 查找<database>元素,取消該元素的注釋狀態,該文件的注釋采用的是html風格的注釋方式<!-- -->。
c) 將<database>元素修改為如下形式
<database>
<jndi-name>jdbc/mysql</jndi-name>
<driver type="org.gjt.mm.mysql.Driver">
<url>jdbc:mysql://192.162.125.3:3306/mysql</url>
<user>root</user>
<password>12345678</password>
</driver>
<prepared-statement-cache-size>8</prepared-statement-cache-size>
<max-connections>20</max-connections>
<max-idle-time>30s</max-idle-time>
</database>
如此resin的jdbc連接池配置完成。
6. 將hibernate2src目錄下的hibernate.properties、log4j.properties、oscache.properties文件拷貝到resin3 mydomainWEB-INFclasses目錄下。
7. 由於我們使用的是mysql數據庫,所以修改hibernate.properties文件中關於mysql部分的配置,並注釋掉原默認的HypersonicSQL配置。注釋配置就是在語句前加 # 符號。如:
#hibernate.dialect net.sf.hibernate.dialect.HSQLDialect
下面是一個典型的mysql配置:
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class org.gjt.mm.mysql.Driver
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://192.162.125.3:3306/mydb
hibernate.connection.username root
hibernate.connection.password 12345678
我們需要修改的就是下面3行:
url是指jdbc連接描述符,格式為jdbc:mysql://數據庫IP:端口號/數據庫名
username是指用於登陸該數據庫的用戶名
password該用戶密碼
8. 將hibernate和resin的數據庫連接池綁定。在目錄裡創建一個hibernate.cfg.xml文件,文件內容如下
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:comp/env/jdbc/mysql</property>
<property name="show_sql">true</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- Mapping files -->
<mapping resource="User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
該<session-factory>元素告訴hibernate使用resin中定義的jndi來連接數據庫, <mapping>子元素用於描述每一個映射數據庫表的配置文件路徑,
其聲明了User.hbm.xml是一個Hibernate XML映射文件,對應持久化類User。這個文件包含了把POJO類映射到數據庫表(或多個數據庫表)的元數據。我們稍後就回來看這個文件。讓我們先編寫這個POJO類,再看聲明它的映射元數據。
9. 在mysql中建立user表該表的格式如下:
User_id Password Nick_name E_mail
1 6666 hamal
[email protected]
2 6666 vampire
[email protected]
3 6666 ande
[email protected]
在resin3 mydomainWEB-INFclasses目錄下分別新建3個java文件:Test.java、HibernateUtil.java、User.java。
HibernateUtil.java源代碼如下:該類是一個輔助類,用於獲得一個靜態的SessionFactory,SessionFactory負責一個數據庫,也只對應一個XML配置文件(hibernate.cfg.xml)。
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
User.java 源代碼如下:Hibernate讓普通的Java對象(Plain Old Java Objects ,就是POJOs,有時候也稱作Plain Ordinary Java Objects)變成持久化類。一個POJO很像JavaBean,屬性通過getter和setter方法訪問,對外隱藏了內部實現的細節。
public class User {
private Integer id;
private String nick;
private String password ;
private String email;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Test.java 源代碼如下:
import javax.naming.*;
import net.sf.hibernate.*;
import java.util.*;
public class Test{
void Test(){
}
public static void insert(){
try{
Session hSession = HibernateUtil.currentSession();
Transaction tx= hSession.beginTransaction();
User newp = new User();
Integer id = new Integer("4");
newp.setId(id);
newp.setNick("love");
newp.setPassword("123");
newp.setEmail("
[email protected]");
hSession.save(newp);
tx.commit();
HibernateUtil.closeSession();
}catch(Exception e){
e.printStackTrace();
}
}
}
10. 編寫Hibernate XML映射文件
在resin3 mydomainWEB-INFclasses目錄下新建User.hbm.xml文件,文件內容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="User" table="user">
<id name="id" type="java.lang.Integer">
<column name="user_id" sql-type="Integer" not-null="true"/>
<generator class="assigned"/>
</id>
<property name="password" type="java.lang.String">
<column name="password" sql-type="varchar(20)"/>
</property>
<property name="nick" type="java.lang.String">
<column name="nick_name" sql-type="varchar(50)"/>
</property>
<property name="email" type="java.lang.String">
<column name="e_mail" sql-type="varchar(30)"/>
</property>
</class>
</hibernate-mapping>
簡單說明:
<class name="User" table="user">元素中的name屬性代表的是User類的全路徑名(即包名+類名的形式),table屬性代表的是該User類映射的數據庫表名。
<id name="id" type="java.lang.Integer">元素代表該表的主鍵,name屬性代表在User類中對應的類屬性名。
<column name="user_id" sql-type="Integer" not-null="true"/>元素代表該id屬性對應的數據庫user表中的user_id字段。
11. 界面測試:
我們在resin3mydomain目錄下新建一個test.jsp文件如下:
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title> This is a test! </title>
</head>
<body>
This is a test!
<%Test.insert();%>
</body>
</html>
12. 測試
好了,現在所有的准備工作都已經做完了,開始測試看看。
我們啟動rensin服務器,啟動文件為resin3binhttpd.exe,雙擊該文件即可。
在測試前我們看到的mysql中user表的內容如下。
User_id Password Nick_name E_mail
1 6666 hamal
[email protected]
2 6666 vampire
[email protected]
3 6666 ande
[email protected]
現在我們打開IE,在地址欄中輸入http://localhost:8080/test.jsp
當界面上正常顯示出This is a test!之後,我們再查看數據庫內容如下:
User_id Password Nick_name E_mail
1 6666 hamal
[email protected]
2 6666 vampire
[email protected]
3 6666 ande
[email protected]
4 123 love
[email protected]
恭喜,你已經完成了本次示例!