Java持久性API(JPA)第4讲——删除和修改.doc

 
Java持久性API(JPA)——删除和修改
目标:使用JPA完成删除和修改功能。
主要内容包括:
u       根据主键查询
u       删除信息
u       修改信息
因为删除功能和修改功能都是对已有的实体进行操作,通常需要先得到实体,然后对实体进行操作,得到实体需要根据主键进行查询。所以在介绍删除和修改信息之前先介绍如何根据主键查询。
1、根据主键查询
在第3次课中介绍了使用Query查询信息。如果使用上次课介绍的方法也可以完成根据主键的查询。但是,因为根据主键的查询比较特殊,所在JPA中提供了特殊的处理方式。下面通过实例介绍如何根据主键进行查询。
例:根据用户ID查询用户信息,假设用户ID使用字符串变量“userid”表示,用户信息对应的实体类是Userinfo,该实体类就是前3次课中使用的实体类。
Userinfo user = em.find(Userinfo.class,userid);
方法的第一个参数是实体类,第二个参数是查询的主键,返回值是查询到的实体。如果实体不存在返回null。
具体用法在后面的例子中介绍。
2、删除信息
信息删除通常是在查询的基础上,选择要删除的信息,然后删除。信息删除的基本过程如下:
n         用户选择要删除的用户;
n         控制器介绍到请求之后,调用业务模型完成删除。
根据以上过程,需要编写3个文件:
n         模型部分,在会话Bean中添加“删除用户”的方法;
n         在用户列表界面userlist.jsp添加“删除”超链;
n         编写控制器DeleteUserServlet.java,完成删除功能的控制。
操作过程如下:
1) 在会话Bean中添加“删除用户”的方法
首先,需要在业务接口中声明,在UserManagerRemote.java中添加如下方法声明:
   public void deleteUser(String userid);
然后,在Bean类中实现方法,在UserManagerBean.java中添加如下代码:
      // 根据主键删除用户
      public void deleteUser(String userid){
          Userinfo user = em.find(Userinfo.class,userid);
          em.remove(user);
      }
首先使用EntityManager对象em的find方法查找到实体,第一个参数是实体的类型,第二个参数是要查找的实体的主键。然后调用EntityManager的remove方法删除实体。
与直接使用JDBC完成删除相比要简单。
2)在userlist.jsp中添加删除超链
修改<c:forEach>中的代码,红色部分是添加的代码:
            <c:forEach varStatus="status" var="user" items="${userlist}">
                <tr>
                    <td>${status.index+1}</td>
                    <td>${user.userid}</td>
                    <td>${user.username}</td>
                    <td>
                        <c:if test="${user.usertype==/"0/"}">
                            普通用户
                        </c:if>
                        <c:if test="${user.usertype==/"1/"}">
                            管理员
                        </c:if>
                    </td>
                    <td>
                        <a href="DeleteUserServlet?userid=${user.userid}"> 删除 </a>
                    </td>
                </tr>
            </c:forEach>
因为在删除的时候需要根据主键进行删除,需要传递当前用户的userid,这里使用问号+参数的形式。也可以使用按钮来实现,如果使用按钮,可以使用隐藏域传递需要删除的信息的userid。
3)编写用于删除的控制器DeleteUserServlet.java
该控制器完成的主要功能如下:
n         获取用户选择的userid;
n         调用会话Bean的deleteUser方法完成删除;
n         跳转到显示用户信息的Servlet:FindAllUserServlet。
参考代码如下(红色部分是使用向导之后生成的代码):
/*
 * DeleteUserServlet.java
 *
 * Created on 2007 年5月28日, 上午3:21
 */
 
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 DeleteUserServlet 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 {
        // 获取要删除的用户 ID
        String userid = request.getParameter("userid");
       
        // 调用删除用户的方法
        user.deleteUser(userid);
       
        // 专向用户列表界面
        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>
 
}
4)部署、测试
3、修改信息
下面以用户信息修改为例介绍信息修改,修改信息的基本过程如下:
n         选择要修改信息的用户;
n         把要修改的用户信息显示在表单元素中;
n         用户根据需要修改信息,然后提交;
n         对用户提交的信息进行修改。
涉及两个过程:根据用户的选择,显示要修改的用户的信息;用户修改之后提交给服务器处理。
使用MVC模式,分别进行设计:
n         首先,考虑模型部分,模型部分包括两个功能:
u       根据userid查询用户信息;
u       修改用户信息
n         其次,是视图部分:
u       选择要修改的用户;
u       先是要修改的用户信息,并在此界面上修改;
u       修改后专向用户列表界面。
n         最后是控制器,包括两部分:
u       根据userid查询用户信息的控制器;
u       使用用户输入的信息进行。
下面分别介绍。
1) 在会话Bean中添加业务方法
首先在业务接口中声明方法,包括根据userid查询用户的方法和修改用户信息的方法,方法的的定义如下:
    public Userinfo findUserById(String userid);
    public void updateUser(String userid,String username,String userpass,char usertype);
