在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 hamal@sohu.com
2 6666 vampire vampire@sina.com
3 6666 ande ande@yahoo.com
在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("test@sohu.com");
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 hamal@sohu.com
2 6666 vampire vampire@sina.com
3 6666 ande ande@yahoo.com
现在我们打开IE,在地址栏中输入http://localhost:8080/test.jsp
当界面上正常显示出This is a test!之后,我们再查看数据库内容如下:
User_id Password Nick_name E_mail
1 6666 hamal hamal@sohu.com
2 6666 vampire vampire@sina.com
3 6666 ande ande@yahoo.com
4 123 love test@sohu.com
恭喜,你已经完成了本次示例!