mysql通过jdbc的Statement做导出数据库的sql

2023-10-30

package net.eicp.roomally.util.tool;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

import net.eicp.roomally.util.JdbcManager;

/**
 * @author xxf
 */
public class MySqlUtils {
	public static final String enter = "\r\n";//windows txt文档的换行

	public static void main(String[] args) throws SQLException,
			FileNotFoundException, UnsupportedEncodingException, IOException {
		MySqlUtils mySqlUtils = new MySqlUtils();
		System.out.println(mySqlUtils.exportSqlString(new String[] {
				"ally_user", "keywords", "clauses" }));//要导出的表名,可多个
	}

	public void export(String[] args) throws SQLException,
			FileNotFoundException, UnsupportedEncodingException, IOException {
		String exportPath = MySqlUtils.class.getResource("/").getPath()//得到classpath路径
				+ getDateString("yyyy-MM-dd_hh-mm-ss") + ".sql";
		PATH = exportPath;
		String sql = exportSqlString(args);

		// FileWriter out = new FileWriter(exportPath);
		// 如果要写入全角字符,应该选择合适的编码再定义out
		FileOutputStream fos = new FileOutputStream(exportPath);
		OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
		BufferedWriter out = new BufferedWriter(osw);
		out.write(sql);//进行文件保存
		// out.write(new String(sql.getBytes(),"utf-8"));
		out.flush();
		out.close();
		this.sql = sql;
	}

	private String sql;

	public String getSql() {
		return sql;
	}

	public static String PATH;

	public static String getDateString(String format) {
		String dateStr = new SimpleDateFormat(format).format(new Date());
		return dateStr;
	}

	public String exportSqlString(String[] tableNames) throws SQLException {
		StringBuffer tablesql = new StringBuffer();
		for (int i = 0; i < tableNames.length; i++) {
			tablesql.append(exportSqlString(tableNames[i]) + enter + enter);
		}
		return tablesql.toString();
	}

	public String exportSqlString(String tableName) throws SQLException {
		String tablesql = "";
		String datasql = "";
		Connection con = null;
		Statement stat = null;
		try {
			con = JdbcManager.getConnection();//得到数据库连接
			stat = con.createStatement();//创建Statement对象
			ResultSet rs = stat.executeQuery("select * from " + tableName);//执行查询语句
			tablesql = getCreateTableSql(rs, tableName);//得到创建表的sql语句
			datasql = getTableDataSql(rs, tableName);//得到插入数据的sql语句
		} catch (SQLException e) {
			throw e;
		} finally {
			JdbcManager.free(stat, con);
		}
		return tablesql + enter + datasql;
	}

	public String[] getColumns(ResultSet rs) throws SQLException {//得到字段的名字,存放到一个数组里
		ResultSetMetaData rsmd = rs.getMetaData();
		int ccount = rsmd.getColumnCount();
		String[] args = new String[ccount];
		for (int i = 1; i <= ccount; i++) {
			String colName = rsmd.getColumnName(i);
			args[i - 1] = colName;
		}
		return args;
	}

