`

JDBC 读取sqlserver2008所有用户表的表结构

阅读更多
   package com;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
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.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 还在改进中。。。。。下面将要对比sqlserver2008和oracle类型的转换
 * 从sqlserver取出来的列类型变换成oracle的,然后在oracle创建表
 * 接着在拼接创建表结构的时候拼接insert语句,类型转换想做成xml格式。
 * 以后方便不同数据库的类型转换。
 * @author HJ
 *2010-7-31 0:53
 */
public class SqlServerTest {

	private static String JDBCURL= "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=Prison";
	private static String USER = "sa";
	private static String PWD = "123456";
	private static Connection con = null;
	private static Map<String,String> type= new HashMap<String, String>();
	
	static{
		try {
			if(type != null){
				type.put("int", "number");
				type.put("text", "blob");
				type.put("nvarchar", "varchar2");
			}
			Class.forName("net.sourceforge.jtds.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		SqlServerTest t  = new SqlServerTest();
		List<String> names = t.getAllTables("mssql", "");
		for (int i = 0; i < names.size(); i++) {
			System.out.println(names.get(i));
			System.out.println(t.getTableStruct(names.get(i),"mssql"));
		}
		
	}
	
	
	/**
	 * 获取连接
	 * @return
	 */
	public static Connection getConnection(){
		
		if(con == null){
			try {
				con = DriverManager.getConnection(JDBCURL,USER,PWD);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return con;
	}
	/**
	 * 获取某种数据库中中用户的所有表
	 * @param type
	 * @param database
	 * @return
	 */
	public List<String> getAllTables(String type,String database){
		
		List<String> list = null;
		if("mssql".equals(type)){
			//查询所有用户表
			StringBuffer sql = new StringBuffer("Select NAME FROM ")
							   .append(database)
							   .append("..SysObjects Where XType='U' orDER BY Name");
			Statement sta = null;
			ResultSet rs = null;
			try {
				sta = SqlServerTest.getConnection().createStatement();
				rs = sta.executeQuery(sql.toString());
				while(rs.next()){
					if(list == null){
						list = new ArrayList<String>();
					}
					list.add(rs.getString("NAME"));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				try {
					if(rs != null)
						rs.close();
					if(sta != null)
						sta.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return list;
	}
	/**
	 * 获取表结构
	 * @param tableName 表名 
	 * @param dataType 数据库类型
	 * @return
	 */
	public String getTableStruct(String tableName,String dataType){
		
		StringBuilder sb = null;
		if("mssql".equals(dataType)){
			
			sb = new StringBuilder("drop table if exists ")
			  				  .append(tableName).append(";")
			                  .append("\n")
			  				  .append("create table ")
			  				  .append(tableName)
			  				  .append("(")
			  				  .append("\n\t");
			String sql = "select * from "+tableName;
			Statement sta = null;
			ResultSet rs = null;
			ResultSet key = null;
			ResultSetMetaData ma = null;
			DatabaseMetaData meta = null;
			try {
				meta =SqlServerTest.getConnection().getMetaData();//取得数据库连接元数据
				//判断表中是否有主键列
				key = meta.getPrimaryKeys(null, null, tableName);
				String keyColumn = null;
				if(key.next()){
					keyColumn = key.getString(4);
				}
				sta = SqlServerTest.getConnection().createStatement();
				
				rs = sta.executeQuery(sql.toString());
				ma = rs.getMetaData();
				
				int countColumn = ma.getColumnCount();
				
				for(int i = 1;i<=countColumn; i++){
					 
					sb.append(ma.getColumnName(i)).append("\t").append(
						       ma.getColumnTypeName(i));
					 //判断长度是否为0
					 if(!"0".equals(ma.getColumnDisplaySize(i))){
						 sb.append("(").append(
							       ma.getColumnDisplaySize(i)).append(")");
					 }
					 //System.out.println(keyColumn);
						//判断是否为主键
					 if(ma.getColumnName(i).equals(keyColumn)){
						 sb.append("  primary key");
					 }
					
					  // 判断字段是否能为空
					 if(ma.isNullable(i) == ResultSetMetaData.columnNoNulls) {
					     sb.append(" ").append("not null");
					 }
					 // 最后一列去掉逗号
					 if (i != countColumn) {
					     sb.append(", \n\t");
					 } else {
					     sb.append("\n");
					 }
				}
				sb.append(")");
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				try {
					if(rs != null)
						rs.close();
					if(sta != null)
						sta.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}  
			
		}
		return sb.toString();
	}
}
分享到:
评论
1 楼 yuqihengsheng 2012-12-26  
参考了~   

相关推荐

    dbswitch工具提供源端数据库向目的端数据库的批量迁移同步功能,支持数据的全量和增量方式同步

    包括:结构迁移:支持字段类型、主键信息、建表语句等的转换,并生成建表SQL语句。支持基于正则表达式转换的表名与字段名映射转换。数据同步:基于JDBC的分批次读取源端数据库数据,并基于insert/copy方式将数据分...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    例如数据表中用户选择字段方式的改变,用户查询的需求也会不断的更新和完善。所有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,既系统应是一个开放系统,只要...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例032 判断用户输入月份的季节 42 2.4 循环控制 43 实例033 使用while与自增运算符循环遍历 数组 43 实例034 使用for循环输出杨辉三角 43 实例035 使用嵌套循环在控制台上输出 九九乘法表 44 实例036 用while循环...

    一项基于Java+Mysql+JDBC的银行中间业务系统项目.zip

    它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持...

    基于Java Swing + MySQL + JDBC 的图书管理系统.zip

    它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    7.6.1 JDBC连接SQLServer2005数据库 76.2 网站用户注册 7.7 疑难解惑 7.7.1 Prepared Statement与Statement 7.7.2 预编译的理解 7.8 精彩回顾 第8章 浅尝辄止 ——初识Struts2 8.1 本章学习任务 8.1.1 本章知识体系...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    使用 Chunk 结构重构所有执行器算子,提升分析型语句执行性能,减少内存占用,显著提升 TPC-H 结果 支持 Streaming Aggregation 算子下推 优化 `Insert Into Ignore` 语句性能,提升 10 倍以上 优化 `Insert On ...

    ADO.NET本质论.pdf

    a.2 将sql server数据类型映射到sqltype及sqldbtype a.3 将ole db dbtype映射到.net数据类型 a.4 odbc类型映射 a.5 parameter.dbtype 附录b 表达式的语法 b.1 用户自定义值 b.2 运算符 b.3 字符串运算符...

    JAVA上百实例源码以及开源项目

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

    Java数据编程指南

    Java数据库连接(JDBC) 什么是JDBC JDBC结构 开始起步 使用JDBC 一个简单的范例 对映Java与SQL类型 处理SQL错误 ResultSet与数据库元数据 JDBC中的事务处理 一个JDBC事务范例 ...

    jpivot学习总结.doc

    uniqueMembers 该属性用于优化产生的 SQL ,如果你知道这个级别和其父级别交叉后的值或者是维度表中给定的级别所有的值是唯一的,那么就可以设置该值为 true ,否则为 false 。 levelType 该 Level 的类型,默认...

    ssh(structs,spring,hibernate)框架中的上传下载

     本文选用的数据库为Oracle 9i,当然你可以在不改动代码的情况下,通过配置文件的调整将其移植到任何具有Blob字段类型的数据库上,如MySQL,SQLServer等。  总体实现  上传文件保存到T_FILE表中,T_FILE表结构...

    Java面试宝典2020修订版V1.0.1.doc

    35、MySQL、SqlServer、oracle写出字符存储、字符串转时间 52 36、update语句可以修改结果集中的数据吗? 53 37、oracle如何设置主键自动增长? 53 38、表连接、子查询的区别是什么?它们可以相互转化吗?你倾向于用...

    java 面试题 总结

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...

    好用的代码生成源码

    基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过) 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,...

    JAVA上百实例源码以及开源项目源代码

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

Global site tag (gtag.js) - Google Analytics