【Java操作表元数据备份数据】Select2Insert ---2011年代码

本文介绍了一个Java程序,该程序能够查询SQL Server数据库中的表元数据,并将查询结果转换为INSERT语句,以便进行数据备份。程序通过连接数据库,获取表结构信息,逐条读取数据记录并转换为INSERT格式,最后将这些语句写入指定文件。

代码作用:通过java查询表的元数据,然后把查询出来的数据转为Insert语句输出到文件中进行备份。

改进:

      刚毕业那会代码写的比较乱,没设计模式和分模块思想,没按照C语言的函数功能完成编码,有待改进。

      数据量太多会内存溢出,可以采用数据库分页思想解决。关于数据库分页可以参考:

              http://gaojingsong.iteye.com/blog/2266950【数据库分页】

      表太多,备份太慢,可以通过java多线程思想解决。

 

package com.nasoft.test;

 

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.PrintStream;

import java.io.Writer;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

 

/**

 * @把一个表的Select语句转化为Insert语句,做备份使用

 */

public class TestInsert {

 

//public static final String DRIVER="com.mysql.jdbc.Driver";

//

//public static final String URL="jdbc:mysql://localhost:3306/test";

//

//public static final String USERNAME="root";

//

//public static final String PASSWORD="123";

 

//public static final String DRIVER="oracle.jdbc.driver.OracleDriver";

//

//public static final String URL="jdbc:oracle:thin:@localhost:1521:ORCL";

//

//public static final String USERNAME="scott";

//

//public static final String PASSWORD="scottoracle";

 

public static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";

 

public static final String URL="jdbc:sqlserver://localhost:1433;DatabaseName=cibcdb";

 

public static final String USERNAME="sa";

 

public static final String PASSWORD="sql";

 

public Connection  getConn(){

Connection conn = null;

try {

Class.forName(DRIVER);

conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}catch (SQLException e) {

e.printStackTrace();

}

return conn; //The local variable conn may not have been initialized:局部变量的使用必须初始化

}

 

public void init(String tableName){

Connection conn = this.getConn();

String sql ="select top 10 * from "+tableName;

try {

Statement stm = conn.createStatement();

ResultSet rs = stm.executeQuery(sql);

ResultSetMetaData rmd = rs.getMetaData();

int columncount = rmd.getColumnCount(); //得到列的数量

//

//    System.out.println(rmd.getCatalogName(1)); // 得到数据库的名称

//rmd.getColumnClassName(1);

//System.out.println(rmd.getTableName(1)); //得到表的名字

 

rmd.getColumnType(1); //获取指定列的 SQL 类型

System.out.println(rmd.getColumnType(1));

rmd.getColumnTypeName(1);

//System.out.println(rmd.getColumnTypeName(1)); //CHAR:字段对应的数据库中类型

//System.out.println(rmd.getColumnClassName(3));

                        //java.lang.String:字段对应的Java 数据类型

//stm.executeQuery(sql)

 

 

StringBuffer sb1 =  new StringBuffer();

for(int k=1 ;k <= columncount ;k++){

//String columntype = rmd.getColumnClassName(k);

String columnName = rmd.getColumnLabel(k);

//System.out.println(columntype + "---" +columnName);

if(k < columncount){

sb1.append(columnName+",");

}else{

sb1.append(columnName+") values(");

}

}

while(rs.next()){

StringBuffer sb =  new StringBuffer();

String insertsql="insert into "+tableName+"(";

sb.append(insertsql).append(sb1);

 

for(int i=1 ;i <=columncount ;i++){

String columntype = rmd.getColumnClassName(i);

if(i < columncount){

if(columntype.contains("Integer")){ //如果数字类型

sb.append(rs.getObject(i)+",");

else 

{

String str= (String) rs.getObject(i);

if(null ==str || "".equals(str)){

sb.append("'',");

}else {

sb.append("'"+str.trim()+"',");

}

}

}else{

if(columntype.contains("Integer")){ //如果数字类型

sb.append(rs.getObject(i));

else 

{

String str= (String) rs.getObject(i);

if(null ==str || "".equals(str)){

sb.append("'',");

}else {

sb.append("'"+str.trim()+"',");

}

}

}

}

//System.out.println( sb.toString()+");");

 

ExportTOFile(tableName,sb.toString()+");");

 

} catch (SQLException e) {

e.printStackTrace();

}

}

 

public void ExportTOFile001(String tableName,String sql){

File file = new File("D:/"+tableName+".sql");

FileOutputStream out = null;

try {

out = new FileOutputStream(file,true);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

PrintStream pin = new PrintStream(out);

//System.setOut(pin.println());

pin.println(sql);

pin.close();

}

 

public void ExportTOFile(String tableName,String sql){

File file = new File("D:/"+tableName+".sql");

FileOutputStream out = null;

try {

out = new FileOutputStream(file,true);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Writer wr = new OutputStreamWriter(out);

try {

wr.write(sql+"\n");

wr.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

public List<String>  getTableName() throws Exception{

List list = new ArrayList();

Connection conn = this.getConn();

//String sql ="show tables";    MYSQL

String sql ="select * from tab";  //ORACLE

sql ="sp_help";  //SQL Server

Statement stm = conn.createStatement();

ResultSet rs = stm.executeQuery(sql);

while(rs.next()){

String tabname= rs.getString(1);

String type = rs.getString(3);

if("user table".equalsIgnoreCase(type)){

list.add(tabname);

}

}

 

return list;

}

 

 

public static void main(String[] args) throws Exception {

//tb_user

TestInsert tt = new TestInsert();

//tt.init("tb_user");

 

List<String> list = tt.getTableName();

for (int i = 0; i < list.size(); i++) {

//System.out.println(list.get(i));

tt.init(list.get(i));

}

 

}

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值