Java获取DB元数据

原文:http://jiauwu.iteye.com/blog/1307617

点击(此处)折叠或打开

  1. package com.util.jdbc;
  2.   
  3. import java.sql.Connection;
  4. import java.sql.Driver;
  5. import java.sql.DriverManager;
  6. import java.sql.PreparedStatement;
  7. import java.sql.ResultSet;
  8. import java.sql.ResultSetMetaData;
  9. import java.sql.SQLException;
  10. import java.util.Enumeration;
  11.   
  12. import org.apache.log4j.Logger;
  13.   
  14. /**
  15.  * @author ken
  16.  * @Time 2011-12-10
  17.  * SQL API 学习
  18.  */
  19. public class JDBCMsg {
  20.   
  21.     private static Logger log = Logger.getLogger(JDBCMsg.class);
  22.       
  23.     public static void main(String[] args) throws SQLException {
  24.         //rs connection 未关闭

  25.         //getAllDriverMsg();

  26.         //getDBParameterMetaData();

  27.         demoDB();
  28.     }
  29.       
  30.     /**
  31.      * 取一个数据库中所有表的信息
  32.      * @throws SQLException
  33.      */
  34.     public static void demoDB() throws SQLException{
  35.         Connection conn = JDBCUtil.getConnection();
  36.         log.info("###### DatabaseMetaData关于数据库的整体综合信息====");
  37.         java.sql.DatabaseMetaData dbmd = conn.getMetaData();
  38.   
  39.         log.info("数据库产品名: " + dbmd.getDatabaseProductName());
  40.         log.info("数据库是否支持事务: " + dbmd.supportsTransactions());
  41.         log.info("数据库产品的版本号:"+dbmd.getDatabaseProductVersion());
  42.         log.info("数据库的默认事务隔离级别:"+dbmd.getDefaultTransactionIsolation());
  43.         log.info("支持批量更新:"+dbmd.supportsBatchUpdates());
  44.         log.info("DBMS 的 URL:"+dbmd.getURL());
  45.         log.info("数据库的已知的用户名称:"+dbmd.getUserName());
  46.         log.info("数据库是否处于只读模式:"+dbmd.isReadOnly());
  47.         log.info("数据库是否支持为列提供别名:"+dbmd.supportsColumnAliasing());
  48.         log.info("是否支持指定 LIKE 转义子句:"+dbmd.supportsLikeEscapeClause());
  49.         log.info("是否为外连接提供受限制的支持:"+dbmd.supportsLimitedOuterJoins());
  50.         log.info("是否允许一次打开多个事务:"+dbmd.supportsMultipleTransactions());
  51.         log.info("是否支持 EXISTS 表达式中的子查询:"+dbmd.supportsSubqueriesInExists());
  52.         log.info("是否支持 IN 表达式中的子查询:"+dbmd.supportsSubqueriesInIns());
  53.         log.info("是否支持给定事务隔离级别:"+dbmd.supportsTransactionIsolationLevel(1));
  54.         log.info("此数据库是否支持事务:"+dbmd.supportsTransactions());
  55.         log.info("此数据库是否支持 SQL UNION:"+dbmd.supportsUnion());
  56.         log.info("此数据库是否支持 SQL UNION ALL:"+dbmd.supportsUnionAll());
  57.         log.info("此数据库是否为每个表使用一个文件:"+dbmd.usesLocalFilePerTable());
  58.         log.info("此数据库是否将表存储在本地文件中:"+dbmd.usesLocalFiles());
  59.         log.info("底层数据库的主版本号:"+dbmd.getDatabaseMajorVersion());
  60.         log.info("底层数据库的次版本号:"+dbmd.getDatabaseMinorVersion());
  61.           
  62.         log.info("JDBC 驱动程序的主版本号:"+dbmd.getJDBCMajorVersion());
  63.         log.info("JDBC 驱动程序的次版本号:"+dbmd.getJDBCMinorVersion());
  64.         log.info("JDBC 驱动程序的名称:"+dbmd.getDriverName());
  65.         log.info("JDBC 驱动程序的 String 形式的版本号:"+dbmd.getDriverVersion());
  66.           
  67.         log.info("可以在不带引号的标识符名称中使用的所有“额外”字符:"+dbmd.getExtraNameCharacters());
  68.         log.info("用于引用 SQL 标识符的字符串:"+dbmd.getIdentifierQuoteString());
  69.         log.info("允许用于类别名称的最大字符数:"+dbmd.getMaxCatalogNameLength());
  70.         log.info("允许用于列名称的最大字符数:"+dbmd.getMaxColumnNameLength());
  71.         log.info("允许在 GROUP BY 子句中使用的最大列数:"+dbmd.getMaxColumnsInGroupBy());
  72.         log.info("允许在 SELECT 列表中使用的最大列数:"+dbmd.getMaxColumnsInSelect());
  73.         log.info("允许在表中使用的最大列数:"+dbmd.getMaxColumnsInTable());
  74.         log.info("数据库的并发连接的可能最大数:"+dbmd.getMaxConnections());
  75.         log.info("允许用于游标名称的最大字符数:"+dbmd.getMaxCursorNameLength());
  76.         log.info("在同一时间内可处于开放状态的最大活动语句数:"+dbmd.getMaxStatements());
  77.           
  78.         //获取所有表 new String[]{"TABLE"}

  79.         //String[] type = {"TABLE","VIEW"} null

  80.         log.info("###### 获取表的信息");
  81.         ResultSet tSet = dbmd.getTables(null, "%", "%", new String[]{"TABLE","VIEW"});
  82.         while (tSet.next()) {
  83.             log.info(tSet.getRow()+"_表类别:"+tSet.getString("TABLE_CAT")+"_表模式:"+tSet.getString("TABLE_SCHEM")
  84.                     +"_表名称:"+tSet.getString("TABLE_NAME")+"_表类型:"+tSet.getString("TABLE_TYPE")
  85.                     //+"\n_表的解释性注释:"+tSet.getString("REMARKS")+"_类型的类别:"+tSet.getString("TYPE_CAT")

  86.                     //+"\n_类型模式:"+tSet.getString("TYPE_SCHEM")+"_类型名称:"+tSet.getString("TYPE_NAME")

  87.                     //+"\n_有类型表的指定'identifier'列的名称:"+tSet.getString("SELF_REFERENCING_COL_NAME")

  88.                     //+"\n_指定在 SELF_REFERENCING_COL_NAME 中创建值的方式:"+tSet.getString("REF_GENERATION")

  89.                     );
  90.             //2_表类别:MANOR_表模式:PUBLIC_表名称:SYS_RESOURCE_表类型:TABLE

  91.             String tableName = tSet.getString(3);
  92.             String sql = "select * from " + tableName;
  93.             ResultSet rsSet = conn.createStatement().executeQuery(sql);
  94.             ResultSetMetaData rsData = rsSet.getMetaData();
  95.             for (int i = 1; i <= rsData.getColumnCount(); i++) {
  96.                 log.info("==列的信息:获取SQL语句的列名:"+rsData.getColumnName(i)+"("+rsData.getColumnLabel(i)+","+rsData.getColumnType(i)+","+rsData.getColumnClassName(i)+")"
  97.                         +" 列宽"+rsData.getPrecision(i)+" 大小写敏感"+rsData.isCaseSensitive(i)+" isReadOnly:"+rsData.isReadOnly(i));
  98.                 //==列的信息:获取SQL语句的列名:LIMITLEVER(LIMITLEVER,5,java.lang.Short) 列宽5 大小写敏感true isReadOnly:false

  99.             }
  100.               
  101.         }
  102.         tSet.close();
  103.           
  104.         log.info("###### 获取当前数据库所支持的SQL数据类型");
  105.         ResultSet tableType = dbmd.getTypeInfo();
  106.         while(tableType.next()){
  107.             log.info("数据类型名:"+tableType.getString(1)
  108.                  +",短整型的数:"+tableType.getString(2)
  109.                  +",整型的数:"+tableType.getString(3)
  110.                  +",最小精度:"+tableType.getString(14)
  111.                  +",最大精度:"+tableType.getString(15));
  112.             //数据类型名:TIMESTAMP,短整型的数:93,整型的数:23,最小精度:0,最大精度:10

  113.             //数据类型名:VARCHAR,短整型的数:12,整型的数:2147483647,最小精度:0,最大精度:0

  114.         }
  115.            
  116.         log.info("###### 表的主键列信息");
  117.         ResultSet primaryKey = dbmd.getPrimaryKeys("MANOR","PUBLIC","SYS_ROLE_RES");
  118.         while(primaryKey.next()){
  119.          log.info("表名:"+primaryKey.getString("TABLE_NAME")+",列名:"+primaryKey.getString("COLUMN_NAME")
  120.                  +" 主键名:"+primaryKey.getString("PK_NAME"));
  121.          //表名:SYS_ROLE_RES,列名:SYS_RES_ID 主键名:CONSTRAINT_9

  122.          //表名:SYS_ROLE_RES,列名:SYS_ROLE_ID 主键名:CONSTRAINT_9

  123.         }
  124.           
  125.         log.info("###### 表的外键列信息");
  126.         ResultSet foreinKey = dbmd.getImportedKeys("MANOR","PUBLIC","SYS_ROLE_RES");
  127.         while(foreinKey.next()){
  128.             log.info("主键名:"+foreinKey.getString("PK_NAME")+",外键名:"+foreinKey.getString("FKCOLUMN_NAME")
  129.                     +",主键表名:"+foreinKey.getString("PKTABLE_NAME")+",外键表名:"+foreinKey.getString("FKTABLE_NAME")
  130.                     +",外键列名:"+foreinKey.getString("PKCOLUMN_NAME")+",外键序号:"+foreinKey.getString("KEY_SEQ"));
  131.             //主键名:PRIMARY_KEY_95,外键名:SYS_RES_ID,主键表名:SYS_RESOURCE,外键表名:SYS_ROLE_RES,外键列名:ID,外键序号:1

  132.             //主键名:PRIMARY_KEY_A,外键名:SYS_ROLE_ID,主键表名:SYS_ROLE,外键表名:SYS_ROLE_RES,外键列名:ID,外键序号:1

  133.         }
  134.           
  135.         log.info("###### 获取数据库中允许存在的表类型");
  136.         ResultSet tableTypes = dbmd.getTableTypes();
  137.         while(tableTypes.next()){
  138.             log.info("类型名:"+tableTypes.getString(1));
  139.             /** H2
  140.              类型名:SYSTEM TABLE
  141.              类型名:TABLE
  142.              类型名:TABLE LINK
  143.              类型名:VIEW
  144.              */
  145.         }
  146.           
  147.         //此外还可以获取索引等的信息

  148.         conn.close();
  149.     }
  150.       
  151.     /**
  152.      * PreparedStatement 信息
  153.      * ResultSetMetaData 信息
  154.      * @throws SQLException
  155.      */
  156.     public static void getDBParameterMetaData() throws SQLException{
  157.         Connection conn = JDBCUtil.getConnection(); //id,name

  158.         PreparedStatement pre = conn.prepareStatement("SELECT * FROM SYS_APPTYPE where id = ?");
  159.         pre.setInt(1, 3);
  160.         java.sql.ParameterMetaData pmd = pre.getParameterMetaData();
  161.         log.info("参数的个数:"+pmd.getParameterCount());
  162.         log.info("获取指定参数的 SQL 类型:"+pmd.getParameterType(1));
  163.         log.info("culomn的参数类型:"+pmd.getParameterTypeName(1));
  164.         log.info("Java 类的完全限定名称:"+pmd.getParameterClassName(1));
  165.         log.info("获取指定参数的模式:"+pmd.getParameterMode(1));
  166.         log.info("获取指定参数的指定列大小:"+pmd.getPrecision(1));
  167.         log.info("获取指定参数的小数点右边的位数:"+pmd.getScale(1));
  168.         log.info("是否允许在指定参数中使用 null 值:"+pmd.isNullable(1));
  169.         log.info("指定参数的值是否可以是带符号的数字:"+pmd.isSigned(1));
  170.           
  171.         //获取结果集元数据

  172.         ResultSet rs = pre.executeQuery();
  173.         while (rs.next()) {
  174.             log.info(rs.getString(1)+"___"+rs.getString(2));
  175.         }
  176.         rs.close();
  177.     }
  178.   
  179.     /**
  180.      * 获取所有Driver信息
  181.      */
  182.     public static void getAllDriverMsg(){
  183.         Enumeration<Driver> drivers = DriverManager.getDrivers();
  184.         while(drivers.hasMoreElements()) {
  185.             Driver d = drivers.nextElement();
  186.             log.info(d.getClass().getName()+"_"+d.getMajorVersion());
  187.         }
  188.   
  189.     }
  190. }


 

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(861) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值