在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也可以实现批出;