从数据库导出大量数据记录保存到文件的方法和实例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

从数据库导出大量数据记录保存到文件的方法和实例


数据库脚本:


-- 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+"\r\n", "/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 = "\n";
					}
					br.close();
					fr.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			return content;
		}
}


 

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

 

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

 

有问题可以联系qq: 1046011462

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
SQL 监控 数据库
SQL数据库还原详解:步骤、方法与实践指南c1b.0335pw.com
在现代信息技术的浪潮中,数据库管理系统(DBMS)已成为各类组织和企业不可或缺的核心组件。随着数据的不断积累和业务需求的日益增长,数据库的备份与还原成为了确保数据安全与业务连续性的重要手段。本文将深入探讨SQL数据库还原的各个方面,帮助读者理解并掌握数据库还原的核心概念、步骤和方法。一、数据库还原概
|
5天前
|
SQL 存储 关系型数据库
数据储存数据库管理系统(DBMS)
【10月更文挑战第11天】
14 3
|
6天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
14 2
|
11天前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
11天前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
10天前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
10天前
|
Oracle 关系型数据库 数据库
oracle数据恢复—Oracle数据库文件损坏导致数据库打不开的数据恢复案例
打开oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有:控制文件损坏、数据文件损坏、数据文件与控制文件的SCN不一致等。数据恢复工程师对数据库文件做进一步检测分析后发现sysaux01.dbf文件有坏块。修复sysaux01.dbf文件,启动数据库依然有许多查询报错。export和data pump工具无法使用,查询告警日志并分析报错,确认发生上述错误的原因就是sysaux01.dbf文件损坏。由于该文件损坏,从数据库层面无法修复数据库。由于system和用户表空间的数据文件是正常的,
|
10天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
44 6
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
40 3
Mysql(4)—数据库索引
|
10天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
30 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用