您的位置:首页 > 其它

一个简单的Hibernate入门示例

2008-11-13 13:16 417 查看
在 Java Web 开发应用中,Hibernate可以作为应用程序的数据访问层。
这里以一个简单用户注册用例来说明如何开发一个Hibernate的应用程序。
该例子的需求:把注册页面输入的用户名、密码、性别、年龄方面的信息存入数据库中。
如果采用经典的MVC模式的话,那么各层的构建如下:
视图层:注册页面(register.jsp)、反馈信息页面(reply.jsp)
控制层:RegisterServlet.java
模型层/数据访问层:基础类HibernateSessionFactory.java、持久化类Register.java、
配置文件hibernate.cfg.xml、映射文件register.hbm.xml等等
数据库层:采用MySQL数据库,数据表t_register

下面分步来构建这个Hibernate应用程序。

1、创建数据库
DROP TABLE IF EXISTS `t_register`;
CREATE TABLE `t_register` (
`id` int(11) NOT NULL,
`username` varchar(30) collate utf8_unicode_ci default NULL,
`password` varchar(30) collate utf8_unicode_ci default NULL,
`sex` varchar(10) collate utf8_unicode_ci default NULL,
`age` int(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
2、创建视图层页面
清单1:register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
<head>
<title>用户注册页面</title>
</head>

<body>
<form action="RegisterServlet" method="post">
用户名:
<input type="text" name="username">
<br>
密码:
<input type="password" name="password">
<br>
性别:
<input type="text" name="sex">
<br>
年龄:
<input type="text" name="age">
<br />
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
清单2:reply.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<html>
<head>
<title>Successfully</title>
</head>
<body>
Inster data into database <br>
</body>
</html>
3、设计持久化类
对应于数据库中表项。
清单3:Register.java
package register;

public class Register {
int id;
Integer age;
String username = new String();
String password = new String();
String sex = new String();

public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
4、设计Hibernate配置文件
清单4:hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">jdbc:mysql://localhost:3306/study</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="myeclipse.connection.profile">MySQL</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<mapping resource="register.hbm.xml" />
</session-factory>

</hibernate-configuration>
5、设计映射文件
数据库表到Java类数据项的映射
清单5:register.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 package="register">
<class name="register.Register" table="T_Register">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="increment"></generator>
</id>

<property name="username" type="java.lang.String">
<column name="username" length="30" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="30" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" length="10" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>

</class>
</hibernate-mapping>
6、设计Hibernate的基础类HibernateSessionFactory.java
HibernateSessionFactory.java包含了Configuration实例、SessionFactory实例和Session实例的生成函数,
这样应用程序就可以直接调用HibernateSessionFactory来生成Session实例,不必再重复编写Configuration实例、
SessionFactory实例和Session实例的生成代码了。
清单6:HibernateSessionFactory.java
package register;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal threadLocal = new ThreadLocal();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;

private HibernateSessionFactory() {
}

/**
* Returns the ThreadLocal Session instance. Lazy initialize
* the <code>SessionFactory</code> if needed.
*
* @return Session
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();

if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}

return session;
}

/**
* Rebuild hibernate session factory
*
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}

/**
* Close the single hibernate session instance.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);

if (session != null) {
session.close();
}
}

/**
* return session factory
*
*/
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}

/**
* return session factory
*
* session factory will be rebuilded in the next call
*/
public static void setConfigFile(String configFile) {
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}

/**
* return hibernate configuration
*
*/
public static Configuration getConfiguration() {
return configuration;
}

}
7、设计控制类
从页面提取数据,然后调用HibernateSessionFactory通过Hibernate机制将数据插入到数据库中。
清单7:RegisterServlet.java
package register;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.hibernate.*;

public class RegisterServlet extends HttpServlet{

private static final String CONTENT_TYPE = "text/html; charset=GBK";

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);

//从页面得到数据值

String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
Integer age = new Integer(request.getParameter("age"));

//将值传递给持久类->对应的是数据库里的表

Register rg = new Register();
rg.setUsername(username);
rg.setPassword(password);
rg.setSex(sex);
rg.setAge(age);

Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();

try {
session.save(rg);//保存,准备提交

tx.commit();//提交到数据库

session.close();
response.sendRedirect("reply.jsp");
} catch (Exception e) {
e.printStackTrace();
tx.rollback();//出现异常,将刚刚提交动作回转,rollback

}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
8、配置web.xml
清单8:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>register.RegisterServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/RegisterServlet</url-pattern>
</servlet-mapping>

</web-app>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: