一:jdbc获取数据库自增主键
使用场景:插入一个记录之后需要直接使用该记录进行别的操作,例如插入一个订单之后需要对订单详情表中插入订单项纪录,需要使用该个主键作为订单项表的外键(前提是订单表主键是自增类型)
//例
@Test
public void test(){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
String sql="insert into order(otime,total) values (?,?);";
try {
//获取连接
connection=DBUtils.getConnection();
//获取可以得到自增主键的preparedstatement
preparedStatement=connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setDate(1, new Date(new java.util.Date().getTime()));
preparedStatement.setDouble(2, 200.5);
preparedStatement.executeUpdate();
//获取自增主键
resultSet=preparedStatement.getGeneratedKeys();
if(resultSet.next()){
System.out.println(resultSet.getObject(1));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.close(connection, preparedStatement, resultSet);
}
}
二:批量操作
如果一次操作大批量的数据,使用循环逐条操作代价太大,批量操作可以大幅度提高性能
@Test
public void test(){
//例插入十万条数据
Connection connection=null;
PreparedStatement preparedStatement=null;
String sql="insert into person values (?,?,?);";
try {
//涉及事物操作
connection=DBUtils.getConnection();
DBUtils.startTransacton(connection);
long start=System.currentTimeMillis();
for(int i=1;i<=100000;i++){
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setInt(1, i);
preparedStatement.setString(2, "name"+i);
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
//批处理
preparedStatement.addBatch();
//每执行五百条数据操作执行一次批处理,并且将批处理清空
if((i%500==0)){
preparedStatement.executeBatch();
preparedStatement.clearBatch();
}
}
//将最后剩余的数据操作进行处理
preparedStatement.executeBatch();
preparedStatement.clearBatch();
long end=System.currentTimeMillis();
DBUtils.commit(connection);
System.out.println("批量方法添加十万条数据用时:"+(end-start)+"毫秒");
} catch (Exception e) {
e.printStackTrace();
DBUtils.rollback(connection);
} finally {
DBUtils.close(connection, preparedStatement, null);
}
}
三:Apache dbutils中的获取数据库自增主键
@Test
public void test(){
QueryRunner qr=new QueryRunner(DBUtils.getDataSource());
String sql="insert into department values(null,'java')";
try {
Long keys=qr.insert(sql, new ScalarHandler<Long>());
System.out.println(keys);
} catch (SQLException e) {
e.printStackTrace();
}
}
四:Apache dbutils 批量操作
@Test
public void testBatch(){
String sql="delete from department where id=?";
QueryRunner qr=new QueryRunner(DBUtils.getDataSource());
int[] is={4,7,8};
//定义参数数组
//行数表示需要操作的记录条数,有几行操作几行数据
Object[][] params=new Object[is.length][];
//每一行的数据也就是需要填充的参数
for (int i = 0; i < params.length; i++) {
params[i]=new Object[]{is[i]};
}
try {
//返回的结果是每一组数据的操作结果0/1,数组长度也就是操作记录的条数(行数)
int[] batch = qr.batch(sql, params);
for (int i : batch) {
System.out.println(i);
}
} catch (SQLException e) {
e.printStackTrace();
}
}