/**
  * 取得一张表的结构信息
  * 使用DatabaseMetaData与ResultSetMetaData结合的方式获取全部属性
  * @param conn   数据连接
  * @param tableName    表名
  * @return  表结构中列的存储对象
  * @throws SQLException
  */
 public TableInfo getTableInfo(Connection conn,Statement st, String tableName) throws SQLException{
  TableInfo result = new TableInfo();
  /**设置表名*/
  result.setTableName(tableName);
  DatabaseMetaData dbmd = conn.getMetaData();
  ResultSet rs = dbmd.getColumns(null, null, tableName.toUpperCase(), null);
  /**判断字段是否自增*/
  String sql = "select * from " + tableName + " where 1=2";
  ResultSet rst = conn.prepareStatement(sql).executeQuery();
  ResultSetMetaData rsmd = rst.getMetaData();
  int i=1;
  
  while(rs.next()){
   //列名称
   String columnName = rs.getString("COLUMN_NAME").toLowerCase();//列名
   //数据类型
   int dataType = rs.getInt("DATA_TYPE");//类型  
   //数据类型名称
   String dataTypeName = rs.getString("TYPE_NAME").toLowerCase();   
   //精度,列的大小
   int precision = rs.getInt("COLUMN_SIZE");//精度   
   //小数位数
   int scale = rs.getInt("DECIMAL_DIGITS");// 小数的位数   
   //是否为空
   int isNull = rs.getInt("NULLABLE");//是否为空   
   //字段默认值
   String defaultValue = rs.getString("COLUMN_DEF");
   //是否自增
   boolean isAutoIncrement = rsmd.isAutoIncrement(i); //自增
   
   ColumnInfo col = new ColumnInfo();                     
   col.setName(columnName);
   col.setDataType(dataType);
   col.setDataTypeName(dataTypeName);
   col.setPrecision(precision);
   col.setScale(scale);
   col.setIsNull(isNull); 
   col.setDefaultValue(defaultValue);
   col.setAutoIncrement(isAutoIncrement);
   
   result.setColInfo(columnName, col);
   i++;
  }
  rs.close();
  /**设置主键*/
  rs = dbmd.getPrimaryKeys(null, null, tableName);
  while(rs.next()){
   result.setPrimaryKey(rs.getString("COLUMN_NAME").toLowerCase(), true);
   System.out.println(rs.getString("COLUMN_NAME"));
  }
  rs.close();
  return result;
 }

/**
 * 列信息存储对象
 * @author 
 */
public class ColumnInfo {
 /** 主键标识 */
 private boolean isKey;
 /** 列名称 */
 private String name;
 /** 数据类型 */
 private int dataType;
 /** 数据类型名称 */
 private String dataTypeName;
 /** 自增标识 */
 private boolean isAutoIncrement;
 /** 精度 */
 private int precision;
 /** 是否为空*/
 private int isNull;
 /**小数位数 */
 private int scale;
 /**默认值 */
 private String defaultValue;
 public boolean isKey() {
  return isKey;
 }
 public void setKey(boolean isKey) {
  this.isKey = isKey;
 }

public String getDefaultValue() {

return defaultValue;
 }
 public void setDefaultValue(String defaultValue) {
  if(null==(defaultValue)){
   
  }else{
   this.defaultValue = "'"+defaultValue+"'";
  }
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }

public int getDataType() {
  return dataType;
 }
 public void setDataType(int dataType) {
  this.dataType = dataType;
 }
 public boolean isAutoIncrement() {
  return isAutoIncrement;
 }
 public void setAutoIncrement(boolean isAutoIncrement) {
  this.isAutoIncrement = isAutoIncrement;
 }
 public String getDataTypeName() {
  return dataTypeName;
 }
 public void setDataTypeName(String dataTypeName) {
  this.dataTypeName = dataTypeName;
 }
 
 public String toString(){
  StringBuffer buf = new StringBuffer();
  buf.append("-------------\n");
  buf.append("字段名称:" + getName() + "\n");
  buf.append("数据类型:" + getDataType() + "\n");
  buf.append("类型名称:" + getDataTypeName() + "\n");
  buf.append("主键:" + isKey() + "\n");
  buf.append("自增:" + isAutoIncrement + "\n");
  buf.append("为空:" + isNull + "\n");
  buf.append("小数位数:" + scale + "\n");
  buf.append("精度:"+precision+"\n");
  buf.append("初始值:"+defaultValue+"\n");
  return buf.toString();
 }
 public int getPrecision() {
  return precision;
 }
 public void setPrecision(int precision) {
  this.precision = precision;
 }
 public int getIsNull() {
  return isNull;
 }
 public void setIsNull(int isNull) {
  this.isNull = isNull;
 }
 public int getScale() {
  return scale;
 }
 public void setScale(int scale) {
  this.scale = scale;
 }
}

