`
maiguang
  • 浏览: 263351 次
  • 性别: Icon_minigender_1
  • 来自: 焦作
社区版块
存档分类
最新评论

JPA的例子(in Web)

阅读更多

下面的简单例子借鉴了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

分享到:
评论

相关推荐

    springBoot+springjpa.docx

    在这个例子中,`index` 是 Thymeleaf 视图模板的名称。Spring Boot 将自动查找位于 `src/main/resources/templates` 目录下的模板文件。 通过以上步骤,我们成功地构建了一个简单的 Spring Boot 应用程序,集成了 ...

    JSF Web应用例子.pdf

    ### JSF Web应用示例详解 #### 一、概述 本文档主要介绍如何使用JavaServer Faces(简称JSF)框架创建一个简单的Web应用...此外,案例中还展示了如何结合JPA进行数据持久化操作,这对于构建完整的Web应用至关重要。

    jsf in action 中文版

    **JSF(JavaServer Faces...总之,“JSF in Action 中文版”为初学者提供了一个全面学习JSF的资源,通过阅读和实践书中提供的例子,开发者不仅可以掌握JSF的基础,还能探索其高级特性,从而在Web开发领域更加得心应手。

    seam 的eclipse工程例子3

    通过使用`@Name`注解来定义组件名,`@In`和`@Out`注解来注入和暴露依赖。 5. 创建JSF页面:Seam与JSF的集成使得在JSF页面上可以直接使用Seam组件。你可以在`.xhtml`页面中使用`&lt;s:&gt;`或`标签来引用Seam组件。 6. ...

    Spring in Action 英文版

    - Spring高级主题,包括与数据持久化的集成(如使用Spring Data JPA),以及集成安全框架(如Spring Security)。 - Spring Boot的介绍,这是Spring大家族中的一个最新成员,它简化了Spring应用的配置和部署。 - ...

    Jboss In Action

    通过`jbia-src`中的例子,你可以看到如何创建和打包应用,以及如何将它们放入`deployments`目录以实现自动部署或手动部署。 JBoss还提供了模块化系统,允许你管理应用程序的依赖关系。理解如何组织和声明模块,以及...

    SSH框架整合现成的例子

    &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt; &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt; &lt;/plug-in&gt; ``` 4. **Hibernate...

    Struts in Action 中文修正版

    《Struts in Action》是Java Web开发领域的一本经典著作,专注于Apache Struts框架的实践应用。这本书由Mike Keith和Manning Publications合作出版,中文修正版则是由热心开发者“铁手”翻译,为国内读者提供了方便...

    spring in action

    《Spring in Action》是一本备受推崇的Spring框架详解书籍,其深入浅出地介绍了Spring的核心概念、使用方法以及在实际开发中的...通过阅读和实践书中的例子,读者将能够熟练运用Spring框架,构建高效、稳定的Java应用。

    Spring in Action 3rd Edition Craig Walls

    1. **易于理解**:本书通过简洁明了的例子帮助读者快速掌握Spring的核心概念和技术细节。 2. **全面覆盖**:内容涵盖了Spring框架的主要功能,包括依赖注入、面向切面编程、数据访问等。 3. **实践导向**:作者强调...

    Manning - Spring in Action.rar

    书中将介绍如何使用Spring Data JPA、Spring JDBC Template和MyBatis与Spring的集成。 5. **Spring MVC**:Spring的Web MVC框架为构建Web应用提供了强大的支持。书中会讲解控制器、模型视图、视图解析器以及如何...

    JSF in Action

    《JSF in Action》这本书是JavaServer Faces技术的权威指南,深入浅出地介绍了JSF这一基于MVC(Model-View-Controller)架构的Java Web开发框架。JSF(JavaServer Faces)是Oracle公司推出的标准,旨在简化企业级Web...

    Manning.Spring.in.Action.3rd.Edition

    - **单元测试与集成测试**:书中强调了测试的重要性,并提供了使用JUnit和Mockito进行测试的具体例子。 - **Spring与其他框架的集成**:如与MyBatis、Hibernate等持久层框架的集成。 #### 社区评价 - **专业性**:...

    Manning EJB3.0 in action

    根据提供的文件信息,我们可以推断出这是一本关于EJB 3.0的书籍,书名为《Manning EJB3.0 in action》。虽然标题和描述中的故事似乎与EJB 3.0无关,但从部分内容来看,这本书显然是专注于EJB 3.0的技术细节及其在...

    Manning.Spring.in.Action.4th.Edition.2016.8

    根据所提供的文件信息,可以看出这是一本关于Spring框架的书籍,具体为《Spring in Action, Fourth Edition》的介绍。这本书由Craig Walls编写,出版日期为2016年8月,由Manning Publications出版。本书被赞誉为...

    spring in action 第三版中文

    此外,Spring Data项目提供了对多种数据存储(如JPA、MongoDB等)的一致性访问接口,降低了学习成本。书中将介绍如何使用这些工具进行数据访问。 事务管理是确保数据一致性的关键。Spring支持编程式和声明式事务...

    Activiti in Action 源码

    《Activiti in Action 源码》是一本深入解析Activiti工作流引擎的书籍,其源码涵盖了多种应用场景和技术整合,对于理解Activiti的工作原理、扩展性和实际应用有着极高的价值。以下将针对这些源码文件进行详细解读。 ...

Global site tag (gtag.js) - Google Analytics