针对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语句的更多相关文章

  1. java程序获得SqlServer数据表的表结构

    /**   * 取得一张表的结构信息   * 使用DatabaseMetaData与ResultSetMetaData结合的方式获取全部属性   * @param conn   数据连接   * @p ...

  2. sqlserver数据库导出表结构和表数据生成创建表和insert语句

    问题描述: 有时候我们只需要导出一张表和表数据到另外一个数据库,如果是备份整个库的话,就会很麻烦那样,没法满足需求. 解决方法: 以sqlserver2014为例:把MGActivity数据库的bat ...

  3. (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREA ...

  4. 利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFram ...

  5. EntityFramework6.1自动生成复数名称数据表的问题

    遇到一个很奇怪的问题,两个程序部署在两个不同的机器上,一个是.net 4.6.1另外一个是.net 4.0的运行时,两个项目都引用了EntityFramework6.1.3.程序分别执行后,4.0环境 ...

  6. 关于EF中实体和数据表以及查询语句映射的问题

    关于EF中实体和数据表以及查询语句映射的问题? 很多人在使用的时候分不清楚 实体字段应该少于等于(数据库中的表字段或者SQL查询中的临时字段).这样在查询或者添加修改都不会出现问题 如果实体的字段大于 ...

  7. 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)

    图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...

  8. Oracle数据库表的备份和数据表的删除操作

    --Oracle数据库中的表备份: --备份语句:在备份之后就可以将这张表的所有数据源删除了,但是之后有人对这张表的数据进行操作,但是在操作完成之后要记得将数据表恢复 CREATE TABLE DZH ...

  9. Java基础_0311: 数据表与简单Java类映射

    数据表与简单Java类映射 现在假设有如下的关系表,现在要求实现如下的数据关联操作: 一个部门有多个雇员: 一个雇员有一个或零个领导 代码实现 class Dept { private int dep ...

随机推荐

  1. Linux常用性能诊断命令详解

    top top命令动态地监视进程活动与系统负载等信息. 使用示例: top 效果如下图: 以上命令输出视图中分为两个区域,一个统计信息区,一个进程信息区. 统计信息区: 第一行信息依次为:系统时间.运 ...

  2. 详解 Java 内部类

    内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点. 从种类上说,内部类可以分为四类: ...

  3. Arcgis Server发布的带有透明度的地图服务,调用时不显示透明度问题

    问题: 在发布道路地图时候设置地图透明度为50% 使用arcgis API for js 中 ArcGISDynamicMapServiceLayer 调用该地图时,发现透明效果不实现 如下图: 解决 ...

  4. 使用python自动发放员工工资条到个人邮箱

    人力资源部每个月发工资条,以前靠人工手动一条一条的复制,200多号员工,差不多需要耗费一天时间. 用python写个脚本,分分钟的事情就可以全部发送完. 我这边工资表如下图 姓名在C列,邮箱在B列. ...

  5. 同一局域网ping ip 失败(可能是你的路由器坑了你)

    事件起源:手机需要通过fiddler代理抓包 一顿操作猛如虎,手机输入ip+端口,芭比q了,连接不上.. 解决思路: 一.保证双方处于同一局域网内 二.查看电脑配置,找到 防火墙,关闭防火墙,再试 三 ...

  6. bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...

  7. [源码解析] TensorFlow 分布式环境(5) --- Session

    [源码解析] TensorFlow 分布式环境(5) --- Session 目录 [源码解析] TensorFlow 分布式环境(5) --- Session 1. 概述 1.1 Session 分 ...

  8. eclipse启动指定jvm的版本

    参阅:https://www.eclipse.org/forums/index.php/t/1105435/ https://wiki.eclipse.org/Eclipse.ini#-vm_valu ...

  9. TCP(三)

    1.三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说 ...

  10. 图灵机器人 V1 和 V2 接入方法

    API1.0使用方法: import requests import json import yuyinhecheng as hc def Tuling(words):     Tuling_API_ ...