jsp hibernate 数据保存操作的原理

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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java中CopyOnWriteArrayList源码解析

    Java中CopyOnWriteArrayList源码解析 简介 CopyOnWriteArrayList是Java中并发编程常用的数据结构,在多线程的环境下,它可以保证线程安全。它的实现是通过在写入时复制整个数组,从而避免了并发写入数据时的冲突。 CopyOnWriteArrayList继承自AbstractList,同样实现了List接口。它在List的…

    Java 2023年5月26日
    00
  • Spring Security如何优雅的增加OAuth2协议授权模式

    下面是关于“Spring Security如何优雅的增加OAuth2协议授权模式”的完整攻略。 什么是OAuth2协议授权模式 OAuth2是一个开放标准协议,用于授权第三方应用访问用户在某个服务提供商上存储的资源。OAuth2协议有四种授权模式,分别是: 授权码模式(authorization code) 简化模式(implicit) 密码模式(resou…

    Java 2023年5月20日
    00
  • 如何在SpringBoot+Freemarker中获取项目根目录

    在Spring Boot应用程序中,我们经常需要获取项目根目录的路径。在使用Freemarker模板引擎时,我们可以使用Freemarker的内置变量来获取项目根目录的路径。本文将详细介绍如何在Spring Boot+Freemarker中获取项目根目录的完整攻略,并提供两个示例说明。 1. 获取项目根目录的路径 在Spring Boot应用程序中,我们可以…

    Java 2023年5月18日
    00
  • jsp+servlet实现最简单的增删改查代码分享

    下面来详细讲解 JSP+Servlet 实现最简单的增删改查代码分享的完整攻略。 1. 准备工作 在开始编写代码之前,需要先准备好以下工具和环境: JDK 1.8 或以上版本 Tomcat 8 或以上版本 Eclipse 或其他 Java IDE 2. 创建项目 在 Eclipse 中创建新的动态 Web 项目,选择 Web Application 项目类型…

    Java 2023年6月15日
    00
  • 解析Java异步之call future

    解析Java异步之call future 在Java中,Future是JDK5中新增加的一个接口,可以用于异步调用方法,也就是说在调用Future的get方法时会阻塞,直到异步调用结束并返回结果。下面是一些详细步骤和示例说明。 1. 创建线程池 Java中的Future可以通过ExecutorService的submit方法来实现异步调用。因此我们需要先创建…

    Java 2023年5月26日
    00
  • spring boot实现过滤器和拦截器demo

    下面是关于“Spring Boot实现过滤器和拦截器demo”的完整攻略,包含两个示例说明。 Spring Boot实现过滤器和拦截器demo 在Spring Boot中,我们可以使用过滤器和拦截器来对HTTP请求进行处理。本文将详细介绍如何使用Spring Boot来实现过滤器和拦截器。 过滤器 过滤器是一种用于处理HTTP请求和响应的组件,它可以在请求到…

    Java 2023年5月17日
    00
  • Java 生成随机字符的示例代码

    生成随机字符可以使用Java中的Random类和StringBuilder类。Random类是Java中的随机数生成器,StringBuilder类用于构建字符串。 下面是生成随机字符的示例代码: import java.util.Random; public class RandomStringGenerator { private static fina…

    Java 2023年5月27日
    00
  • Java技术汇总

    Java技术汇总是一个比较综合的概念,包括JavaSE、JavaEE、JavaME等多个方向。如果想要掌握Java的全部技术,需要经过以下几个步骤: 第一步:掌握Java基础知识 JavaSE是Java语言的基础,包括基本语法、数据类型、面向对象编程、异常处理、多线程编程、IO流、反射、集合框架等核心知识点。掌握JavaSE是Java技术汇总的必要前提。 第…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部