JDBC之Statement与ResultSet

昨天调试了一下数据迁移,因为数据量比较大,所以决定还是采用JDBC来完成数据迁移

程序代码 程序代码

    public void initTransplantStatus ()  throws Exception 
    {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        String sql="";
        int id=20;
        int i=1;
        try{
        conn=DBUtil.getConnection();    
        conn.setAutoCommit(true);
        st=conn.createStatement();
        st2=conn.createStatement();
        st.execute("delete from transplant_status");
        rs=st.executeQuery("select t.id,cl.id from school t join classes cl on t.id=cl.school_id order by t.id");
        while(rs.next())
        {
            id=id+10;
            sql="insert into transplant_status values('"+id+"','"+rs.getString(1)+"','"+rs.getString(2)+"','0',sysdate)";
                                                st.execute(sql);
        }
        conn.commit();
        rs.close();
        st.close();
        }catch(Exception e)
        {
            System.out.println(e.getMessage());
            err=" 初始化迁移状态表时出错!";
            throw new Exception(e.getMessage());
        }
        
    }



上 面的程序是不正确的,直接的结果就是初始化迁移状态表时只有一条记录;原因是ResultSet是依赖于Statement的,Statement在执行 execute后,记录集的结果将丢失,所以记录集循环只执行了一次,解决方法是记录集的获取或execute操作采用另外的Statement;

程序代码 程序代码


    public void initTransplantStatus ()  throws Exception 
    {
        Connection conn=null;
        Statement st=null;
        Statement st2=null;
        ResultSet rs=null;
        String sql="";
        int id=20;
        System.out.println(st.KEEP_CURRENT_RESULT);
        int i=1;
        try{
        conn=DBUtil.getConnection();    
        conn.setAutoCommit(true);
        st=conn.createStatement();
         st2=conn.createStatement();
        st.execute("delete from transplant_status");
        rs=st.executeQuery("select t.id,cl.id from school t join classes cl on t.id=cl.school_id order by t.id");
        while(rs.next())
        {
            id=id+10;            sql="insert into transplant_status values('"+id+"','"+rs.getString(1)+"','"+rs.getString(2)+"','0',sysdate)";
                                         st2 .execute(sql);
        }
        conn.commit();
        rs.close();
        st.close();
        st2.close();
        }catch(Exception e)
        {
            System.out.println(e.getMessage());
            err=" 初始化迁移状态表时出错!";
            throw new Exception(e.getMessage());
        }
        
    }



在 这里, 们用id=id+10实现 ORACLE的sequence序列,因为jdbc连接取自于Hibernate,所以不用显式关闭,而交由Hibernate智能管理;

注 意: 由于这里采用的是hibernate的JDBC,所以与纯JDBC有所区别,具体请见:

http://www.gold98.net/blog/article.asp?id=453

在 适当的时候, 们可以采用批处理,但测 试 过好几次,感觉对比较果不是很明显,这就根据各自需要来定了~

在多表操作时, 们仍应坚持先conn.setAutoCommit(false)后 conn.setAutoCommit(true)的原则;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值