【Oracle/jdbc/file】将oracle某表数个字段读出成csv文件及读取csv文件写入目标表的两段程序(改进版)
【建表及充值】
create table emp_from( id number(12), name varchar2(10), age number(3), salary number(6), primary key(id) ) insert into emp_from select rownum, dbms_random.string('*',dbms_random.value(10,10)), dbms_random.value(18,65), dbms_random.value(1000,50000) from dual connect by level<10001
create table emp_to(
id number(12),
name varchar2(10),
age number(3),
salary number(6),
primary key(id)
)
【从emp_from表取值存成文件】
package com.hy.datamasking3; import com.hy.datamasting.TimeUtil; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.sql.*; import java.util.ArrayList; import java.util.List; class JdbcExp { //-- 以下为连接Oracle数据库的四大参数 private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; private static final String USER = "luna"; private static final String PSWD = "1234"; public void export(String filename,String table,String[] fields){ List<String> datas=new ArrayList<>(); String fieldLine=String.join(",",fields); Connection conn = null; Statement stmt = null; try{ Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USER, PSWD); String sql=String.format("select %s from %s order by id",fieldLine,table); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { List<String> ls=new ArrayList<>(); for(String fd:fields){ String segment = rs.getString(fd); // 脱敏处理 if(fd.equals("name")){ segment=JdbcExp.encrypt(segment); } ls.add(segment); } String line=String.join(",",ls); datas.add(line); } rs.close(); } catch (Exception e) { System.out.print(e.getMessage()); } finally { try { conn.close(); } catch (SQLException e) { System.out.print("Can't close stmt/conn because of " + e.getMessage()); } } write2File(filename,table,fieldLine,datas); } // 加密 private static String encrypt(String str){ char[] arr=str.toCharArray(); for(int i=0;i<arr.length;i++){ arr[i]+=25; } return String.valueOf(arr); } private void write2File(String filename,String table,String fieldLine,List<String> datas){ PrintWriter out; try { out = new PrintWriter(filename); // 输出文本 out.println(table); out.println(fieldLine); for(String line:datas){ out.println(line); } out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args){ long startMs=System.currentTimeMillis(); JdbcExp exp=new JdbcExp(); exp.export("c:\\temp\\exp.csv","emp_from_final",new String[]{"id","name","age","salary"}); long endMs=System.currentTimeMillis(); System.out.println("Time elapsed:"+ TimeUtil.ms2DHMS(startMs,endMs)); } }
【从文件取值存入emp_from表】
package com.hy.datamasking3; import com.hy.datamasting.TimeUtil; import java.io.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; class JdbcBatchImp { //-- 以下为连接Oracle数据库的四大参数 private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; private static final String USER = "luna"; private static final String PSWD = "1234"; public void readFromFile(String filename){ String table=""; String fieldLine=""; List<String> datas=new ArrayList<>(); try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "UTF-8")); String line = null; int idx=0; while( ( line = br.readLine() ) != null ) { idx++; if(idx==1){ table=line; }else if(idx==2){ fieldLine=line; }else{ datas.add(line); } } br.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } insertDatas("emp_to",fieldLine,datas); } private void insertDatas(String tableName,String fieldLine,List<String> datas){ Connection conn = null; Statement stmt = null; try{ Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USER, PSWD); stmt = conn.createStatement(); int start=0; int end=0; final int STEP=200; int n=datas.size(); for(;;){ end=start+STEP; if(end>n){ end=n; System.out.println("Start="+start+" End="+end); batchInsert(start,end,datas,tableName,fieldLine,conn,stmt); break; } System.out.println("Start="+start+" End="+end); batchInsert(start,end,datas,tableName,fieldLine,conn,stmt); start=end; } } catch (Exception e) { System.out.println(e.getMessage()); } finally { try { conn.close(); } catch (SQLException e) { System.out.println("Can't close stmt/conn because of " + e.getMessage()); } } } private void batchInsert(int start,int end,List<String> datas,String tableName,String fieldLine,Connection conn,Statement stmt) throws Exception{ List<String> partDatas=datas.subList(start,end); StringBuilder sb=new StringBuilder(); sb.append("INSERT ALL "); for(String dt:partDatas){ String[] arr=dt.split(","); String values=String.format("'%s'",String.join("','",arr)); String partSql=String.format(" into %s(%s) values(%s)",tableName,fieldLine,values); sb.append(partSql); } sb.append("select * from dual"); conn.setAutoCommit(false); stmt.execute(sb.toString()); conn.commit(); } public static void main(String[] args){ long startMs=System.currentTimeMillis(); JdbcBatchImp imp=new JdbcBatchImp(); imp.readFromFile("c:\\temp\\exp.csv"); long endMs=System.currentTimeMillis(); System.out.println("Time elapsed:"+ TimeUtil.ms2DHMS(startMs,endMs)); } }
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-03-09 【Canvas与游戏】Bombman v1.04
2019-03-09 【Canvas与艺术】模拟八一电影制片厂电影片头效果
2019-03-09 【Canvas技法】蓝布底金字北岛诗节选(背景图片、文字阴影示例)
2017-03-09 “阿基里斯与乌龟”的终结性思考
2017-03-09 生活本来的样子