原文链接: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. }

<转>JDBC获取DB元数据的更多相关文章

  1. JAVA jdbc获取数据库连接

    JDBC获取数据库连接的帮助类 import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManage ...

  2. 通过jdbc获取数据库中的表结构

    通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类   1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...

  3. 使用JDBC获取各数据库的Meta信息——表以及对应的列

    先贴代码,作为草稿: 第一个是工具类, MapUtil.java [java] view plain copy import java.util.ArrayList; import java.util ...

  4. 【Spring Boot】使用JDBC 获取相关的数据

    使用JDBC 获取相关的数据 什么是JDBC Java Database Connectivity 是一种用于执行SQL语句的Java API,与数据库建立连接.发送 操作数据库的语句并处理结果. S ...

  5. 使用JDBC驱动程序处理元数据

    使用 JDBC 驱动程序处理元数据 一.前言 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列 ...

  6. jmeter使用jdbc获取注册验证码进行注册

    自动化工具测试注册功能时,往往会遇到验证码,这个烦人的验证码怎么能够解决掉呢? 通常有两种方法 让开发禁用注册码,或在测试环境写个固定的验证码 在jmeter中用 jdbc获取数据库中验证码 今天通过 ...

  7. JDBC中的元数据——1.数据库元数据

    package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...

  8. JDBC获取表的主键

    JDBC获取表的主键 案例,创建订单,并根据订单号向订单明细表插入数据 sql语句: 创建两表 create table orders(  id number(4) primary key,  cus ...

  9. 浅析ado.net获取数据库元数据信息 DeriveParameters

    写这个文章源于早先对ADO.Net获取数据库元数据上的认识,去年我在阅读ADO.Net Core Reference的时候曾经注意过DataSet的FillSchema的这个方法.这方面,在我之前的随 ...

随机推荐

  1. sed使用的并不是完全的正则表达式

    经过实验发现,命令sed 's/pattern/replacement/' file中,pattern使用的并不是完全的正则表达式,而如果想使用正则表达式,需要使用sed命令的 -r 选项: sed ...

  2. 转:shell杀死指定名称的进程

    #!/bin/sh #根据进程名杀死进程 ] then echo "缺少参数:procedure_name" exit fi PROCESS=`|grep -v grep|grep ...

  3. 网页百度地图API相关资料

    百度地图API——网页URI接口.手机网页点击直接导航:js生成一个地图网页 或 直接跳转到百度导航界面 http://developer.baidu.com/map/index.php?title= ...

  4. Best Time to Buy and Sell Stock with Cooldown

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  5. Interleaving Positive and Negative Numbers

    Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...

  6. 关于fill_parent,match_parent和wrap_content (转载)

    fill_parent&match_parent: 在Android2.2及以上版本中,fill_parent与match_parent意思相同(其中fill_parent兼容低版本).都是尽 ...

  7. Unity3d 制作物品平滑运动

    直接贴代码了 using UnityEngine; using System; using System.Collections; using System; using DataTable; pub ...

  8. form、iframe实现异步上传文件

    转载自:http://blog.csdn.net/sunjing21/article/details/4779321 实现主要功能: 页面提供一个上传图片的input file选择框,用于上传某一类型 ...

  9. C#一维数组

    数组:相同数据类型的元素按照一定的顺序进行排列生成的集合(一组数据)一维数组:int [] array=new int[5];int[] array = new int[] {1,2,3,4,5 }; ...

  10. 【Git】笔记1

    学习廖雪峰Git教程的笔记 Git是什么: Git是目前世界上最先进的分布式版本控制系统 Git与Github的关系:github是一个用git做版本控制的项目托管平台,它为开源项目免费提供Git存储 ...