	public String getColumnsString(String[] args) {//拼接所有字段名
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < args.length; i++) {
			buffer.append("`" + args[i] + "`,");
		}
		return buffer.deleteCharAt(buffer.length() - 1).toString();
	}

	public String getCreateTableSql(ResultSet rs, String tableName)
			throws SQLException {
		ResultSetMetaData rsmd = rs.getMetaData();//主要的通过这个方法
		int ccount = rsmd.getColumnCount();
		StringBuffer columnBuffer = new StringBuffer("DROP TABLE IF EXISTS `"
				+ tableName + "`;" + enter);//为了方便,好多东西是写死的
		columnBuffer.append("CREATE TABLE `" + tableName + "` (" + enter);
		for (int i = 1; i <= ccount; i++) {
			int size = rsmd.getColumnDisplaySize(i);
			String colTypeName = rsmd.getColumnTypeName(i);
			// String colClassName = rsmd.getColumnClassName(i);
			String colName = rsmd.getColumnName(i);
			columnBuffer.append("`" + colName + "` ");
			columnBuffer.append(colTypeName);//在这儿我只做了一些简单的判断
			if (!"double".equalsIgnoreCase(colTypeName)
					&& !"date".equalsIgnoreCase(colTypeName)) {
				columnBuffer.append("(" + size + ") ");
			}
			columnBuffer.append(" DEFAULT NULL," + enter);
		}
		columnBuffer.delete(columnBuffer.length() - 3,
				columnBuffer.length() - 2);
		columnBuffer.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
		return columnBuffer.toString();
	}

	public String getTableDataSql(ResultSet rs, String tableName)
			throws SQLException {
		String[] columns = getColumns(rs);
		StringBuffer columnBuffer = new StringBuffer();
		columnBuffer.append("INSERT INTO `" + tableName + "` ("
				+ getColumnsString(columns) + ") VALUES");
		while (rs.next()) {
			columnBuffer.append("(");
			for (int i = 0; i < columns.length; i++) {
				Object obj = rs.getObject(columns[i]);
				String typeName = "";
				if (obj == null) {
					obj = "";
				}
				if (obj.getClass() != null) {
					typeName = obj.getClass().getName();
				}//在这儿我只做了一些简单的判断
				if ("java.lang.String".equals(typeName)
						|| "java.sql.Date".equals(typeName)) {
					columnBuffer.append("'" + obj + "',");
				} else {
					columnBuffer.append(obj + ",");
				}
			}
			columnBuffer.deleteCharAt(columnBuffer.length() - 1);
			columnBuffer.append("),");
		}
		if (columnBuffer.toString().endsWith("VALUES"))
			return "";
		columnBuffer.deleteCharAt(columnBuffer.length() - 1).append(";");
		return columnBuffer.toString();
	}
}
 
package net.eicp.roomally.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import net.eicp.roomally.exception.RoomAllyJdbcException;
import net.eicp.roomally.util.tool.CryptUtil;

public class JdbcManager {

	private JdbcManager() {
	}

	private static String url = null;
	private static String driver = null;
	private static String username = null;
	private static String password = null;
	static {
		try {
			InputStream is = JdbcManager.class.getClassLoader()
					.getResourceAsStream("jdbc.properties");
			Properties properties = new Properties();
			properties.load(is);
			url = properties.getProperty("jdbc.url");
			driver = properties.getProperty("jdbc.driver");
			username = properties.getProperty("jdbc.username");
			password = properties.getProperty("jdbc.password");
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
		
		} catch (IOException e) {
		
		}
	}

	public static Connection getConnection() {
		try {
			return DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
		
		}
	}

	public static void free(Statement st, Connection conn) {
		try {
			if (st != null)
				st.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			
		}
	}
}
 
在classpath下有jdbc.properties内容如下:
jdbc.url=jdbc:mysql://localhost:3310/roomally?useUnicode=true&characterEncoding=UTF-8
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=roomally
jdbc.password=039a44b295a8cfb62506b7fe2c23801a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql通过jdbc的Statement做导出数据库的sql 的相关文章

