4.12 立即获取插入记录的自动编号

通常数据库中的唯一表编号都会使用自动编号来指定,本节将介绍如何立即获取插入记录的自动编号。

实例109 通过JDBC获取插入记录的自动编号

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

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

实例说明

在开发网站程序时,有时需要按级别显示数据信息,使信息分类显示在页面中。运行程序,在“添加部门名称”文本框中输入要添加的部门信息,在“选择上级部门”下拉列表中选择上级部门,单击“提交”按钮。若添加成功,显示添加部门的编号,如图4.73所示。

图4.73 通过JDBC获取插入记录的自动编号

技术要点

本实例主要使用SQL语句中的@@IDENTITY全局变量来获取插入记录的编号,该变量必须与插入语句一起执行,否则得到的将是空值。

实现过程

(1)创建UserDao类,定义数据库连接和查询的方法。

(2)编写JavaScript脚本语句,对表单进行验证,代码如下:

        <script language="JavaScript" type="text/JavaScript">
            function check() { //v4.01
                if (form1.textfield.value==""){
                    window.alert("部门名称不能为空!");
                    this.form1.textfield.focus();
                    return false;
                }
            }
        </script>

(3)执行数据插入操作并显示提示信息,代码如下:

        <%
            String DeptName="";
            String ID="";
            DeptName=request.getParameter("textfield");
            ID=request.getParameter("select");
            if (DeptName!=null){
                ResultSet RS1=dao.selectStatic("insert tb_dept(DeptName,shangji) values('"+DeptName+"',"+ID+") "+"Select
    @@IDENTITY as id");
                RS1.first();
                out.print("<script language=javascript>alert('添加成功,编号为"+RS1.getString("id")+"')</script>");
            }
        %>

举一反三

根据本实例,读者可以:

人力资源管理系统部门设置;

新闻级别分类;

工资级别分类。

实例110 通过Hibernate获取插入记录的自动编号

本实例是一个实用的程序

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

实例说明

在开发网络应用程序时,经常会遇到对主明细表进行数据插入的情况,这时,如果主表中的ID采用的是系统自动编号,那么在插入从表数据时,就需要获取主表插入记录的自动编号。本实例将介绍如何通过Hibernate获取插入记录的自动编号。运行本实例,填写相应的管理员信息(如图4.74所示)后,单击“保存”按钮,即可将管理员信息添加到管理员信息表中,同时将该管理员的ID插入到权限信息表中。

图4.74 通过Hibernate获取插入记录的自动编号

技术要点

在介绍如何通过Hibernate获取插入记录的自动编号之前,先对Session保存对象的步骤进行介绍。

(1)根据配置文件中设置的主键ID生成算法(本实例中采用的是increment,由Hibernate自动以递增的方式生成标识符,步长为1),生成一个ID值。

(2)将实体类对象纳入Session的内部缓存。

(3)提交事务时,将新的对象通过INSERT语句持久化到数据库。

从上面的步骤中可以看出,当执行Session的save()方法后,原来的实体类对象已经被更新,这时就可以通过实体类对象的getXXX()方法获取生成的自动编号。

实现过程

(1)Hibernate包的获得与放置。Hibernate包可以到它的官方网站(http://www.hibernate.org)下载。如果不采用开发工具,可以直接将lib文件夹内的所有Jar包和与lib同目录的Jar包复制到Web-INF/lib文件夹内;否则,引入方法因开发工具而定。

(2)配置Hibernate配置文件hibernate.cfg.xml。该文件存储于src文件夹下。代码及解析见实例078的技术要点。

(3)创建实体类及映射文件。本实例中共涉及两个实体类和映射文件,分别是:与管理员信息表tb_manager对应的实体类为ManagerForm,映射文件为managerForm.hbm.xml;与权限信息表tb_purview对应的实体类为PurviewForm,映射文件为purviewForm. hbm.xml。

(4)创建业务处理逻辑类Manager,定义添加管理员信息的方法addManager(),在该方法中需要获取插入记录的自动编号值,代码如下:

        public int addManager(ManagerForm managerForm){
            Transaction tx = null;
            tx = session.beginTransaction();
            int rtn=0;
            try {
                session.save(managerForm);
                int managerid=managerForm.getId(); //获取刚刚插入记录的ID值
                PurviewForm pruviewForm=new PurviewForm();
                pruviewForm.setId(managerid);
            pruviewForm.setBasicSet(0);
            pruviewForm.setPurviewSet(0);
            pruviewForm.setQuerySet(0);
            pruviewForm.setSellSet(0);
            pruviewForm.setStockSet(0);
              session.save(pruviewForm);
            tx.commit();
            rtn = 1;
            } catch (Exception e) {
            tx.rollback();
            System.out.println("保存管理员信息时的错误提示:" + e.getMessage());
            rtn = 0;
            }finally{
            session.close();
            }
      return rtn;
        }

(5)创建index.jsp页面,用于提交管理员的登录信息。

(6)创建Servlet类Manager_Add。定义doPost()方法对添加的管理员信息进行处理。首先将客户端输入的管理员信息保存到实体类ManagerForm中,再通过调用Manager类中的addManager()方法将管理员信息保存到管理员信息表中,同时将管理员ID保存到权限信息表中。关键代码如下:

        public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            ManagerForm mf=new ManagerForm();              //实例化实体类
            Manager manager=new Manager();                 //实例化保存信息类
            mf.setName(request.getParameter("name"));    //将信息保存到实体类
            mf.setPwd(request.getParameter("pwd"));
            int rtn=manager.addManager(mf);               //添加信息到数据库
            if(rtn==0){
                out.println("<script >alert('管理员信息添加失败!'); window.location.href='index.jsp';</script>");
            }else if(rtn==2){
                out.println("<script >alert('该管理员信息已经存在,请重新添加!!'); window.location.href='index.jsp';</script>");
            }else{
                out.println("<script >alert('管理员信息添加成功!!'); window.location.href='index.jsp';</script>");
            }
        }

举一反三

根据本实例,读者可以:

开发电子商务网站中保存订单信息模块;

开发企业进销存管理系统中的销售、入库等模块。