一次性获取多个oracle序列的值,实现关联表多数据的批量insert

时间:2022-05-10 15:15:04

maven/Java/web/bootstrap/dataTable/app开发QQ群:566862629。希望更多人一起帮助我学习。


业务 要求批量导入不小于10W条数据到 user 表,但是user表在 insert  每条数据的同时要  insert  一条对应数据到 customer表,

并且是以  customer  表的主键作为 user 表的外键。


所以想到要一次性获取多个 序列值,再把对应的序列给不同表,并分别作为两个表的主键和外键的值。


方法很简单  就一句代码 :

String squence ="select USR_CUSTOMER_SEQ.nextval cust_id from (select 1 from all_objects where rownum <= "+usrlist.size()+")";
List<String> squenceList = BatchInsert.selectSql(squence);

usrlist 是解析表格后得到的要导入的 user数据 集合,有多少条数据就取多少个序列值。

selectSql 方法 只是JDBC连接数据库 执行了这句SQL 并返回了查到的 序列值,拿到这个序列集合就可以根据业务作后续实现了。


  // 单纯查询 
public static List<String> selectSql(String sql){
Connection conn = null;//定义为空值
Statement stmt = null;
ResultSet rs = null;
conn = getConnection();
List<String> list = new ArrayList<String>();
try {
stmt = conn.createStatement();//创建一个Statement语句对象
rs = stmt.executeQuery(sql);//执行sql语句
while(rs.next()){
list.add(rs.getString("cust_id"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
conn.close();
stmt.cancel();
rs.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}

getConnection 方法是获取数据库连接:

   public static Connection getConnection(){ //连接数据库的方法        

try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //初始化驱动包
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}


另  批量导入实现见博文:关联表多数据的批量insert (批量导入,测试10W条数据用时46秒)