JPA的例子(in Web)

本文介绍了一个简单的JPA(Java Persistence API)应用实例,演示如何在Web应用中利用JPA进行数据库操作。具体包括环境配置、服务端代码编写、客户端HTML交互及数据库操作等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的简单例子借鉴了Java EE 5 tutorial中的例子,目的是看一看JPA(Java Persistence API)在WEB中的开发形式.例子中是在HTML中输入一个书籍ID,通过它来查询书籍的名字显示在页面上。

1.环境配置

1.1 JDK 5.0. 下载: http://java.sun.com/j2se/1.5.0/download.jsp

1.2 Java EE 5.0 App Server: 下载: https://glassfish.dev.java.net/public/downloadsindex.html

并且把install root设为$GLASSFISH_HOME.

启动App Server的命令是:

$GLASSFISH_HOME/bin/asadmin.bat start-domain

Glassfish App Server捆绑了一个数据库叫Derby,启动的命令是:

$GLASSFISH_HOME/bin/asadmin.bat start-database

2.编写服务端文件

2.1 在数据库中创建数据

CREATE TABLE WEB_BOOKSTORE_BOOKS
(bookId VARCHAR(8),
surname VARCHAR(24),
firstName VARCHAR(24),
title VARCHAR(96),
price FLOAT,
onSale SMALLINT,
calendar_year INT,
description VARCHAR(30),
inventory INT);

INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('201', 'Duke', '',
'My Early Years: Growing up on *7',
30.75, 0, 1995, 'What a cool book.', 20);

INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('202', 'Jeeves', '',
'Web Servers for Fun and Profit', 40.75, 1,
2000, 'What a cool book.', 20);

INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('203', 'Masterson', 'Webster',
'Web Components for Web Developers',
27.75, 0, 2000, 'What a cool book.', 20);

INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('205', 'Novation', 'Kevin',
'From Oak to Java: The Revolution of a Language',
10.75, 1, 1998, 'What a cool book.', 20);

INSERT INTO WEB_BOOKSTORE_BOOKS VALUES('206', 'Gosling', 'James',
'Java Intermediate Bytecodes', 30.95, 1,
2000, 'What a cool book.', 20);

                        List 1. SQL文件(bookstore.sql)

打开Derby数据库的对话窗,

$GLASSFISH_HOME/javadb/frameworks/NetworkServer/bin/ij.bat

创建一个叫bookstoredb数据库,然后创建表格.

ij> connect 'jdbc:derby://localhost:1527/bookstoredb;create=true';

ij> run 'bookstore.sql';

2.2 Entity类

Entity类实际上是一个JavaBean,它表示了一个数据库中的表.下面的Book类对应了表"TABLE WEB_BOOKSTORE_BOOKS".类中使用了以下3个annotation.

@Entity: 指定这个类为Entity.

@Table : 指定mapping的表.

@Id : 指定表中的主键.

package database;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
   

@Entity
@Table(name = "WEB_BOOKSTORE_BOOKS")
public class Book implements Serializable {
 private String bookId;
 private String description;
 private String firstName;
 private String surname;
 private String title;
 private boolean onSale;
 private float price;
 private int calendar_year;
 private int inventory;

 public Book() {
 }

 public Book(
     String bookId,
     String surname,
     String firstName,
     String title,
     float price,
     boolean onSale,
     int calendar_year,
     String description,
     int inventory) {
     this.bookId = bookId;
     this.title = title;
     this.firstName = firstName;
     this.surname = surname;
     this.price = price;
     this.onSale = onSale;
     this.calendar_year = calendar_year;
     this.description = description;
     this.inventory = inventory;
 }

 @Id
 public String getBookId() {
     return this.bookId;
 }

 public String getTitle() {
     return this.title;
 }

 public String getFirstName() {
     return this.firstName;
 }

 public String getSurname() {
     return this.surname;
 }

 public float getPrice() {
     return this.price;
 }

 public boolean getOnSale() {
     return this.onSale;
 }

 public int getCalendar_year() {
     return this.calendar_year;
 }

