`
lixucheng
  • 浏览: 79908 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java持久性API(JPA)第2讲——完成信息添加

    博客分类:
  • JPA
阅读更多
目标:
  • 通过如下调用过程完成用户信息的添加,在JSP页面输入用户信息,提交给Servlet,Servlet调用会话Bean,会话Bean调用实体类。
  • 掌握JPA的基本概念。
包括两部分内容:
  • 添加功能
  • JPA概述
添加功能的开发过程如下:
  • 在UserSession会话Bean中添加业务方法
  • 编写输入用户信息的界面addUser.jsp
  • 编写添加功能的控制器AddUserServlet.java
JPA概述的内容包括:
  • 使用JPA完成与数据库的交互,与使用JDBC完成与数据库的交互,这两种方式之间的区别
  • Java持久性要解决的问题
  • 编写实体类需要编写的文件
  • 如何访问实体类
  • 常用的JPA接口
下面分别进行介绍。
注意:本次内容的实例基于第一讲。
第一部分:添加功能
在UserSession会话Bean中添加业务方法
首先需要在业务接口中添加方法的声明,然后在Bean类中实现该方法。
在业务接口UserManagerRemote.java中添加如下方法声明:
public void addUser(String userid,String username,String userpass,char usertype);
在Bean类UserManagerBean.java中添加如下方法:
public void addUser(String userid,String username,String userpass,char usertype){
Userinfo user = new Userinfo(userid,username,userpass,usertype);
em.persist(user);
}
em是上一次实例中在Bean类中注入的EntityManager对象,persist方法完成持久化,相对于数据库的插入操作。通过这个方法对象user中的信息就被写入到数据库了。
编写输入用户信息的界面addUser.jsp
在UserWeb中添加JSP文件,用于添加用户信息,代码如下:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%--
The taglib directive below imports the JSTL library. If you uncomment it,
you must also add the JSTL library to the project. The Add Library... action
on Libraries node in Projects view can be used to add the JSTL 1.1 library.
--%>
<%--
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>JSP Page</h1>
<form action="AddUserServlet" method="POST">
用户ID:<input type="text" name="userid" value="" /><br>
用户名:<input type="text" name="username" value="" /><br>
口令:<input type="password" name="userpass" value="" /><br>
权限:<select name="usertype">
<option value="0">普通用户</option>
<option value="1">管理员</option>
</select><br>
<input type="submit" value="提交" /><input type="reset" value="重置" />
</form>
</body>
</html>
其中红色部分的代码声明了要提交给AddUserServlet进行处理。
编写添加功能的控制器AddUserServlet.java
AddUserServlet控制器完成的功能如下:
u 获取用户输入的信息
u 调用业务方法
u 转向显示信息的界面
AddUserServlet的代码如下(红色部分是需要自己添加的代码):
/*
* AddUserServlet.java
*
* Created on 2007523, 上午6:22
*/
package jpa.web;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;
/**
*
* @author Administrator
* @version
*/
public class AddUserServlet extends HttpServlet {
@EJB
UserManagerRemote user;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String userid = request.getParameter("userid");
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
String usertype = request.getParameter("usertype");
user.addUser(userid,username,userpass,usertype.charAt(0));
RequestDispatcher rd = request.getRequestDispatcher("FindAllUserServlet");
rd.forward(request,response);
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
测试
重新部署EJB和Web应用,然后访问:http://localhost:8080/UserWeb/addUser.jsp
在这个界面输入一个用户信息,然后提交,提交之后可以看到新添加的用户。
第二部分:JPA概述
JPA与JDBC的比较
以前我们通过JDBC完成与数据库的交互,基本过程如下:
n 加载驱动程序;
n 创建连接
n 编写SQL语句
n 创建语句对象;
n 执行SQL语句;
n 对结果进行处理
使用JPA完成查询的过程如下:
em.createQuery(…).getSingleResult()或者em.createQuery(…).getResultList()
使用JPA完成添加的过程如下:
em.persist(User)
相比之下,使用JPA大大减少了编程人员的工作量。但前提是由持久性提供者提供很多实现,编程人员需要编写实体类。下面介绍持久性提供者需要解决的主要问题以及如何编写实体类。
Java持久性要解决的问题
简单的说,Java持久性要解决的主要问题就是内容中对象与数据库中实体之间的同步,涉及的主题如下:
n 数据库信息配置,包括数据库位置、名字、用户名和口令等,另外需要JDBC驱动程序;
n 对象数据的加载,从实体到对象;
n 实体数据的更新,从对象到实体;
n 数据的查询,从数据库加载数据;
n 数据库中实体的关系与内存中对象之间关系的映射;
n 批量处理,包括批量添加、删除、修改等;
n 安全问题;
n 事务问题。
如何编写实体类
所有的实体类应该有一个持久单元来管理,持久单元在一个xml文档中声明。下面的代码就是前面实例中用到的配置文件persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="UserPU" transaction-type="JTA">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
<jta-data-source>entity2</jta-data-source>
<properties>
<property name="toplink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
最主要的作用就是声明持久单元对应的数据库,通常使用数据源的名字来确定。另外可以声明有哪些实体类。
实体类用于表示数据库中的表,实体类的编写主要确定如下信息:
n 该实体与数据库中的哪个表对应;
n 实体类中的属性与表中的哪个字段对应;
n 实体类中的哪个属性是主键。
编写实体类的时候的主要知识点包括:
声明该类为实体类:
@Entity
声明该实体类与哪个表对应:
@Table(name = "userinfo")
声明该实体类与表中的哪个列对应:
@Column(name = "userid", nullable = false)
private String userid;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "userpass", nullable = false)
private String userpass;
@Column(name = "usertype", nullable = false)
private char usertype;
声明该实体类的主键:
@Id
@Column(name = "userid", nullable = false)
private String userid;
完整的代码参考第一讲。
如何访问实体类
从前面的查询所有用户的功能和添加用户的功能可以看出,对实体的操作主要是通过EntityManager接口完成,如果要查询,需要使用Query接口。
常用的JPA接口
常用的接口如下:
EntityManager接口,完成实体的管理,包括创建查询、删除实体、查询实体和添加实体等。
Query接口,完成各种查询,通常有EntityManager创建,主要使用JPA的查询语言完成,也可以使用标准的SQL语言。
EntityManagerFactory接口,用于创建EntityManager,如果不能注入EntityManager,需要使用EntityManagerFactory创建。
Persistence接口,用于创建EntityManagerFactory对象。

更多内容可以参考《Java EE 5实用教程——基于WebLogic和Eclipse》

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics