22---数库编程11(JDBC2.0)

 

在JDBC2.0中,加强了结果集ResultSet的功能,可以直接使用ResultSet执行更新的操作,或者实现双向滚动;
在JDBC2.0中有个重要的概念:批处理;

1、可滚动的结果集:
  在创建PreparedStatement或者Statement的时候必须指定创建的类型;
  jdbc2.0的双向读取:

   /*---创建数据库表
   drop table user;
   create table user(
    id   int   auto_increment primary key,
    name  varchar(30) not null,
    password varchar(32) not null,
    age   int   not null,
    sex   varchar(2) default '男',
    birthday Date
   );
   */

   import java.sql.DriverManager;
   import java.sql.Connection;
   import java.sql.SQLException;
   import java.sql.PreparedStatement;
   import java.sql.Blob;
   import java.sql.ResultSet;
   import java.util.*;
   import java.io.*;
   import java.text.*;
   public class Demo{
    //定义数据库的驱动程序
    public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
    //定义数据库的连接地址:
    public static final String DBURL="jdbc:mysql://localhost:3306/lid";
    //定义数据库的用户名
    public static final String DBUSER="root";
    //定义数据库的密码
    public static final String DBPASSWORD="123";
    public static void main(String args[]) throws Exception{
     Connection conn=null;
     PreparedStatement pstmt=null;//数据库操作
     ResultSet rs=null;
     String sql="select id,name,password,age,sex,birthday from user";
     //加载数据库驱动
     Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;  
     conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
     //双向可滚动可修改的只读的结果集 
     pstmt=conn.prepareStatement(sql,
        ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_READ_ONLY);
     rs=pstmt.executeQuery();
     //rs默认指的是第一条数据的前面,所以rs.next()后才指向第一条数据
     System.out.println("输出第2条数据:");
     rs.absolute(1);//将其定位到第一条数据上  
     print(rs,1);
     System.out.println("输出第1条数据:");
     rs.beforeFirst();//将光标定位到第一条数据的前面,即rs.next()时指向第一条
     print(rs,1);
     
     System.out.println("输出最后一条数据");
     rs.afterLast();
     print(rs,-1);
     pstmt.close();
     conn.close();
     }
     
    public static void print(ResultSet rs,int re)throws Exception{
     if(re>0){
      rs.next();//指向下一条数据,由前向后
      }
     else{
      rs.previous();//由后向前
      }
     
     int id=rs.getInt(1);
     String name=rs.getString(2);
     String password=rs.getString(3);
     int age=rs.getInt(4);
     String sex=rs.getString(5);
     java.util.Date d=rs.getDate(6);
     
     System.out.print("编号:"+id);
     System.out.print("姓名:"+name);
     System.out.print("密码:"+password);
     System.out.print("年龄:"+age);
     System.out.print("性别:"+sex);
     System.out.println("生日:"+d);
     System.out.println("-------------------------------------------------");
     
     }
    
    }
   如果程序真的采用此种开发的话,则内存的损耗会非常的大;
   所以一般情况下是不采用可滚动的结果集的;

2、使用结果集插入数据:----即在最后一条记录后面插入数据
 如果想要使用ResultSet插入数据,则在创建数据库操作的时候就必须选择好允许更新;
   /*---创建数据库表
   drop table user;
   create table user(
    id   int   auto_increment primary key,
    name  varchar(30) not null,
    password varchar(32) not null,
    age   int   not null,
    sex   varchar(2) default '男',
    birthday Date
   );
   */

   import java.sql.DriverManager;
   import java.sql.Connection;
   import java.sql.SQLException;
   import java.sql.PreparedStatement;
   import java.sql.Blob;
   import java.sql.ResultSet;
   import java.util.*;
   import java.io.*;
   import java.text.*;
   public class Demo{
    //定义数据库的驱动程序
    public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
    //定义数据库的连接地址:
    public static final String DBURL="jdbc:mysql://localhost:3306/lid";
    //定义数据库的用户名
    public static final String DBUSER="root";
    //定义数据库的密码
    public static final String DBPASSWORD="123";
    public static void main(String args[]) throws Exception{
     Connection conn=null;
     PreparedStatement pstmt=null;//数据库操作
     ResultSet rs=null;
     String sql="select id,name,password,age,sex,birthday from user";
     //加载数据库驱动
     Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;  
     conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
     //双向可滚动可修改的可修改的结果集 
     pstmt=conn.prepareStatement(sql,
        ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
     rs=pstmt.executeQuery();
     rs.moveToInsertRow();//移动到插入的一行,即最后一行
     rs.updateString("name","xiaopihai");
     rs.updateString("password","666");
     rs.updateInt("age",20);
     rs.updateString("sex","女");
     rs.updateDate("birthday",new java.sql.Date(new      java.util.Date().getTime()));
     rs.insertRow();//真正的提交插入
     rs.close();
     pstmt.close();
     conn.close();
     }
    }

3、使用结果集进行更新:
 用结果集进行更新首先的查询;
   /*---创建数据库表
   drop table user;
   create table user(
    id   int   auto_increment primary key,
    name  varchar(30) not null,
    password varchar(32) not null,
    age   int   not null,
    sex   varchar(2) default '男',
    birthday Date
   );
   */

   import java.sql.DriverManager;
   import java.sql.Connection;
   import java.sql.SQLException;
   import java.sql.PreparedStatement;
   import java.sql.Blob;
   import java.sql.ResultSet;
   import java.util.*;
   import java.io.*;
   import java.text.*;
   public class Demo{
    //定义数据库的驱动程序
    public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
    //定义数据库的连接地址:
    public static final String DBURL="jdbc:mysql://localhost:3306/lid";
    //定义数据库的用户名
    public static final String DBUSER="root";
    //定义数据库的密码
    public static final String DBPASSWORD="123";
    public static void main(String args[]) throws Exception{
     Connection conn=null;
     PreparedStatement pstmt=null;//数据库操作
     ResultSet rs=null;
     String sql="select id,name,password,age,sex,birthday from user where id=4";
     //加载数据库驱动
     Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;  
     conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
     //双向可滚动可修改的可修改的结果集 
     pstmt=conn.prepareStatement(sql,
        ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
     rs=pstmt.executeQuery();
     rs.last();//查询出一条来,所以定位到最后,就是定位到查出的这条数据
     
     rs.updateString("name","外星人");
     rs.updateString("password","888");
     rs.updateInt("age",20);
     rs.updateString("sex","女");
     rs.updateDate("birthday",new java.sql.Date(new      java.util.Date().getTime()));
     
     rs.updateRow();//真正的提交更新
     rs.close();
     pstmt.close();
     conn.close();
     }
    }

  如果更新之前使用了使用了调用了取消操作cancelRowUpdates() ,则就不能实现更新了
    rs.cancelRowUpdates();//取消更新
    rs.updateRow();//真正的提交更新
  如果这样,则不会进行更新;

4、使用结果集删除数据:
 直接移动到要删除的位置,使用deleteRow()即可;
   /*---创建数据库表
   drop table user;
   create table user(
    id   int   auto_increment primary key,
    name  varchar(30) not null,
    password varchar(32) not null,
    age   int   not null,
    sex   varchar(2) default '男',
    birthday Date
   );
   */

   import java.sql.DriverManager;
   import java.sql.Connection;
   import java.sql.SQLException;
   import java.sql.PreparedStatement;
   import java.sql.Blob;
   import java.sql.ResultSet;
   import java.util.*;
   import java.io.*;
   import java.text.*;
   public class Demo{
    //定义数据库的驱动程序
    public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
    //定义数据库的连接地址:
    public static final String DBURL="jdbc:mysql://localhost:3306/lid";
    //定义数据库的用户名
    public static final String DBUSER="root";
    //定义数据库的密码
    public static final String DBPASSWORD="123";
    public static void main(String args[]) throws Exception{
     Connection conn=null;
     PreparedStatement pstmt=null;//数据库操作
     ResultSet rs=null;
     String sql="select id,name,password,age,sex,birthday from user where id=5";
     //加载数据库驱动
     Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;  
     conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
     //双向可滚动可修改的可修改的结果集 
     pstmt=conn.prepareStatement(sql,
        ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
     rs=pstmt.executeQuery();
     rs.last();//查询出一条来,所以定位到最后,就是定位到查出的这条数据
     
     rs.deleteRow();
     rs.close();
     pstmt.close();
     conn.close();
     }
    }

5、批处理操作就是指一次性向数据库执行多条语句,一次提交;

 加入语句:
  void addBatch() throws SQLException
 执行语句:
  int[] executeBatch() throws SQLException
  所有的SQL语句,一次性提交过去;
   /*---创建数据库表
    drop table user;
    create table user(
     id   int   auto_increment primary key,
     name  varchar(30) not null,
     password varchar(32) not null,
     age   int   not null,
     sex   varchar(2) default '男',
     birthday Date
    );
    */

    import java.sql.DriverManager;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.PreparedStatement;
    import java.sql.Blob;
    import java.sql.ResultSet;
    import java.util.*;
    import java.io.*;
    import java.text.*;
    public class Demo{
     //定义数据库的驱动程序
     public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
     //定义数据库的连接地址:
     public static final String DBURL="jdbc:mysql://localhost:3306/lid";
     //定义数据库的用户名
     public static final String DBUSER="root";
     //定义数据库的密码
     public static final String DBPASSWORD="123";
     public static void main(String args[]) throws Exception{
      Connection conn=null;
      PreparedStatement pstmt=null;//数据库操作
      ResultSet rs=null;
      String sql="insert into user(name,password,age,sex,birthday)"+
         "values (?,?,?,?,?)";
      //加载数据库驱动
      Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;  
      conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
      //双向可滚动可修改的可修改的结果集 
      pstmt=conn.prepareStatement(sql);
      
      for(int i=0;i<5;i++){
       pstmt.setString(1,"李丹_"+i);
       pstmt.setString(2,"666"+i);
       pstmt.setInt(3,20);
       pstmt.setString(4,"男");
       pstmt.setDate(5,new java.sql.Date(new java.util.Date().getTime()));
       
       pstmt.addBatch();//添加批处理,等待执行
       }
      int[] j=pstmt.executeBatch();//执行批处理
      System.out.println("添加了:"+j.length+"条记录.");
      pstmt.close();
      conn.close();
      }
     }

 当然Statement也可以实现批出;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bzuld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值