获得新增的数据主键_批处理
可滚动的结果集_可更新的结果集(不常用)
获得新增的数据主键_批处理--------------------------------------------------------------------------------------
获得新增的数据主键
使用PreparedStatement.getGeneratedKeys()方法获得主键;
步骤:
1、声明,执行PreparedStatement 时,需要返回主键;
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
2、执行语句
ps.executeUpdate();
3、使用PreparedStatement.getGeneratedKeys()方法获得主键的结果集ResultSet,
(返回ResultSet类型,以适应联合主键);
ResultSet rs=ps.getGeneratedKeys()
4、获得主键
rs.getInt(1);
PreparedStatement.getGeneratedKeys();
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = st.getGeneratedKeys();
rs.getInt(1);
批处理,可以大幅度提升大量增、删、改的速度。
1、使用addBatch()方法,打包PreparedStatement中的语句
PreparedStatement.addBatch();
2、使用executeBatch()方法,执行PreparedStatement打包的语句
返回int[]数据。
PreparedStatement.executeBatch
ps.addBatch();
ps.executeBatch();
package com.dwt1220;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OtherApi {
public static void main(String[] args) throws Exception {
int id=getCreateKey();
System.out.println("id="+id);
System.out.println("----------------------------------------------------------");
createBatch();
}
static int getCreateKey() throws SQLException {
/*****************获得最新添加的记录的主键*******************************/
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 2.建立连接
conn = JdbcUtils.getConnection();
// 3.创建语句
String sql="insert into user(name,birthday,money)values('name1','1987-10-01',400)";
/******************可不填写Statement.RETURN_GENERATED_KEYS,但不一定所有数据库驱动都支持**********************************************/
ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
// 4.执行语句
ps.executeUpdate();
/**使用preparedStatement.getGeneratedKeys()方法获得主键
* 返回值为ResultSet类型,(可能存在联合主键)
* *********************************/
rs=ps.getGeneratedKeys();
int id=0;
if(rs.next()){
id=rs.getInt(1);
}
return id;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
static int createBatch() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql="insert into user(name,birthday,money)values(?,?,?)";
ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
for(int i=0;i<1000;i++){
ps.setString(1,"batch name"+i);
ps.setDate(2,new Date(System.currentTimeMillis()));
ps.setFloat(3, 100f+i);
/********将preparedStatement中的语句打包*********************************************/
ps.addBatch();
}
/**使用executeBatch方法,执行preparedStatement打包语句
* 每执行一条,返回一个执行结果。
* *********************************************/
int[] is=ps.executeBatch();
/**使用preparedStatement.getGeneratedKeys()方法获得主键
* 返回值为ResultSet类型,(可能存在联合主键)
* *********************************/
rs=ps.getGeneratedKeys();
int id=0;
if(rs.next()){
id=rs.getInt(1);
}
return id;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
}
可滚动的结果集
1、声明对resultSet(结果集)的要求
Statement st =connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
2、执行
ResultSet rs = st.executeQuery(sql);
rs.beforeFirst();
定位到最前一行的前一行
rs.afterLast();
定位到最后
一行的后
一行
rs.first();
定位到最前
一行
rs.isFirst();
是否最前一行
rs.last();
定位到最后一行
rs.isLast();
是否是最后一行
rs.absolute(9);
定位到第9行
rs.moveToInsertRow();
移动到插入的一行
可更新的结果集 (有些数据库驱动不支持)
1、声明对resultSet(结果集)的要求
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
2、设置更新内容
rs.updateString("col name", "new value");
3、执行更新
rs.updateRow();
OtherApi.java
(执行需要模版中的JdbcUtils.java)
package com.dwt1220;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OtherApi {
public static void main(String[] args) throws Exception {
ScrollTest();
// concurUpdateTable();
}
static void ScrollTest() throws SQLException {
/************可以制作分页,但效率很低,一般只用于,不支持分页功能的数据库***************************/
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
/*************声明对resultSet(结果集)的要求
* 可滚动的结果集(ResultSet.TYPE_SCROLL_SENSITIVE)
* 可更新的结果集(ResultSet.CONCUR_UPDATABLE)有些驱动不支持
* **************************************/
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql = "select id,name,birthday,money from user ";
rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getObject("id") + "\t"
+ rs.getObject("name") + "\t"
+ rs.getObject("birthday") + "\t"
+ rs.getObject("money"));
}
System.out.println("-----------------------");
/******可滚动的结果集
*rs.absolute(5); 定位到第5行的前一行
*rs.last(); 定位到最后一行
*rs.afterLast(); 定位到最后一行的后一行
*rs.first(); 定位到最前一行
*rs.beforeFirst(); 定位到最前一行的前一行
*rs.isFirst(); 判断是否是第一行
*......
* **********************/
rs.absolute(5);//定位到第5行的前一行
int i=0;
/*******rs.previous()移动到前一行***********/
while(rs.previous()&& i<10){
i++;
System.out.println(rs.getObject("id") + "\t"
+ rs.getObject("name") + "\t"
+ rs.getObject("birthday") + "\t"
+ rs.getObject("money"));
}
} finally {
JdbcUtils.free(rs, st, conn);
}
}
static void concurUpdateTable() throws SQLException {
/************可更新的结果集***************************/
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
/*************声明对resultSet(结果集)的要求
* 可滚动的结果集(ResultSet.TYPE_SCROLL_SENSITIVE)
* 可更新的结果集(ResultSet.CONCUR_UPDATABLE)有些驱动不支持
* **************************************/
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql = "select id,name,birthday,money from user where id<5";
rs = st.executeQuery(sql);
while (rs.next()) {
String name=rs.getString("name");
// if("lisi".equals(rs.getObject("name"))){ 有些数据库驱动调用2次。rs.getXXX()会出错
if("lisi".equals(name)){
/*************对结果集中,name=list的用户进行更新*********************************************/
rs.updateFloat("money", 400);//设置更新内容
rs.updateRow();//执行更新
}
System.out.println(rs.getObject("id") + "\t"
// + rs.getObject("name") + "\t" 有些数据库驱动调用2次。rs.getXXX()会出错
+ name + "\t"
+ rs.getObject("birthday") + "\t"
+ rs.getObject("money"));
}
System.out.println("-----------------------");
} finally {
JdbcUtils.free(rs, st, conn);
}
}
static void scrollSensitive() throws SQLException, InterruptedException {
/************可更新的结果集***************************/
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
/*************声明对resultSet(结果集)的要求
* 可滚动的结果集
* * ResultSet.TYPE_SCROLL_SENSITIVE 对更新敏感
* * ResultSet.TYPE_SCROLL_INSENSITIVE 对更新不敏感
* 可更新的结果集(ResultSet.CONCUR_UPDATABLE)有些驱动不支持
* **************************************/
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql = "select id,name,birthday,money from user where id<5";
rs = st.executeQuery(sql);
while (rs.next()) {
int id=rs.getInt("id");
System.out.println("show id:"+id+"...");
Thread.sleep(1000);
/**在线程睡眠时间中,修改数据库中的数据
* ResultSet.TYPE_SCROLL_SENSITIVE 会感知到
* ResultSet.TYPE_SCROLL_INSENSITIVE 不会感知到 (有些驱动不支持)
* *****************************/
System.out.println(id + "\t"
+ rs.getObject("name") + "\t"
+ rs.getObject("birthday") + "\t"
+ rs.getObject("money"));
}
} finally {
JdbcUtils.free(rs, st, conn);
}
}
}