使用java生成备份sqlserver数据表的insert语句
针对sqlserver数据表的备份工具很多,有时候条件限制需要我们自己生成insert语句,以便后期直接执行这些插入语句。下面提供了一个简单的思路,针对mysql或oracle有兴趣的以后可以试着修改。
public class GenInsertSql {
private static Connection conn =null;
private static Statement sm=null;
private static String schema="dbo";//模式名
private static String select="SELECT * FROM";//查询sql(针对一个表的时候,可以将*换成相应的列名)
private static String where="WHERE 1=1 ";//where子句(慎用,最好针对一个表的时候用,注意修改createSQL方法)
private static String insert="INSERT INTO";//插入sql
private static String values="VALUES";//values关键字
private static List <String> insertList=new ArrayList <String>();//全局insertsql文件的数据
//存储路径
private static String sqlfilePath ="D:/platform/new/backinsertsql/";//绝对路径,还未到最后一层
private static String xmname = "xxx";// 哪个项目
private static Boolean isOneFile = false; //是否写到一个文件中取,如果为true,将写到filePath中,否则写到singleFilePath+表名中
private static String filePath = sqlfilePath+xmname+"/1.txt";
private static String singleFilePath = sqlfilePath+xmname;
//备份哪些表
private static String [] table={"BA_CK_KCPD","SA_RY_GROUP"};//table数组 ,后期可以修改成list
// 数据库连
private static final String URL = "jdbc:jtds:sqlserver://11.11.11.11:1433;databaseName=xxx";
private static final String NAME = "sa";
private static final String PASS = "111111";
private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver";
/**
* 导出数据库表
* @param args
* @throws SQLException
*/
//所有sql写到一个文件中
private static void createFile() {
File file= new File( filePath );
if (!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
System. out .println( " 创建文件名失败!! " );
e.printStackTrace();
}
}
FileWriter fw= null ;
BufferedWriter bw= null ;
try {
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
if ( insertList .size()>0){
for ( int i=0;i< insertList .size();i++){
bw.append( insertList .get(i));
bw.append( "\n" );
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//sql分别写到对应表名的文件中
private static void createFile(String filename,List <String> insertSqls) {
File file= new File( singleFilePath+"/"+filename+".txt" );
if (!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
System. out .println( " 创建文件名失败!! " );
e.printStackTrace();
}
}
FileWriter fw= null ;
BufferedWriter bw= null ;
try {
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
if ( insertSqls .size()>0){
for ( int i=0;i< insertSqls .size();i++){
bw.append( insertSqls .get(i));
bw.append( "\n" );
}
}
insertList.clear();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 拼装查询语句
* @return 返回select 集合
*/
private static List<String> createSQL() {
List<String> listSQL= new ArrayList<String>();
for ( int i=0;i< table . length ;i++){
StringBuffer sb= new StringBuffer();
sb.append( select ).append( " " ).append( schema ).append( "." ).append( table [i]) ; // .append( " " ).append(where)
listSQL.add(sb.toString());
}
return listSQL;
}
/**
* 连接数据库创建statement 对象
* @param driver
* @param url
* @param UserName
* @param Password
*/
public static void connectSQL(String driver,String url,String UserName,String Password){
try {
Class. forName (driver).newInstance();
conn = DriverManager. getConnection (url, UserName, Password);
sm=conn .createStatement();
} catch (Exception e){
e.printStackTrace();
}
}
/**
* 执行sql 并返回插入sql
* @param conn
* @param sm
* @param listSQL
* @throws SQLException
*/
@SuppressWarnings({ "unused", "rawtypes" })
public static void executeSQL(Connection conn,Statement sm,List listSQL)throws SQLException{
List<String> insertSQL= new ArrayList<String>();
ResultSet rs= null ;
try {
rs = getColumnNameAndColumeValue (sm, listSQL, rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs.close();
sm.close();
conn.close();
}
}
/**
* 获取列名和列值
* @param sm
* @param listSQL
* @param rs
* @return
* @throws SQLException
*/
@SuppressWarnings("rawtypes")
private static ResultSet getColumnNameAndColumeValue(Statement sm,List listSQL, ResultSet rs) throws SQLException {
for (int j = 0; j < listSQL.size(); j++) {
String sql = String.valueOf(listSQL.get(j));
rs = sm.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
StringBuffer ColumnName = new StringBuffer();
StringBuffer ColumnValue = new StringBuffer();
for (int i = 1; i <= columnCount; i++) {
String value = rs.getString(i);
if (i == columnCount) {
ColumnName.append(rsmd.getColumnName(i));
if (Types.CHAR == rsmd.getColumnType(i) || Types.VARCHAR == rsmd.getColumnType(i)
|| Types.LONGVARCHAR == rsmd.getColumnType(i)) {
if (value == null) {
ColumnValue.append("null");
} else {
ColumnValue.append("'").append(value).append("'");
}
} else if (Types.SMALLINT == rsmd.getColumnType(i) || Types.INTEGER == rsmd.getColumnType(i)
|| Types.BIGINT == rsmd.getColumnType(i) || Types.FLOAT == rsmd.getColumnType(i)
|| Types.DOUBLE == rsmd.getColumnType(i) || Types.NUMERIC == rsmd.getColumnType(i)
|| Types.DECIMAL == rsmd.getColumnType(i)) {
if (value == null) {
ColumnValue.append("null");
} else {
ColumnValue.append(value);
}
} else if (Types.DATE == rsmd.getColumnType(i) || Types.TIME == rsmd.getColumnType(i)
|| Types.TIMESTAMP == rsmd.getColumnType(i)) {
if (value == null) {
ColumnValue.append("null");
} else {
// ColumnValue.append("timestamp'").append(value).append("'"); //对于mysql可能需要timestamp,未测试
ColumnValue.append("'").append(value).append("'"); //对于sqlserver来说去掉timestamp
}
} else {
if (value == null) {
ColumnValue.append("null");
} else {
ColumnValue.append(value);
}
}
} else {
ColumnName.append(rsmd.getColumnName(i) + ",");
if (Types.CHAR == rsmd.getColumnType(i) || Types.VARCHAR == rsmd.getColumnType(i)
|| Types.LONGVARCHAR == rsmd.getColumnType(i)) {
if (value == null) {
ColumnValue.append("null,");
} else {
ColumnValue.append("'").append(value).append("',");
}
} else if (Types.SMALLINT == rsmd.getColumnType(i) || Types.INTEGER == rsmd.getColumnType(i)
|| Types.BIGINT == rsmd.getColumnType(i) || Types.FLOAT == rsmd.getColumnType(i)
|| Types.DOUBLE == rsmd.getColumnType(i) || Types.NUMERIC == rsmd.getColumnType(i)
|| Types.DECIMAL == rsmd.getColumnType(i)) {
if (value == null) {
ColumnValue.append("null,");
} else {
ColumnValue.append(value).append(",");
}
} else if (Types.DATE == rsmd.getColumnType(i) || Types.TIME == rsmd.getColumnType(i)
|| Types.TIMESTAMP == rsmd.getColumnType(i)) {
if (value == null) {
ColumnValue.append("null,");
} else {
// ColumnValue.append("timestamp'").append(value).append("',"); //对于mysql可能需要timestamp,未测试
ColumnValue.append("'").append(value).append("',"); //对于sqlserver来说去掉timestamp
}
} else {
if (value == null) {
ColumnValue.append("null,");
} else {
ColumnValue.append(value).append(",");
}
}
}
}
insertSQL( ColumnName, ColumnValue,j,rs.isLast());//j表示当前正在处理的表的顺序
}
}
return rs;
}
/**
* 拼装insertsql 放到全局list 里面
* @param ColumnName
* @param ColumnValue
*/
private static void insertSQL(StringBuffer ColumnName,StringBuffer ColumnValue,int order,Boolean isLast) {
StringBuffer insertSQL= new StringBuffer();
insertSQL.append( insert ).append( " " ).append( schema ).append( "." )
.append( table [order]).append( " (" ).append(ColumnName.toString())
.append( ") " ).append( values ).append( " (" ).append(ColumnValue.toString()).append( ");" );
if(isOneFile){
insertList .add(insertSQL.toString());
if(order ==table.length -1 ) createFile(); //最后一个表完成时,创建文件
}else {
insertList .add(insertSQL.toString());
if(isLast){
createFile(table [order],insertList);
}
}
}
//入口
public static void executeSelectSQLFile() throws Exception {
List<String> listSQL= new ArrayList<String>();
connectSQL ( DRIVER , URL , NAME ,PASS ); // 连接数据库
listSQL= createSQL (); // 创建查询语句
executeSQL ( conn , sm,listSQL); // 执行sql 并拼装
System.out.println("^^^^^^^^^^^^^^^^^^^^^^创建完毕!");
}
public static void main(String[] args) throws Exception {
executeSelectSQLFile();
}
}
直接运行,即可生成txt文件,里面是insert语句。预览一下:

代码比较长,但逻辑还算清晰。原文作者已经不知道是谁了,在这里表示感谢!
使用java生成备份sqlserver数据表的insert语句的更多相关文章
- java程序获得SqlServer数据表的表结构
/** * 取得一张表的结构信息 * 使用DatabaseMetaData与ResultSetMetaData结合的方式获取全部属性 * @param conn 数据连接 * @p ...
- sqlserver数据库导出表结构和表数据生成创建表和insert语句
问题描述: 有时候我们只需要导出一张表和表数据到另外一个数据库,如果是备份整个库的话,就会很麻烦那样,没法满足需求. 解决方法: 以sqlserver2014为例:把MGActivity数据库的bat ...
- (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREA ...
- 利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句
利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFram ...
- EntityFramework6.1自动生成复数名称数据表的问题
遇到一个很奇怪的问题,两个程序部署在两个不同的机器上,一个是.net 4.6.1另外一个是.net 4.0的运行时,两个项目都引用了EntityFramework6.1.3.程序分别执行后,4.0环境 ...
- 关于EF中实体和数据表以及查询语句映射的问题
关于EF中实体和数据表以及查询语句映射的问题? 很多人在使用的时候分不清楚 实体字段应该少于等于(数据库中的表字段或者SQL查询中的临时字段).这样在查询或者添加修改都不会出现问题 如果实体的字段大于 ...
- 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)
图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...
- Oracle数据库表的备份和数据表的删除操作
--Oracle数据库中的表备份: --备份语句:在备份之后就可以将这张表的所有数据源删除了,但是之后有人对这张表的数据进行操作,但是在操作完成之后要记得将数据表恢复 CREATE TABLE DZH ...
- Java基础_0311: 数据表与简单Java类映射
数据表与简单Java类映射 现在假设有如下的关系表,现在要求实现如下的数据关联操作: 一个部门有多个雇员: 一个雇员有一个或零个领导 代码实现 class Dept { private int dep ...
随机推荐
- 用python生成你想要的任意大小文件
在测试的日常工作中,我们经常会需要测试上传文件的边界值.今天分享一段30行的简单代码,可以生成任意大小的文件,方便测试. file_size=input("请输入想要生成文件的大小:(单位M ...
- 内网渗透----Linux信息收集整理
一.基础信息收集 1.查看系统类型 cat /etc/issue cat /etc/*-release cat /etc/lsb-release cat /etc/redhat-release 2.内 ...
- DC-2
环境搭建 下载地址: https://download.vulnhub.com/dc/DC-2.zip.torrent 从描述中得知有5个flag. 下载好后导入虚拟机 修改网络配置为NAT 探测靶机 ...
- OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台
前言 移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持. Ffmpeg的移植 Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...
- 从文件下载视角来理解Web API
一.问题源起 从Web From过来的人应该会比较熟悉以下下载文件的代码: [HttpPost] [Route("Download")] public void Download( ...
- linklist template
#include <iostream.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode ...
- Spring cache源码分析
Spring cache是一个缓存API层,封装了对多种缓存的通用操作,可以借助注解方便地为程序添加缓存功能. 常见的注解有@Cacheable.@CachePut.@CacheEvict,有没有想过 ...
- python 列表list-增删改查操作
初始化: a. data_list1 = [] b. data_list2 = [a,b,c] c. data_list = list() 新增: a. data_list1.ap ...
- Spring基于xml注入bean的几种方式?
(1)Set方法注入: (2)构造器注入:①通过index设置参数的位置:②通过type设置参数类型: (3)静态工厂注入: (4)实例工厂:
- 什么是通用 SQL 函数?
1.CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出.通常用于将两个 或多个字段合并为一个字段. 2.FORMAT(X, D)- 格式化数字 X 到 D 有效数字. 3.CURRDA ...