• Java实现从数据库导出大量数据记录并保存到文件的方法(转)


    数据库脚本:


    -- Table "t_test" DDL CREATE TABLE `t_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `createTime` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    代码:

    package com.yanek.test; 
    import java.io.BufferedReader; 
    import java.io.File; 
    import java.io.FileOutputStream; 
    import java.io.FileReader; 
    import java.io.IOException; 
    import java.io.OutputStreamWriter; 
    import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Statement; 
    public class TestDB { 
     public static void main(String[] args) { 
      Test(); // 生成测试数据 
      //Exp(); 
      //Exp(0); 
      //System.out.println(readText("/opt/id.txt")); 
     
     /** 
      * 导出数据 
      */ 
      public static void Exp() { 
       Connection Conn=null
       try
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/testcms?characterEncoding=GBK"
        String jdbcUsername = "root"
        String jdbcPassword = "root"
        Conn = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword); 
        System.out.println("conn"+Conn); 
        Exp(Conn); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       
       catch (InstantiationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       
       finally 
       
        try
         Conn.close(); 
        } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        
       
      
      public static void Exp(int startid) { 
       Connection Conn=null
       try
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/testcms?characterEncoding=GBK"
        String jdbcUsername = "root"
        String jdbcPassword = "root"
        Conn = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword); 
        System.out.println("conn"+Conn); 
        Exp(Conn,startid); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       
       catch (InstantiationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       
       finally 
       
        try
         Conn.close(); 
        } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        
       
      
      /** 
      * 导出从startid开始的数据 
      * @param conn 
      * @param start_id 
      */ 
      public static void Exp(Connection conn,int start_id) { 
       int counter = 0
       int startid=start_id; 
       boolean flag = true
       while (flag) { 
        flag = false
        String Sql = "SELECT * FROM t_test WHERE id>" 
          + startid + " order by id asc LIMIT 50"
        System.out.println("sql===" + Sql); 
        try
         Statement stmt = conn.createStatement(); 
         ResultSet rs = stmt.executeQuery(Sql); 
          while (rs.next()) { 
           flag = true
           int id = rs.getInt("id"); 
           String title = rs.getString("title"); 
           startid = id ; 
           counter++; 
           writeContent(counter+"--id--"+id+"--title-"+title+" ", "/opt/","log.txt",true); 
           System.out.println("i="+counter+"--id--"+id+"--title-"+title); 
          
         rs.close(); 
         stmt.close(); 
        } catch (SQLException e) { 
         e.printStackTrace(); 
        
       
       writeContent(""+startid, "/opt/","id.txt",false); 
      
      /** 
      * 导出一小时内的数据 
      * @param conn 
      */ 
      public static void Exp(Connection conn) { 
       int counter = 0
       //一小时内的数据 
       Long timestamp = System.currentTimeMillis() - (60 * 60 * 1000); 
       boolean flag = true
       while (flag) { 
        flag = false
        String Sql = "SELECT * FROM t_test WHERE createTime>" 
          + timestamp + " LIMIT 50"
        System.out.println("sql===" + Sql); 
        try
         Statement stmt = conn.createStatement(); 
         ResultSet rs = stmt.executeQuery(Sql); 
         while (rs.next()) { 
          flag = true
          int id = rs.getInt("id"); 
          String title = rs.getString("title"); 
          Long lastmodifytime = rs.getLong("createTime"); 
          timestamp = lastmodifytime; 
          counter++; 
          System.out.println("i="+counter+"--id--"+id+"--title-"+title); 
         
         rs.close(); 
         stmt.close(); 
        } catch (SQLException e) { 
         e.printStackTrace(); 
        
       
      
      public static void Test() { 
       Connection Conn=null
       try
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/testcms?characterEncoding=GBK"
        String jdbcUsername = "root"
        String jdbcPassword = "root"
        Conn = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword); 
        System.out.println("conn"+Conn); 
        for(int i=1;i<=10000;i++) 
        
         add(Conn,"testTitle"+i+"-"+System.currentTimeMillis()); 
        
       } catch (SQLException e) { 
        e.printStackTrace(); 
       
       catch (InstantiationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       
       finally 
       
        try
         Conn.close(); 
        } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        
       
      
      public static void add(Connection conn,String title) 
      
       PreparedStatement pstmt = null
       String insert_sql = "insert into t_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()); 
        int ret = pstmt.executeUpdate(); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       
       finally
        try
         pstmt.close(); 
        } catch (SQLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }  
       
      
      /** 
       * 写入内容到文件 
       
       * @param number 
       * @param filename 
       * @return 
       */ 
      public static boolean writeContent(String c, String dirname,String filename,boolean isAppend) { 
       File f=new File(dirname); 
       if (!f.exists()) 
       
         f.mkdirs(); 
       
       try
        FileOutputStream fos = new FileOutputStream( dirname+File.separator+filename,isAppend); 
        OutputStreamWriter writer = new OutputStreamWriter(fos); 
        writer.write(c); 
        writer.close(); 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        return false
       
       return true
      
      /** 
       * 从文件读取内容 
       
       * @param filename 
       * @return 
       */ 
      public static String readText(String filename) { 
       String content = ""
       try
        File file = new File(filename); 
        if (file.exists()) { 
         FileReader fr = new FileReader(file); 
         BufferedReader br = new BufferedReader(fr); 
         String str = ""
         String newline = ""
         while ((str = br.readLine()) != null) { 
          content += newline + str; 
          newline = " "
         
         br.close(); 
         fr.close(); 
        
       } catch (IOException e) { 
        e.printStackTrace(); 
       
       return content; 
      
    }

    基本思想: 就是通过记录开始记录id,执行多次sql来处理. 由于大数据量所以不能使用一条sql语句来输出.否则会内存不足导致错误.

    主要用途: 可以使用在做接口开发时,给第三方提供数据增量输出的场景使用.

  • 相关阅读:
    利用console控制台调试php代码
    数据库比对脚本(PHP版)
    Symfony框架系列----1.入门安装
    Symfony框架系列----常用命令
    Symfony命令行
    Linux SCP指令
    Linux 搭建SVN服务器
    Linux下 保存 git账号密码
    js 视差滚动 记录备份
    移动端 -webkit-user-select:text; ios10 bug 解决方案
  • 原文地址:https://www.cnblogs.com/chenning/p/5030854.html
Copyright © 2020-2023  润新知