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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
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
目录
相关文章
|
28天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
1月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
1月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
108 61
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
98 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
7天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
27天前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
1月前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
20天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】启动与关闭MySQL数据库实例
MySQL数据库安装完成后,可以通过命令脚本启动、查看状态、配置开机自启、查看自启列表及关闭数据库。本文提供了详细的操作步骤和示例代码,并附有视频讲解。
|
19天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
34 1
|
21天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
36 4