一、JDBC 2.0
在JDBC 2.0之后,为了方便操作者进行数据库的开发提供了许多更加方便的操作,包括可滚动的结果集和使用结果集直接更新数据库。
二、ResultSet中与JDBC 2.0有关的操作
1.设置ResultSet类型
static final int TYPE_FORWARD_ONLY //表示指针只能向前移动的ResultSet,默认值
static final int TYPE_SCROLL_SENSITIVE //表示ResultSet可以滚动,可以随着数据库变化而更新此ResultSet内容
static final int TYPE_SCROLL_INSENSITIVE //表示ResultSet可以滚动,但是不能更新内容
2.设置并发型
static final int CONCUR_READ_ONLY //按只读的方式打开数据库
static final int CONCUR_UPDATABLE //表示通过操作ResultSet可以更新数据库内容
3.移动
boolean absolute(int row) throws SQLException //将结果集移动到指定行
void afterLast() throws SQLException //将结果集移动到末尾之后
void beforeFirst() throws SQLException //将结果集移动到首行之前
boolean first() throws SQLException //将结果集移动到第一行
boolean last() throws SQLException //将结果集移动到最后一行
boolean previous() throws SQLException //将结果集向上移动
void moveToInsertRow() throws SQLException //将指针移动到插入行
4.更新
void updateString(int columnIndex,String x) throws SQLException //指定更新列的内容,此方法被重载多次,支持各种数据类型
void updateString(String columnName,String x) throws SQLException //指定更新列的内容,此方法被重载多次,支持各种数据类型
5.更新行与取消更新
void updateRow() throws SQLException //更新行数据信息
void cancelRowUpdates() throws SQLException //取消更新数据,在updateRow()调用之前有效
6.插入行与删除行数据
void insertRow() throws SQLException //插入行数据
void deleteRow() throws SQLExcepiton //删除行数据
三、实例
(1)结果集滚动
要创建可滚动的结果集,只需要在创建数据库操作对象时加入若干参数即可。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBC2ReadDemo{
//mysql数据库驱动
public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
//mysql数据库连接地址
public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
//mysql数据库连接用户名
public static final String DBUSER="root";
//mysql数据库连接密码
public static final String DBPASS="root";
public static void main(String[] args) throws Exception{
//1、加载数据库驱动
Class.forName(DBDRIVER);
//2、获取数据库连接
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//3、实例化PreparedStatement对象和ResultSet对象
String sql="SELECT id,name,password,age,sex,birthday FROM user";
PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=pstmt.executeQuery();
//4、进行结果集滚动操作
System.out.println("第二条数据:");
rs.absolute(1);
print(rs,1);
System.out.println("第一条数据:");
rs.beforeFirst();
print(rs,1);
System.out.println("最后一条数据:");
rs.afterLast();
print(rs,-1);
//5、关闭数据库连接
rs.close();
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 pass=rs.getString(3);
int age=rs.getInt(4);
String sex=rs.getString(5);
String d=rs.getString(6);
System.out.print("编号:"+id+";");
System.out.print("姓名:"+name+";");
System.out.print("密码:"+pass+";");
System.out.print("年龄:"+age+";");
System.out.print("性别:"+sex+";");
System.out.println("生日:"+d);
System.out.println("----------------------");
}
}
关键步骤:
//3、实例化PreparedStatement对象和ResultSet对象
String sql="SELECT id,name,password,age,sex,birthday FROM user";
PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=pstmt.executeQuery();
//4、进行结果集滚动操作
System.out.println("第二条数据:");
rs.absolute(1);
print(rs,1);
System.out.println("第一条数据:");
rs.beforeFirst();
print(rs,1);
System.out.println("最后一条数据:");
rs.afterLast();
print(rs,-1);
(2)结果集插入数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBC2InsertDemo{
//mysql数据库驱动
public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
//mysql数据库连接地址
public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
//mysql数据库连接用户名
public static final String DBUSER="root";
//mysql数据库连接密码
public static final String DBPASS="root";
public static void main(String[] args) throws Exception{
//1、加载数据库驱动
Class.forName(DBDRIVER);
//2、获取数据库连接
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//3、实例化PreparedStatement和ResultSet对象
String sql="SELECT id,name,password,age,sex,birthday FROM user";
PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=pstmt.executeQuery();
//4、使用ResultSet进行插入操作
rs.moveToInsertRow();
rs.updateString("name","aa");
rs.updateString("password","aa");
rs.updateInt("age",11);
rs.updateString("sex","女");
rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));
rs.insertRow();
//5、关闭数据库连接
rs.close();
pstmt.close();
conn.close();
}
}
关键步骤:
//3、实例化PreparedStatement和ResultSet对象
String sql="SELECT id,name,password,age,sex,birthday FROM user";
PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=pstmt.executeQuery();
//4、使用ResultSet进行插入操作
rs.moveToInsertRow();
rs.updateString("name","aa");
rs.updateString("password","aa");
rs.updateInt("age",11);
rs.updateString("sex","女");
rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));
rs.insertRow();
(3)结果集更新数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBC2UpdateDemo{
//mysql数据库驱动
public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
//mysql数据库连接地址
public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
//mysql数据库连接用户名
public static final String DBUSER="root";
//mysql数据库连接密码
public static final String DBPASS="root";
public static void main(String[] args) throws Exception{
//1、加载数据库驱动
Class.forName(DBDRIVER);
//2、获取数据库连接
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//3、实例化PreparedStatement和ResultSet对象
String sql="SELECT id,name,password,age,sex,birthday FROM user WHERE id=?";
PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
pstmt.setInt(1,3);
ResultSet rs=pstmt.executeQuery();
//4、进行更新操作
rs.last();
rs.updateString("name","aa");
rs.updateString("password","aa");
rs.updateInt("age",11);
rs.updateString("sex","女");
rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));
rs.updateRow();
//5、关闭数据库连接
rs.close();
pstmt.close();
conn.close();
}
}
(4)结果集删除数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBC2DeleteDemo{
//mysql数据库驱动
public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
//mysql数据库连接地址
public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
//mysql数据库连接用户名
public static final String DBUSER="root";
//mysql数据库连接密码
public static final String DBPASS="root";
public static void main(String[] args) throws Exception{
//1、加载数据库驱动
Class.forName(DBDRIVER);
//2、获取数据库连接
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//3、实例化PreparedStatement和ResultSet对象
String sql="SELECT id,name,password,age,sex,birthday FROM user WHERE id=?";
PreparedStatement pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
pstmt.setInt(1,2);
ResultSet rs=pstmt.executeQuery();
//4、执行删除操作
rs.last();
rs.deleteRow();
//5、关闭数据库连接
rs.close();
pstmt.close();
conn.close();
}
}
小结:
使用ResultSet结果集对数据库进行插入、更新和删除数据操作,关键步骤是分别使用rs.insertRow()、rs.updateRow()和rs.deleteRow()方法。
(5)批处理
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class JDBC2BatchDemo{
//mysql数据库驱动
public static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
//mysql数据库连接地址
public static final String DBURL="jdbc:mysql://localhost:3306/mldn?useSSL=false&serverTimezone=UTC";
//mysql数据库连接用户名
public static final String DBUSER="root";
//mysql数据库连接密码
public static final String DBPASS="root";
public static void main(String[] args) throws Exception{
//1、加载数据库驱动
Class.forName(DBDRIVER);
//2、获取数据库连接
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//3、实例化PreparedStatement对象
String sql="INSERT INTO user(name,password,age,sex,birthday) VALUES(?,?,?,?,?)";
PreparedStatement pstmt=conn.prepareStatement(sql);
for(int i=0;i<10;i++){
pstmt.setString(1,""+i);
pstmt.setString(2,""+i);
pstmt.setInt(3,i);
pstmt.setString(4,"男");
pstmt.setDate(5,new Date(new java.util.Date().getTime()));
pstmt.addBatch();
}
int temp[]=pstmt.executeBatch();
System.out.println("更新了"+temp.length+"条数据。");
//4、关闭数据库连接
pstmt.close();
conn.close();
}
}