一个简单的Hibernate入门示例

769阅读 0评论2011-08-02 高傲的活着
分类:

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

<!-- 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"
"">

<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 SessionFactory 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=""
    xmlns:xsi=""
    xsi:schemaLocation="
    /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>

上一篇:一个简单的登陆网页设计(JSP+MySQL+Tomcat)
下一篇:续《一个简单的Hibernate入门示例》