在Bean类中实现这两个方法,方法的参考代码如下:
      // 根据主键查询用户
      public Userinfo findUserById(String userid){
          return em.find(Userinfo.class,userid);
      }
      // 更新用户
      public void updateUser(String userid,String username,String userpass,char usertype){
          Userinfo user=em.find(Userinfo.class,userid);
          user.setUsername(username);
          user.setUserpass(userpass);
          user.setUsertype(usertype);
      }
根据主键查询用户信息的代码前面介绍过。更新用户,需要先查找到该用户,根据主键查找,之后使用set方法进行修改。上面的方法就完成了信息的修改。
2)在用户列表界面userlist.jsp上添加“修改”超链,修改<c:forEach>中的代码,修改后的代码如下(红色部分是添加的):
            <c:forEach varStatus="status" var="user" items="${userlist}">
                <tr>
                    <td>${status.index+1}</td>
                    <td>${user.userid}</td>
                    <td>${user.username}</td>
                    <td>
                        <c:if test="${user.usertype==/"0/"}">
                            普通用户
                        </c:if>
                        <c:if test="${user.usertype==/"1/"}">
                            管理员
                        </c:if>
                    </td>
                    <td>
                        <a href="DeleteUserServlet?userid=${user.userid}"> 删除 </a>
                    </td>
                    <td>
                        <a href="FindUserByIdServlet?userid=${user.userid}"> 修改 </a>
                    </td>
                </tr>
            </c:forEach>
3)编写根据主键查询用户信息的控制器FindUserByIdServlet.java,参考代码如下(红色部分是使用向导之后添加的代码):
/*
 * FindUserByIdServlet.java
 *
 * Created on 2007 年5月28日, 上午3:21
 */
 
package jpa.web;
 
import java.io.*;
 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;
import jpa.Userinfo;
 
/**
 *
 * @author Administrator
 * @version
 */
public class FindUserByIdServlet 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 {
        // 获取要修改的用户的 ID
        String userid = request.getParameter("userid");
       
        // 调用根据主键查询用户的方法
        Userinfo userinfo = user.findUserById(userid);
       
        // 保存到 request 中,传递到页面
        request.setAttribute("userinfo",userinfo);
       
        // 转向修改界面
        RequestDispatcher rd = request.getRequestDispatcher("updateUser.jsp");
        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>
}
4)编写修改界面updateUser.jsp,在查询到信息之后会跳转到信息修改界面,信息修改界面的参考代码如下:
<%@page contentType="text/html"%>
<%@page pageEncoding="gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<!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="UpdateUserServlet" method="POST">
     用户ID:${userinfo.userid}
         <input type="hidden" name="userid" value="${userinfo.userid}" /><br>
     用户名:<input type="text" name="username" value="${userinfo.username}" /><br>
     口令:<input type="password" name="userpass" value="${userinfo.userpass}" /><br>
        权限:<select name="usertype">
            <option value="0" <c:if test="${userinfo.usertype=='0'}">
               selected</c:if>>普通用户</option>
            <option value="1" <c:if test="${userinfo.usertype=='1'}">
               selected</c:if>>管理员</option>
        </select><br>
        <input type="submit" value="修改" /><input type="reset" value="重置" />
    </form>
   
    </body>
</html>
代码解释:
n         用户ID不能修改,但是修改信息的时候需要根据ID修改,所以使用隐藏域传递。
n         使用表达式语言,通过value对输入框赋值。
n         对于下拉框稍微复杂一些:使用<c:if>判断,然后确定选择哪一个。
5)编写修改的控制器:UpdateUserServlet.java,代码如下(红色部分是使用向导生成之后添加的代码):
/*
 * UpdateUserServlet.java
 *
 * Created on 2007 年5月28日, 上午3:23
 */
 
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 UpdateUserServlet 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 {
        // 获取修改后的信息
        String userid = request.getParameter("userid");
        String username = request.getParameter("username");
        String userpass = request.getParameter("userpass");
        String usertype = request.getParameter("usertype");
       
        // 调用修改信息的方法
        user.updateUser(userid,username,userpass,usertype.charAt(0));
       
        // 专向用户列表界面
        response.sendRedirect("FindAllUserServlet");
    }
   
    // <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>
}
代码比较简单,不再解释。
4、小结
信息的修改和删除,通常都是先查找到实体,根据主键查询,使用EntityManager的find方法,第1个参数是要查找的实体类,第2个参数是要查找的实体类的主键。
信息的删除,通常先查找到实体,然后调用EntityManager的remove方法删除,参数是要删除的实体。
信息的修改,通常先查找到实体,然后调用实体的set方法进行修改。
关于EntityManager的方法参考书上357页。

 

更多内容参考:《Java EE 5实用教程》

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值