4.8 数据更新

在开发网络程序时,数据更新是经常使用的一项操作。数据更新与数据插入一样有两种方法:一种是利用ResultSet结果集中的rowUpdated()方法;另一种是利用SQL语句实现数据更新。本节主要使用SQL语句实现数据更新。

实例099 更新指定记录

本实例是一个数据库操作的程序

实例位置:光盘\mingrisoft\04\099

实例说明

对于数据的更新,本实例是采用指定记录编号的方法来获取和更新记录的。当单击操作图标时程序会将当前行记录的编号提交给数据编辑页,数据编辑页首先根据获取的记录编号将信息显示出来,然后用户修改完信息后单击“提交”按钮,将上页的记录编号和本页的表单信息一起提交到数据处理页进行数据处理,如图4.57所示。

图4.57 更新指定记录

技术要点

本实例在数据更新页使用了一个隐藏域,利用隐藏域可以将上一个页面传递过来的参数提交到下一个页面中,实现参数的多个页面传递。利用隐藏域传递参数,参数是不可见的,这比使用地址传递参数要安全很多。

隐藏域的定义如下:

        <input name="ID" type="hidden" id="" value="">

实现过程

(1)编写UserDao类,定义连接数据库、更新数据库和关闭数据库的方法。

(2)创建index.jsp页面,输出数据库中存储的数据,并且设置更新数据的超级链接,将数据的ID值作为参数。关键代码如下:

            <%@page language="java"import="java.sql.*"import="java.util.*"
                pageEncoding="GBK"%>
            <jsp:useBean id="dao"class="com.pkh.dao.UserDao"scope="page"></jsp:useBean>
            <%
                ResultSet Rs=dao.selectStatic("Select*From tb_Organ");
                while(Rs.next()){
            %>
                <tr>
                    <td height="25"><div align="center"><%=Rs.getString("OID")%></div></td>
                    <td><div align="center"><%=Rs.getString("OName")%></div></td>
                <td><div align="center"><%=Rs.getString("OType") %></div></td>
                <td><div align="center">
                    <a href="Edit.jsp?ID=<%=Rs.getString("OID")%>">
                        <img src="images/22.gif" width="15" height="15" border="0" ></a></div>
                    </td>
                </tr>
        <%  }    %>

(3)创建Edit.jsp页面,根据index.jsp页面传递的ID值,从数据库中读取出该条记录的数据,并且将数据添加到form表单中,实现对指定记录的更新。关键代码如下:

        <%@ page language="java" import="java.sql.*" import="java.util.*"
            pageEncoding="GBK"%>
        <jsp:useBean id="dao" class="com.pkh.dao.UserDao" scope="page"></jsp:useBean>
        <%
            ResultSet Rs = dao.selectStatic("Select * From tb_Organ Where OID="+request.getParameter("ID"));Rs.first();
        %>
        <form name="form1" method="post" action="Edit_Data">
            <input name="OName" type="text" id="OName" value="<%=Rs.getString("OName") %>">
            <input name="ID" type="hidden" id="" value="<%=(String)request.getParameter("ID")%>">
            <select name="OType">
            <option value="类型A"<%if (Rs.getString("OType").equals("类型A"))out.print("Selected"); %>>类型A</option>
            <option value="类型B"<%if (Rs.getString("OType").equals("类型B"))out.print("Selected"); %>>类型B</option>
            <option value="类型C"<%if (Rs.getString("OType").equals("类型C"))out.print("Selected"); %>>类型C</option>
            </select>
            <input type="submit" name="Submit" value="提交"><input type="reset" name="Submit2" value="重置">
        </form>

(4)编写Servlet类Edit_Data,定义doPost()方法,实现对数据库中指定记录的更新操作。关键代码如下:

        public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            UserDao dao=new UserDao();
            if (request.getParameter("OName")!="" && request.getParameter("OType")!=""){
                String SQL="Update tb_Organ Set OName='"+request.getParameter("OName")+"',OType='"+
            request.getParameter("OType")+"' Where OID="+request.getParameter("ID");
                if(dao.executeUpdate(SQL)){
                out.println("<script >alert('更新成功!'); window.location.href='index.jsp';</script>");
                }else{
                    out.println("<script >alert('更新失败!'); window.location.href='index.jsp';</script>");
                }
            }
        }