 public String getDescription() {
     return this.description;
 }

 public int getInventory() {
     return this.inventory;
 }

 public void setBookId(String id) {
     this.bookId = id;
 }

 public void setTitle(String title) {
     this.title = title;
 }

 public void setFirstName(String firstName) {
     this.firstName = firstName;
 }

 public void setSurname(String surname) {
     this.surname = surname;
 }

 public void setPrice(float price) {
     this.price = price;
 }

 public void setOnSale(boolean onSale) {
     this.onSale = onSale;
 }

 public void setCalendar_year(int calendar_year) {
     this.calendar_year = calendar_year;
 }

 public void setDescription(String description) {
     this.description = description;
 }

 public void setInventory(int inventory) {
     this.inventory = inventory;
     }
 }

                                      List 2. Book.java

2.3 数据库操作类

这个类提供了对数据库操作的方法,实际上是通过EntityManager类中的方法进行操作的.而EntityManager类是由EntityManagerFactory生成的.

package database;

import java.util.*;
import javax.persistence.*;

import database.Book;
import exception.BookNotFoundException;

public class BookDBAO {
 private ArrayList books;
 private EntityManager em;

 public BookDBAO(EntityManagerFactory emf) throws Exception {
   em = emf.createEntityManager();
 }

 public void remove() {
     try {
       em.close();
     } catch (Exception ex) {
       System.out.println(ex.getMessage());
     }
 }

 public Book getBook(String bookId) throws BookNotFoundException {
     Book requestedBook = em.find(Book.class, bookId);
     if(requestedBook == null) {
       throw new BookNotFoundException("Couldn't find book: " + bookId);
     }

     return requestedBook;
 }  
}

                                                List 3.BookDBAO.java

2.4 BookNotFoundException类

BookDBAO.java中所使用的类.

package exception;

public class BookNotFoundException extends Exception {
 public BookNotFoundException() {
 }

 public BookNotFoundException(String msg) {
     super(msg);
 }
}

                                List 4. BookNotFoundException.java

2.5 Servlet类

在这个类中由container注入一个EntityManagerFactory并且把它传递给BookDBAO类.注意EntityManagerFactory 的注入需要在由容器管理的实体中进行(比如Servlet).

package servlets;

import java.io.PrintWriter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;

import database.Book;
import database.BookDBAO;
import exception.BookNotFoundException;

public class BookStoreServlet extends HttpServlet {
 private BookDBAO bookDBAO;

 @PersistenceUnit
 private EntityManagerFactory emf;

 public void init() throws ServletException {
     try{
                 bookDBAO = new BookDBAO(emf);
     }catch(Exception ex){
             System.out.println("Couldn't create bookstore database bean: "
             + ex.getMessage());
     }

     if (bookDBAO == null) {
       throw new UnavailableException("Couldn't get database.");
     }
 }

 public void destroy() {
     bookDBAO = null;
 }

 public void doGet(
     HttpServletRequest request,
     HttpServletResponse response) throws ServletException, IOException {
     HttpSession session = request.getSession();

     //set content-type header before accessing the Writer
     response.setContentType("text/html");
     response.setBufferSize(8192);

     PrintWriter out = response.getWriter();

     String bookId = request.getParameter("bookid");

     try {
       Book bd = bookDBAO.getBook(bookId);
       out.println(bookId+": "+ bd.getTitle());
     }catch(BookNotFoundException bnf){
       out.println("The book not found.");
     }catch(Exception e){
       e.printStackTrace();
     }
     out.close();
 }
}

                                      List 5. BookStoreServlet.java

2.6 web.xml

部署时的文件.

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
   <servlet-name>BookStoreServlet</servlet-name>
   <servlet-class>servlets.BookStoreServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>BookStoreServlet</servlet-name>
   <url-pattern>/bookstore</url-pattern>
</servlet-mapping>

</web-app>

                                        List 6. web.xml

2.7 persistence.xml