随机推荐

  • 使用stelnet进行安全的远程管理

    1 telnet有哪些不足 2 ssh如何保证数据传输安全 需求 远程telnet管理设备 用户定义需要在AAA模式下 开启远程登录的服务 定义vty接口 然后从R2登录 是可以登录的 同理R3登录 在R1也可以查看哪些用户telnet登录
  • llvm是什么?

    llvm是什么 llvm是low level virtual machine的简称 其实是一个编译器框架 llvm随着这个项目的不断的发展 已经无法完全的代表这个项目了 只是这种叫法一直延续下来 llvm是一个开源的项目 它最早的时候是Il
  • 物联网IOT-基于STM32开发板的智能养殖系统+华为云平台+APP端应用+keil编译工具

    物联网IOT 基于STM32开发板的智能养殖系统 华为云平台 APP端应用 keil编译工具 文章摘要 整体展示 视频展示 1 流程图 1 硬件设备和APP端 华为云平台 一 项目场景及功能说明 1 项目场景 2 功能说明 二 华为云平台搭
  • CXF学习笔记---让通过参数传递数据

    整整折腾了3天终于通过CXF进行参数传递了 CXF的文档和sample都是存在问题的 这么一些简单的常用内容 硬是找不着 opensource的弊病 目地 通过webservice传递值以及错误信息 true 取result值 false
  • 基于Prometheus+Grafana搭建监控平台(Windows/Linux环境exporter部署)

    待优化 添加端口及防火墙开放配置 1 介绍 1 1 Prometheus是什么 Prometheus 普罗米修斯 是一个最初在SoundCloud上构建的监控系统 自2012年成为社区开源项目 拥有非常活跃的开发人员和用户社区 为强调开源及
  • GBDT回归数学推导

    GBDT回归数学推导 一 写在前面 前面推文讲了 GBDT 做回归的主流程 这篇推文讲数学推导啦 没有看过前面那一篇文章的童鞋建议先看一下 二 贴一下算法 来自李航 统计学习方法 算法8 4 输入 训练数据集 T x 1
  • 修复:Lua script attempted to access a non local key in a cluster node

    local key rate limit KEYS 1 local limit tonumber ARGV 1 local current tonumber redis call get key or 0 if current 1 gt l
  • Linux(RHEL6)启动过程详解

    Linux RHEL6 启动过程详解 Linux 红帽RHEL6 启动过程详解 RHEL的一个重要和强大的方面是它是开源的 并且系统的启动过程是用户可配置的 用户可以自由的配置启动过程的许多方面 包括可以指定启动时运行的程序 同样的 系统关
  • java Integer.compare Integer.compareTo() 比较大小

    今天看到这样的用法用于排序 Integer compare Arrays sort intervals x y gt Integer compare x 0 y 0 java lang包的Integer类的compare 方法比较作为参数给
  • pageHelper分页及工作原理浅析

    1 pageHelper PageHelper是Github上开源的MyBatis分页插件 使用起来简单 方便 支持多种数据库 Github网址 https github com pagehelper Mybatis PageHelper
  • 迅雷调用Potplayer边下边播

    或 global Path 您的Potplayer安装路径 PotPlayerMini64 exe 注意 PotPlayerMini64 exe 或 PotPlayerMini exe 需要您看下Potplayer安装路径下的该文件命名
  • C++类的定义要注意最后的分号不要丢了

    ifndef TEST H define TEST H class Test public 定义成内联的有两种方式 int add int a int b 假设我们要将该函数定义为内联的 声明的时候可以不给出inline关键字 可以在实现的
  • 尚硅谷 Vue2.0 + Vue3.0 入门到精通教程学习笔记 (五)

    第五章 Vuex 5 1 理解 vuex 5 1 1 vuex是什么 1 概念 专门在 Vue 中实现集中式状态 数据 管理的一个 Vue 插件 对 vue 应 用中多个组件的共享状态进行集中式的管理 读 写 也是一种组件间通信的方 式 且
  • 上传自定义jar到maven中央仓库

    第一步 注册JIRA账号 Sign up for Jira Sonatype JIRA 上创建一个账号 第二步 创建 Issue 当JIRA 账号一切准备就绪 项目状态 为 Status RESOLVED 即可 第四步 下载 kleopat
  • [记录]缺少MSVCP140_1.dll文件的解决办法

    本人运行三维重建中的开源项目colmap中的COLMAP bat时出现缺少MSVCP140 1 dll文件的错误 尝试了重新修复方法但还是没有解决 后来通过卸载已有的文件 重新下载该文件才得以解决 下载地址为 https support m
  • IDEA之plugin出现爆红(maven-deploy-plugin2.8.2&maven-site-plugin3.7.1)

    1 问题描述 maven中plugin提示有两处红色波浪线 2 原因 在本地仓库中找不到plugin的jar包 3 1 解决办法 删除本地maven仓库下的所有文件 然后在IDEA上点击maven视图 分别点击clean compile s
  • 滑块验证码处理

    文章目录 1 进入网站 判断是否成功加载 2 点击嵌入式 使网页向下滚动 3 获取网页源代码 用正则取出验证码背景和验证码滑块图片的链接并保存到本地 4 最最重要的一部分 识别图片滑块缺口位置 计算移动距离 5 规划移动轨迹 6 开始移动滑
  • 算法题记录【华为od] 对称成字符串

    题目描述 思路分析 构造出相应的字符串 之后输出相应的字符即可 反向输出用的是遍历上一字符之后 依照判断输出 之后拼接数组即可 代码解析 let input 1 1 2 2 3 3 4 4 5 5 for let i 0 i lt inpu
  • Module not found: Error: Can't resolve 'sass-loader'

    VUE 错误截图 解决方法 安装插件 npm install sass loader D npm install node sass D 插件介绍 sass loader的作用 加载 SASS SCSS 文件并将其编译为 CSS 使用 cs
  • mysql通过jdbc的Statement做导出数据库的sql

    package net eicp roomally util tool import java io BufferedWriter import java io FileNotFoundException import java io Fi