Hibernate入门示例

本文详细介绍了如何在JavaWeb应用中使用Hibernate进行数据访问,包括创建数据库表、设计持久化类、配置文件和映射文件,以及在RegisterServlet中处理用户注册并将数据插入MySQL数据库的过程。
摘要由CSDN通过智能技术生成

 在 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、创建数据库

2、创建视图层页面

3、设计持久化类

4、设计Hibernate配置文件

5、设计映射文件

6、设计Hibernate的基础类HibernateSessionFactory.java

7、设计控制类

8、配置web.xml


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>

Hibernate入门示例(架构图)_atgoingguoat的专栏-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值