(5)修改工程根目录下WEB-INF文件夹下的web.xml文件,配置Edit_Data类,首先使用<servlet-name>与<servlet-class>标签配置servlet的名称与所在的包名类名,然后再通过<url-pattem>标签配置servlet的映射路径。关键代码如下:

        <servlet>
            <!--servlet的名称 -->
            <servlet-name>Edit_Data</servlet-name>
            <!--servlet文件所在包,类的名称 -->
            <servlet-class>com.pkh.servlet. Edit_Data</servlet-class>
        </servlet>
            <!-- 映射文件 -->
            <servlet-mapping>
                <!--要映射的servlet名称-->
                <servlet-name>Edit_Data</servlet-name>
                <!--servlet具体映射路径,以"/"开头 -->
                <url-pattern>/Edit_Data</url-pattern>
            </servlet-mapping>

举一反三

根据本实例,读者可以:

编写员工信息更新模块;

编写商品信息更新模块;

编写会员管理系统。

实例100 批量更新

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\04\100

实例说明

一般在设计用户权限或是更改工资级别时都会用到批量更新,批量更新的好处是速度快、安全性高。在本实例中,利用批量更新更改用户的账户是否被冻结。首先选择要操作的用户,单击“激活”或“冻结”按钮,即可将用户设为激活或冻结状态。程序运行结果如图4.58所示。

图4.58 批量更新

技术要点

本实例首先将复选框的值设置成当前行记录的编号,并将所有的复选框都起相同的名字,如果这样设置,在获取参数时只要写上复选框的名字就可以利用getParameterValues()方法返回一个字符串类型的数组。该数组的长度为同名复选框的个数,该数组的值为同名复选框的值。为了配合SQL语句中的in()包含表达式,可以使用循环语句将参数返回的数组以“,”分隔。

实现过程

(1)编写UserDao类,定义连接数据库、更新数据库和关闭数据库的方法。

(2)创建index.jsp页面,输出数据库中存储的数据。创建form表单,将查询出的结果集作为复选框的值,为复选框设置相同的名称;添加“激活”和“冻结”按钮,按钮名称相同,最终将表单中的数据提交到Update_Data类。关键代码如下:

        <%@ page language="java" import="java.sql.*" import="java.util.*"
            pageEncoding="GBK"%>
        <jsp:useBean id="dao" class="com.pkh.dao.UserDao" scope="page"></jsp:useBean>
        <form name="form1" method="post" action="Update_Data">
        <%
            ResultSet Rs = dao.selectStatic("Select * From tb_MUser");
            while (Rs.next()) {
        %>
            <tr>
                <td height="20" bgcolor="#FAFBFF"><div align="center">
                    <input type="checkbox" name="checkbox" value="<%=Rs.getString("MID")%>"></div>
                </td>
            <td bgcolor="#FAFBFF"><div align="center"><%=Rs.getString("MName")%></div></td>
                <td bgcolor="#FAFBFF"><div align="center"><%=Rs.getString("MOper")%></div></td>
            </tr>
        <%  }   %>
            <tr>
                <td height="22" colspan="3" bgcolor="#FAFBFF"><div align="center">
                    <input type="submit" name="Submit" value="激活">
                    <input type="submit" name="Submit" value="冻结">
                    <input type="reset" name="Submit3" value="重置">
                </div></td>
            </tr>
        </form>

(3)编写Servlet类Update_Data,定义doPost()方法,获取表单中复选框提交的数据,并将表单中提交的数据以“,”作为分隔符,重新定义成一个新的字符串,作为更新操作的值,最后调用UserDao类中的executeUpdate()方法,实现对数据库中记录的批量更新。关键代码如下:

        public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            UserDao dao=new UserDao();                                 //实例化数据库操作类
            if(request.getParameterValues("checkbox")!=null){         //判断提交按钮的值
                String IDS[]=request.getParameterValues("checkbox");  //获取复选框提交的值,并写入数组中
                String Values="";                                     //定义空字符串
                String Oper = (String)request.getParameter("Submit");
                //将复选框中提交的值以“,”为分隔符重新定义到一个新的字符串中
                for (int i=0;i<IDS.length;i++){
                    if (i+1==IDS.length)
                        Values+=IDS[i];
                    else
                        Values+=IDS[i]+",";                          //新的字符串
                    }
                String SQL="update tb_MUser Set MOper='"+Oper+"'where MID in("+Values+")";     //定义SQL语句
                dao.executeUpdate(SQL);                              //执行更新操作
                out.println("<script >alert('更新成功!'); window.location.href='index.jsp';</script>");
            }
        }

