JSP是Java Web应用中常用的视图层技术,而Hibernate则是Java编程语言中非常流行的ORM框架。这两种技术结合使用可以方便、快速地实现Web应用中的数据持久化操作。
在开发中,我们通常需要涉及到实例化Hibernate SessionFactory,并设置相关数据源连接池与映射文件路径等参数;创建Hibernate映射文件、实体对象类以及相关业务逻辑类,同时封装Hibernate的数据操作方法;在JSP页面中通过EL表达式或JSTL标签等方式调用业务逻辑类的方法实现数据的增删改查等操作。下面就进一步讲解这些步骤的具体实现方法:
一、Hibernate数据持久化配置与实现
1.1 配置 HibernateSessionFactory
用Java编写的Web应用开发时,可以通过在Web容器启动后创建一个全局的Hibernate SessionFactory实例来进行操作。Hibernate SessionFactory 的实现基于 Configuration 对象和 Java Bean 的 DataSource 对象,包括了 Hibernate 映射文件的属性、数据库的连接池等相关信息。下面是一个配置示例:
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
} catch (Throwable ex) {
// 打印异常信息
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
// 初始化 Session
public static Session getSession() {
return sessionFactory.getCurrentSession();
}
// 关闭 Session
public static void closeSession() {
Session session = sessionFactory.getCurrentSession();
if (session != null && session.isOpen()) {
session.close();
}
}
}
在这个类中,我们创建了一个静态的 SessionFactory 变量,该变量是应用程序全局唯一的,用于 Hibernate ORM 操作时,使用 Hibernate SessionFactory 获取 Session 对象,再进行数据的持久化操作。
1.2 创建 Hibernate 的映射文件和实体对象类
在项目中,我们首先需要定义 Hibernate 映射文件,这些文件通常用 XML 格式编写,与实体对象的属性映射关系,如示例中的 Student.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>
<class name="com.xxx.Student" table="tbl_student" catalog="db_test">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</class>
</hibernate-mapping>
同时,我们需要创建实体对象类,该类需要与数据库中的表结构相对应,具有对应的属性和get/set方法。如下面的 Student 类:
public class Student {
private Integer id;
private String name;
private Integer age;
/* getter and setter goes here */
}
1.3 创建业务逻辑类
我们可以通过封装 Hibernate 的常用数据操作方法,创建可复用的通用业务逻辑类,以便于后续的开发。下面是 StudentDao 的示例代码:
public class StudentDao {
private Session session;
private Transaction transaction;
public StudentDao() {
session = HibernateUtil.getSession();
transaction = session.getTransaction();
}
public void save(Student student) {
try {
transaction.begin();
session.save(student);
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
}
}
}
在这个示例中,我们封装了 Hibernate CRUD 操作,包括创建保存、查询、删除、更新等方法,开发者可以通过继承并实现这个通用逻辑类,使得持久化操作更方便快速。
二、JSP页面操作 Hibernate 数据库
JSP 在 Java Web 应用中被广泛使用,主要用于呈现页面的视图模板。我们可以通过 JSP 完成具体的数据展示,实现类似增删改查等操作。
2.1 新建JSP页面,引入相关类
我们可以在 Web 应用的根目录下,新建一个 JSP 页面,如 create.jsp。在这个 JSP 文件中,我们需要引入 Hibernate 的常用类:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="org.hibernate.SessionFactory"%>
<%@ page import="org.hibernate.Session"%>
<%@ page import="org.hibernate.Transaction"%>
<%@ page import="java.util.List"%>
<%@ page import="com.xxx.Student"%>
<%@ page import="com.xxx.StudentDao"%>
同时,在页面中我们需要实例化 StudentDao 来操作数据库:
<%
StudentDao studentDao = new StudentDao();
Student student = new Student();
student.setName("test");
student.setAge(18);
studentDao.save(student);
%>
2.2 在 JSP 页面中展示数据库的内容
除了保存操作之外,我们还可以在 JSP 页面中展示保存成功后的数据。假设我们已经对数据库进行了压测,现在需要在页面中根据用户输入来查询数据并展示。我们可以通过类似如下代码来完成:
<%
Query q = session.createQuery("from Student s where s.name = :name");
q.setParameter("name", request.getParameter("name"));
List students = q.list();
%>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<% for (Student s : students) { %>
<tr>
<td><%= s.getId() %></td>
<td><%= s.getName() %></td>
<td><%= s.getAge() %></td>
</tr>
<% } %>
</table>
上面的代码利用 session 查询数据库中的学生信息,并在页面上展示查询出来的相关信息。但是,在生产环境中,避免把大量的数据库操作放在页面中,这样可能会导致应用响应变慢、页面加载时间太长等问题。
三、完整示例
下面是一些完整的示例代码,其中包含了数据库操作和 JSP 页面展示相关的代码。
3.1 Hibernate数据持久化操作的示例
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
// 初始化 Session
public static Session getSession() {
return sessionFactory.getCurrentSession();
}
// 关闭 Session
public static void closeSession() {
Session session = sessionFactory.getCurrentSession();
if (session != null && session.isOpen()) {
session.close();
}
}
}
public class StudentDao {
private Session session;
private Transaction transaction;
public StudentDao() {
session = HibernateUtil.getSession();
transaction = session.getTransaction();
}
public void save(Student student) {
try {
transaction.begin();
session.save(student);
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
}
}
}
public class Student {
private Integer id;
private String name;
private Integer age;
public Student() {}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3.2 JSP页面操作Hibernate数据库的示例
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="org.hibernate.SessionFactory"%>
<%@ page import="org.hibernate.Session"%>
<%@ page import="org.hibernate.Transaction"%>
<%@ page import="java.util.List"%>
<%@ page import="com.xxx.Student"%>
<%@ page import="com.xxx.StudentDao"%>
<%
StudentDao studentDao = new StudentDao();
Student student = new Student();
student.setName("test");
student.setAge(18);
studentDao.save(student);
Session session = HibernateUtil.getSession();
Query q = session.createQuery("from Student s where s.name = :name");
q.setParameter("name", "test");
List<Student> students = (List<Student>) q.list();
HibernateUtil.closeSession();
%>
<html>
<head>
<meta charset="UTF-8">
<title>Student Info</title>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
</thead>
<tbody>
<% for(Student s: students) { %>
<tr>
<td><%= s.getId() %></td>
<td><%= s.getName() %></td>
<td><%= s.getAge() %></td>
</tr>
<% } %>
</tbody>
</table>
</body>
</html>
在这个示例中,我们通过 JSP 展示了数据库中的数据,同时也展示了如何在 JSP 中完成 Hibernate 数据持久化的操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsp hibernate 数据保存操作的原理 - Python技术站