java程序获得SqlServer数据表的表结构的更多相关文章

  1. 使用java生成备份sqlserver数据表的insert语句

    针对sqlserver数据表的备份工具很多,有时候条件限制需要我们自己生成insert语句,以便后期直接执行这些插入语句.下面提供了一个简单的思路,针对mysql或oracle有兴趣的以后可以试着修改 ...

  2. java程序执行命令行,解锁数据库表

    有些表锁的时间长或其他原因,在plsql中不能解锁,只能用命令行解锁. 有些功能跨平台系统的交互偶尔会锁表,就需要自动解锁. 下面是解锁的代码: package com.lg.BreakOracleU ...

  3. hbase java API跟新数据,创建表

    package hbaseCURD; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import o ...

  4. Java程序操作数据库SQLserver详解

    数据库基本操作:增删改查(CRUD) crud介绍(增.删.改.查操作) CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Del ...

  5. 【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒

    由于按一千条一插程序长期无反应,之后改为百条一插方式,运行完发现插入百万记录需要9m17s,虽然比MySQL效率差,但比单条插入已经好不少了. 对Oracle的批量插入语法不明的请参考:https:/ ...

  6. 游戏服java程序启动,显示内存溢出

    1.OutOfMemoryError:Java heap space 过程:服务器上面的mysql突然异常重启,导致了程序启动的时候报错 问题1:OutOfMemoryError:Java heap ...

  7. Java程序员可能犯的3个常见SQL错误

    概述:Java程序员不仅要具备扎实的Java编程能力,在日常的工作当中往往还要涉及到其他语言的基础知识,尤其是SQL.那么哪些常见的SQL错误是程序员们容易犯的呢?让我们一起来看看吧! 你可能看到Ja ...

  8. 开发入门,学Java还是学大数据?

    经常有人问,我想学习开发,到底是学Java好还是学大数据好?或者是,学习大数据还有必要学Java吗?      依我说,这个提问的标准答案是:两者都学.      先来甩两张图.      一张是腾讯 ...

  9. java基础(28):数据库、表及表数据、SQL语句

    1. 数据库 1.1 数据库概述 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. 什么是数据库 ...

随机推荐

  1. TOJ 1139.Compromise

    2015-06-03 问题简述: 大概就是输入两段文本(用小写英文字母表示),分别用#表示一段话的结束输入,输出这两个文本的最长公共子序列. 简单的LCS问题,但是输入的是一段话了,而且公共部分比较是 ...

  2. Centos 7 安装Mono和Jexus 默认目录安装 (一)

    一.准备环境 yum -y install gcc gcc-c++ bison pkgconfig glib2-devel gettext make libpng-devel libjpeg-deve ...

  3. 如何重启MySQL服务,正确重启mysql

    RedHat Linux (Fedora Core/Cent OS) 1.启动:/etc/init.d/mysqld start 2.停止:/etc/init.d/mysqld stop 3.重启:/ ...

  4. SeaJS 简单试用

    http://seajs.org/docs/#quick-start 感觉seajs的语法有点罗嗦... 它既有RequireJS的特点也有NodeJS引入模块的特点 例子是抄的官方的例子  在官方的 ...

  5. Windows 键盘快捷键

    Windows 键盘快捷键 标签页和窗口快捷键 Ctrl+N 打开新窗口. Ctrl+T 打开新标签页. Ctrl+Shift+N 在隐身模式下打开新窗口. 按 Ctrl+O,然后选择文件. 通过 G ...

  6. Qt中如果通过QStyle自定义能够跨平台的界面控件

    我们经常会碰到需要定制界面控件的要求.如果只是在一个平台上,比如说你的控件只需要在Windows上显示,那很好办,Hard code 你的look and feel就可以了.但是如果界面需要在不同平台 ...

  7. Codeblock解决注释乱码问题及在ubuntu中程序运行时乱码问题。

    (1)修改源文件保存编码在:settings->Editor->gernal settings>other settings 看到左边的Encoding group Box,改为WI ...

  8. Sencha Touch 2 结合HTML5的本地存储创建数据库实现增、删、改、查

    大家好!我是范范.本人刚接触ST2到现在刚刚两个月,6月1号接的项目,那时才知道有Sencha Touch2这个东西,到现在两个月了期间的幸酸就不说了.今天说说在项目中用到的HTML5的本地存储.可能 ...

  9. PendingIntent详解

    Intent是一个意图,一个描述了想要启动一个Activity.Broadcast或是Service的意图.它主要持有的信息是它想要启动的组件(Activity.Broadcast或是Service) ...

  10. MSSQL常用函数大全

    一.字符转换函数1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错. 2.CHA ...