在 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>
|