Java实现从数据库导出大量数据记录并保存到文件的方法
本文实例讲述了Java实现从数据库导出大量数据记录并保存到文件的方法。分享给大家供大家参考,具体如下:
数据库脚本:
--Table"t_test"DDL CREATETABLE`t_test`( `id`int(11)NOTNULLAUTO_INCREMENT, `title`varchar(255)DEFAULTNULL, `createTime`bigint(20)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;
代码:
packagecom.yanek.test; importjava.io.BufferedReader; importjava.io.File; importjava.io.FileOutputStream; importjava.io.FileReader; importjava.io.IOException; importjava.io.OutputStreamWriter; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.sql.Statement; publicclassTestDB{ publicstaticvoidmain(String[]args){ Test();//生成测试数据 //Exp(); //Exp(0); //System.out.println(readText("/opt/id.txt")); } /** *导出数据 */ publicstaticvoidExp(){ ConnectionConn=null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); StringjdbcUrl="jdbc:mysql://127.0.0.1:3306/testcms?characterEncoding=GBK"; StringjdbcUsername="root"; StringjdbcPassword="root"; Conn=DriverManager.getConnection(jdbcUrl,jdbcUsername,jdbcPassword); System.out.println("conn"+Conn); Exp(Conn); }catch(SQLExceptione){ e.printStackTrace(); } catch(InstantiationExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IllegalAccessExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(ClassNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } finally { try{ Conn.close(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicstaticvoidExp(intstartid){ ConnectionConn=null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); StringjdbcUrl="jdbc:mysql://127.0.0.1:3306/testcms?characterEncoding=GBK"; StringjdbcUsername="root"; StringjdbcPassword="root"; Conn=DriverManager.getConnection(jdbcUrl,jdbcUsername,jdbcPassword); System.out.println("conn"+Conn); Exp(Conn,startid); }catch(SQLExceptione){ e.printStackTrace(); } catch(InstantiationExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IllegalAccessExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(ClassNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } finally { try{ Conn.close(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } /** *导出从startid开始的数据 *@paramconn *@paramstart_id */ publicstaticvoidExp(Connectionconn,intstart_id){ intcounter=0; intstartid=start_id; booleanflag=true; while(flag){ flag=false; StringSql="SELECT*FROMt_testWHEREid>" +startid+"orderbyidascLIMIT50"; System.out.println("sql==="+Sql); try{ Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery(Sql); while(rs.next()){ flag=true; intid=rs.getInt("id"); Stringtitle=rs.getString("title"); startid=id; counter++; writeContent(counter+"--id--"+id+"--title-"+title+"\r\n","/opt/","log.txt",true); System.out.println("i="+counter+"--id--"+id+"--title-"+title); } rs.close(); stmt.close(); }catch(SQLExceptione){ e.printStackTrace(); } } writeContent(""+startid,"/opt/","id.txt",false); } /** *导出一小时内的数据 *@paramconn */ publicstaticvoidExp(Connectionconn){ intcounter=0; //一小时内的数据 Longtimestamp=System.currentTimeMillis()-(60*60*1000); booleanflag=true; while(flag){ flag=false; StringSql="SELECT*FROMt_testWHEREcreateTime>" +timestamp+"LIMIT50"; System.out.println("sql==="+Sql); try{ Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery(Sql); while(rs.next()){ flag=true; intid=rs.getInt("id"); Stringtitle=rs.getString("title"); Longlastmodifytime=rs.getLong("createTime"); timestamp=lastmodifytime; counter++; System.out.println("i="+counter+"--id--"+id+"--title-"+title); } rs.close(); stmt.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } publicstaticvoidTest(){ ConnectionConn=null; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); StringjdbcUrl="jdbc:mysql://127.0.0.1:3306/testcms?characterEncoding=GBK"; StringjdbcUsername="root"; StringjdbcPassword="root"; Conn=DriverManager.getConnection(jdbcUrl,jdbcUsername,jdbcPassword); System.out.println("conn"+Conn); for(inti=1;i<=10000;i++) { add(Conn,"testTitle"+i+"-"+System.currentTimeMillis()); } }catch(SQLExceptione){ e.printStackTrace(); } catch(InstantiationExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IllegalAccessExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(ClassNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } finally { try{ Conn.close(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicstaticvoidadd(Connectionconn,Stringtitle) { PreparedStatementpstmt=null; Stringinsert_sql="insertintot_test(title,createTime)values(?,?)"; System.out.println("sql="+insert_sql); try{ pstmt=conn.prepareStatement(insert_sql); pstmt.setString(1,title); pstmt.setLong(2,System.currentTimeMillis()); intret=pstmt.executeUpdate(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } finally{ try{ pstmt.close(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } /** *写入内容到文件 * *@paramnumber *@paramfilename *@return */ publicstaticbooleanwriteContent(Stringc,Stringdirname,Stringfilename,booleanisAppend){ Filef=newFile(dirname); if(!f.exists()) { f.mkdirs(); } try{ FileOutputStreamfos=newFileOutputStream(dirname+File.separator+filename,isAppend); OutputStreamWriterwriter=newOutputStreamWriter(fos); writer.write(c); writer.close(); fos.close(); }catch(IOExceptione){ e.printStackTrace(); returnfalse; } returntrue; } /** *从文件读取内容 * *@paramfilename *@return */ publicstaticStringreadText(Stringfilename){ Stringcontent=""; try{ Filefile=newFile(filename); if(file.exists()){ FileReaderfr=newFileReader(file); BufferedReaderbr=newBufferedReader(fr); Stringstr=""; Stringnewline=""; while((str=br.readLine())!=null){ content+=newline+str; newline="\n"; } br.close(); fr.close(); } }catch(IOExceptione){ e.printStackTrace(); } returncontent; } }
基本思想:就是通过记录开始记录id,执行多次sql来处理.由于大数据量所以不能使用一条sql语句来输出.否则会内存不足导致错误.
主要用途:可以使用在做接口开发时,给第三方提供数据增量输出的场景使用.
希望本文所述对大家Java程序设计有所帮助。