用描述文件persistence.xml来定义persistence unit.打包做成WAR文件,可以把它放在WEB-INF/classes/META-INF之下.在这使用了Glassfish预先定义好了的DataSource--jdbc/__default.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
 <persistence-unit name ="bookstore">
   <jta-data-source>jdbc/__default</jta-data-source>
 </persistence-unit>
</persistence>

                                    List 7. persistence.xml

3.客户端的HTML文件

<html>
<head>
 <title>JPA in Web example</title>
</head>
<body>

<form action="bookstore" method="GET">
BookId: <input type="text" name="bookid"> <br/>
Search: <input type="submit" value="submit">
</form>

</body>
</html>

                                    List 8. bookstore.html

4.编译,部署,运行.

$ javac -classpath .\;$GLASSFISH_HOME/lib/javaee.jar servlets/BookStoreServlet.java

编译好文件,按照WEB格式打成WAR包,把这个包直接拷贝到$GLASSFISH_HOME/domains/domain1/autodeploy下,这样就可以测试了.

BookId:
Search:

输入206,会看到如下反馈.

206: Java Intermediate Bytecodes

通过调用EntityManager的一些其他方法,还可以进行对数据库的其他操作.

5.其他

数据库停止命令,

$GLASSFISH_HOME/bin/asadmin.bat stop-database

服务器停止命令,

$GLASSFISH_HOME/bin/asadmin.bat stop-domain

### 关于 Web 前端毕业设计的源代码示例 对于基于 SpringBoot 的 Web 前端与数据库接口设计的毕业设计,可以参考一些开源项目来理解其架构和实现方式。以下是几个常见的功能模块及其对应的代码示例: #### 1. **Spring Boot 后台服务** Spring Boot 提供了一个简洁的方式来创建独立运行、生产级别的应用程序。以下是一个简单的 RESTful API 示例,用于处理前端请求并返回 JSON 数据。 ```java @RestController @RequestMapping("/api/data") public class DataController { @GetMapping public List<String> getData() { return Arrays.asList("Data1", "Data2", "Data3"); } } ``` 此代码片段定义了一个控制器类 `DataController`,它提供了一个 `/api/data` 接口,当客户端发送 GET 请求时会返回一组字符串列表[^1]。 --- #### 2. **Vue.js 前端页面** Vue 是一种流行的 JavaScript 框架,适合构建单页应用 (SPA) 并与后端进行交互。下面是一段 Vue 组件代码,展示了如何调用上述 Spring Boot 提供的 API 并显示数据。 ```vue <template> <div> <h1>Data from Backend</h1> <ul> <li v-for="item in items" :key="item">{{ item }}</li> </ul> </div> </template> <script> export default { data() { return { items: [] }; }, created() { fetch('http://localhost:8080/api/data') .then(response => response.json()) .then(data => (this.items = data)); } }; </script> ``` 这段代码实现了组件加载完成后自动向后端发起 HTTP 请求,并将接收到的数据渲染到页面上[^1]。 --- #### 3. **ECharts 图表展示** 为了提高用户体验,可以通过 ECharts 将数据以图形化形式呈现出来。以下是如何在 Vue 中集成 ECharts 的简单例子。 ```javascript import * as echarts from 'echarts'; export default { mounted() { const chartDom = document.getElementById('main'); const myChart = echarts.init(chartDom); const option = { title: { text: 'Sample Chart' }, tooltip: {}, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed'] }, yAxis: { type: 'value' }, series: [{ data: [120, 200, 150], type: 'bar' }] }; myChart.setOption(option); } }; ``` 该脚本初始化了一张柱状图,其中 X 轴表示天数,Y 轴则代表对应数值。 --- #### 4. **数据库连接配置** 通常情况下,在实际项目中还需要完成数据库的操作。这里给出 MySQL 配置文件的一个基本模板。 ```properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.jpa.hibernate.ddl-auto=update ``` 这些属性指定了 JDBC URL 地址以及登录凭证等内容,便于程序访问指定关系型数据库实例存储业务所需资料。 --- ### 总结说明 以上内容涵盖了从后端逻辑编写至前端界面搭建再到最终数据分析可视化的全过程描述。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值