(4)修改工程根目录下WEB-INF文件夹下的web.xml文件,配置Upate_Data类,首先使用<servlet-name>与<servlet-class>标签配置servlet的名称与所在的包名类名,然后再通过<url-pattem>标签配置servlet的映射路径。关键代码如下:

        <servlet>
            <!--servlet的名称 -->
            <servlet-name>Upate_Data</servlet-name>
            <!--servlet文件所在包,类的名称 -->
            <servlet-class>com.pkh.servlet.Upate_Data</servlet-class>
        </servlet>
            <!-- 映射文件 -->
            <servlet-mapping>
                <!--要映射的servlet名称-->
                <servlet-name>Upate_Data</servlet-name>
                <!--servlet具体映射路径,以"/"开头 -->
                <url-pattern>/Upate_Data</url-pattern>
            </servlet-mapping>

举一反三

根据本实例,读者可以:

批量修改用户信息;

批量修改用户权限。

实例101 批量去除SQL Server数据表的字段中右边的空格

本实例是一个实用性的程序

实例位置:光盘\mingrisoft\04\101

实例说明

数据库中字段类型之间的转换一直是另程序员非常头疼的问题,例如:在SQL Server数据库中,char类型的数据会将不足指定字节数的数据使用空格来填充,直到满足指定的字节数为止,如图4.59所示。

将char类型数据转换成varchar类型时,如果char类型数据长度为20个字节,而实际的数据只有10个字节,那么在转换成varchar类型后,该数据中就会出现10个字节的空格。转换成varchar类型后数据中仍然存在空格,如图4.60所示。

图4.59 char类型的数据

图4.60 varchar类型的数据

本实例中将介绍一种可以去除varchar类型(包括由char类型转换的其他类型)数据中多余空格的方法,应用“UPDATE table SET field_name=RTrim(field_name), field_names=RTrim(field_names)”语句。通过该语句可以去除varchar类型(包括由char类型转换的其他类型)数据中的空格。本实例中去除tb_transform表中varchar类型数据中的空格,去除数据中右侧空格后的运行结果如图4.61所示。

图4.61 去除空格后的数据

技术要点

去除SQL Server数据表中字段右边的空格主要应用的是下面的SQL语句,其语法如下:

        UPDATE table SET field_name=RTrim(field_name), field_names=RTrim(field_names)

参数说明如下。

● table:指定操作的数据表。

● filed_name:定义字段名称。

● filed_name:指定更新的字段。

该语句可以同时去除多个字段中的空格。

实现过程

(1)下面以db_database04数据库中tb_transform表为例介绍批量去除字段中右边空格的操作步骤。打开企业管理器,展开“数据库”节点,找到db_database04数据库,选择tb_transform表。

(2)选中tb_transform表,单击右键选择“设计表”,打开tb_transform表的设计对话框,对表中username和password字段的类型进行修改,修改为varchar类型,如图4.62所示。

(3)类型更改完成后单击按钮,然后关闭设计表对话框。再次选中tb_transform表,单击右键选择“打开表”,选择“返回所有行”,如图4.63所示,username和password字段的数据中仍然存在空格。

图4.62 tb_transform表的设计窗体

图4.63 类型更改后tb_transform表中的数据

(4)从上图中可以看出,在username字段的数据中仍然存在空格,此时就需要应用更新语句批量去除username和password字段数据中右边的空格。SQL语句的代码如下:

        UPDATE tb_transform SET username=RTrim(username), password=RTrim(password)

在tb_transform表的“打开表”中单击按钮,显示SQL窗体。在图4.64所示的窗体中编写去除空格的SQL语句。

图4.64 执行去除空格的操作

(5)单击图4.64中的运行按钮,执行去除字段中右边空格的语句。去除字段中空格后的数据表如图4.65所示。

图4.65 去除字段中空格后的varchar类型的数据

举一反三

根据本实例,读者可以:

批量去除数据库中类型转换后字段中出现的空格。