一、实验目的
掌握Hibernate框架的相关知识,学会Hibernate的对数据库的操作过程。
二、实验原理
1 Hibernate技术简介
Hibernate是封装了JDBC的一种开源的对象/关系映射(Object-Relation Mapping,ORM)框架,使程序员可以使用面向对象的思维来操作数据库。
Hibernate是目前最流行的ORM框架,它是一个面向Java环境的对象/关系数据库映射工具,是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate真正实现了开发者采用面向对象的方式来操作关系数据库。
程序中的数据以某种形式保存到某存贮介质中就称为数据的持久化。有多种技术可以实现数据的持久化:
(1)Serialization:序列化,可将对象存储到文件中。
(2)JDBC:可将对象存储到数据库中。
(3)对象关系映射(ORM):可将对象通过对象/关系映射存储到关系数据库中。
(4)对象数据库(ODB):以对象为存储单位的新型数据库。
ORM的全称是Object/Relation Mapping,即对象/关系映射,是为了解决关系数据库和面向对象模型不匹配而产生的一门非常实用的工程技术,它实现了程序对象到关系数据库数据的映射,允许开发者采用面向对象的方式操作数据库。
对于使用Hibernate框架的开发者,主要任务是:设计PO类、编写Hibernate配置文件和映射文件,然后利用Hibernate API来操作数据库。Hibernate通过配置文件和映射文件(*.hbm.xml)把Java对象或持久化对象(Persistence Object,PO)映射到数据库的表格,然后通过操作PO,对数据库中的数据进行增、删、改、查等操作。
2 Hibernate核心组件
(1)Hibernate配置文件主要用来配置数据库连接参数,例如:数据库驱动程序、URL、用户名、密码等。它有两种格式hibernate.properties和hibernate.cfg.xml。两者配置内容基本相同,通常使用后者。
(2)映射文件(*.hbm.xml)用来把PO与数据库中的数据表映射起来,是Hibernate核心文件。
(3)Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
(4)SessionFactory接口:产生Session实例的工厂。
(5)Session接口:用来操作PO。它有get()、save()、update()、delete()等方法用来对PO进行加载、保存、更新及删除等操作。它是Hibernate的核心接口。
(6)Transaction接口:用来管理Hibernate事务,主要方法有commit()和rollback(),可从Session的beginTransaction()方法生成。
(7)Query接口:用来对PO进行查询操作。它可从Session的createQuery()方法生成。
(8)持久化对象(Persistent Object,PO)可以是普通的JavaBean,唯一特殊的是他们与一个Session相关联。
3 Hibernate运行过程与编程步骤
Hibernate运行过程:
(1)应用程序先调用Configuration类,该类读取配置文件和映射文件,根据这些信息生成SessionFactory对象。
(2)由SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象。
(3)通过Session对象的方法对PO进行加载、保存、更新、删除等操作;在查询的情况下,通过Session对象生成一个Query对象执行查询操作。
(4)如果没有异常, Transaction对象将提交操作结果到数据库中,否则事务将回滚。
使用hibernate编程,首先要创建一个Web工程(或Java工程),然后按以下步骤实现。
(1)配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件。
(2)编写持久化类(POJO类)。
(3)编写映射文件:Xxxxx.hbm.xml,其中,Xxxxx一般采用POJO名称。
(4)编写hibernate配置文件:hibernate.cfg.xml。
(5)调用Hibernate API,完成所要求的业务处理。
三、实验内容
利用Hiibernate实现用户信息的注册,即,将用户注册页面的提交信息,利用Hibernate将注册信息通过持久化对象写到MySql数据库中。
(1)建立Web工程:HibernateTest
(2)加入有关的jar包:将8个Hibernate核心jar包和MySql驱动程序jar包加入到工程中。
(3)建立对象模型;User类,代码如下:
package domain;
import java.util.Date;
public class User {
private int id;
private String name;
private String birthday;
//省略了get、set方法
}
(4)建立映射文件User.hbm.xml,代码如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="domain"> //类“User”所在的包名
<class name="User"> //建立的POJO名称:User
<id name="id"> //类中定义的属性,并作为主键
<generator class="native"/> //主键形成方式:由hibernate自动创建主键值
</id><property name="name"/> //类中定义的属性
<property name="birthday" /> //类中定义的属性
</class> </hibernate-mapping>(5)建立数据库配置文件hibernate.cfg.xml:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory><property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url"> jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!—指定数据库方言,采用的是MySQL数据库—>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!—根据映射文件,自动创建数据库表,但数据库test要在MySQl中先创建—>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<mapping resource="domain/User.hbm.xml"/> //指定映射文件
</session-factory> </hibernate-configuration>(6)设计提交注册信息页面:login.jsp,代码如下;
<%@ page language="java" pageEncoding="UTF-8"%>
<html> <head><title>用户注册提交页面</title></head> <body> <form action="loginservlet" method="post"> 用户名:<input type="text" name="xm"><br><br>
出生日期:<input type="text" name="brithday"><br><br>
<input type="submit" value="登录">
</form>
</body>
</html>
7)在Servlet中调用Hibernate API完成数据库操,创建Servlet,LoginServlet.java,代码如下:
package servlets;
import java.io.IOException;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import domain.User;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String brithday=request.getParameter("brithday");
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = null;
Transaction tx = null;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
User user = new User();
user.setName(name);
user.setBirthday(brithday);
session.save(user);
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
if (session != null) session.close();
PrintWriter out = response.getWriter();
out.println("注册操作完成!");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
(8)Servlet的配置文件Web.xml,代码如下:
<servlet><servlet-name>LoginServlet</servlet-name>
<servlet-class>servlets.LoginServlet</servlet-class>
</servlet> <servlet-mapping><servlet-name>LoginServlet </servlet-name>
<url-pattern>/loginservlet</url-pattern>
</servlet-mapping>版权归原作者 做自己的王191 所有, 如有侵权,请联系我们删除。