JDBC获取自增主键,批量操作
一: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(); } }
下一篇:
java数据库编程--事务处理