`
jiauwu
  • 浏览: 82242 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA获取DB元数据

    博客分类:
  • DB
阅读更多
package com.util.jdbc;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Enumeration;

import org.apache.log4j.Logger;

/**
 * @author ken
 * @Time 2011-12-10
 * SQL API 学习
 */
public class JDBCMsg {

	private static Logger log = Logger.getLogger(JDBCMsg.class);
	
	public static void main(String[] args) throws SQLException {
		//rs connection 未关闭
		//getAllDriverMsg();
		//getDBParameterMetaData();
		demoDB();
	}
	
	/**
	 * 取一个数据库中所有表的信息
	 * @throws SQLException 
	 */
	public static void demoDB() throws SQLException{
		Connection conn = JDBCUtil.getConnection();
		log.info("######  DatabaseMetaData关于数据库的整体综合信息====");
		java.sql.DatabaseMetaData dbmd = conn.getMetaData();

		log.info("数据库产品名: " + dbmd.getDatabaseProductName());
		log.info("数据库是否支持事务: " + dbmd.supportsTransactions());
		log.info("数据库产品的版本号:"+dbmd.getDatabaseProductVersion());
		log.info("数据库的默认事务隔离级别:"+dbmd.getDefaultTransactionIsolation());
		log.info("支持批量更新:"+dbmd.supportsBatchUpdates());
		log.info("DBMS 的 URL:"+dbmd.getURL());
		log.info("数据库的已知的用户名称:"+dbmd.getUserName());
		log.info("数据库是否处于只读模式:"+dbmd.isReadOnly());
		log.info("数据库是否支持为列提供别名:"+dbmd.supportsColumnAliasing());
		log.info("是否支持指定 LIKE 转义子句:"+dbmd.supportsLikeEscapeClause());
		log.info("是否为外连接提供受限制的支持:"+dbmd.supportsLimitedOuterJoins());
		log.info("是否允许一次打开多个事务:"+dbmd.supportsMultipleTransactions());
		log.info("是否支持 EXISTS 表达式中的子查询:"+dbmd.supportsSubqueriesInExists());
		log.info("是否支持 IN 表达式中的子查询:"+dbmd.supportsSubqueriesInIns());
		log.info("是否支持给定事务隔离级别:"+dbmd.supportsTransactionIsolationLevel(1));
		log.info("此数据库是否支持事务:"+dbmd.supportsTransactions());
		log.info("此数据库是否支持 SQL UNION:"+dbmd.supportsUnion());
		log.info("此数据库是否支持 SQL UNION ALL:"+dbmd.supportsUnionAll());
		log.info("此数据库是否为每个表使用一个文件:"+dbmd.usesLocalFilePerTable());
		log.info("此数据库是否将表存储在本地文件中:"+dbmd.usesLocalFiles());
		log.info("底层数据库的主版本号:"+dbmd.getDatabaseMajorVersion());
		log.info("底层数据库的次版本号:"+dbmd.getDatabaseMinorVersion());
		
		log.info("JDBC 驱动程序的主版本号:"+dbmd.getJDBCMajorVersion());
		log.info("JDBC 驱动程序的次版本号:"+dbmd.getJDBCMinorVersion());
		log.info("JDBC 驱动程序的名称:"+dbmd.getDriverName());
		log.info("JDBC 驱动程序的 String 形式的版本号:"+dbmd.getDriverVersion());
		
		log.info("可以在不带引号的标识符名称中使用的所有“额外”字符:"+dbmd.getExtraNameCharacters());
		log.info("用于引用 SQL 标识符的字符串:"+dbmd.getIdentifierQuoteString());
		log.info("允许用于类别名称的最大字符数:"+dbmd.getMaxCatalogNameLength());
		log.info("允许用于列名称的最大字符数:"+dbmd.getMaxColumnNameLength());
		log.info("允许在 GROUP BY 子句中使用的最大列数:"+dbmd.getMaxColumnsInGroupBy());
		log.info("允许在 SELECT 列表中使用的最大列数:"+dbmd.getMaxColumnsInSelect());
		log.info("允许在表中使用的最大列数:"+dbmd.getMaxColumnsInTable());
		log.info("数据库的并发连接的可能最大数:"+dbmd.getMaxConnections());
		log.info("允许用于游标名称的最大字符数:"+dbmd.getMaxCursorNameLength());
		log.info("在同一时间内可处于开放状态的最大活动语句数:"+dbmd.getMaxStatements());
		
		//获取所有表 new String[]{"TABLE"} 
		//String[] type = {"TABLE","VIEW"}  null
		log.info("###### 获取表的信息");
		ResultSet tSet = dbmd.getTables(null, "%", "%", new String[]{"TABLE","VIEW"});
        while (tSet.next()) {
            log.info(tSet.getRow()+"_表类别:"+tSet.getString("TABLE_CAT")+"_表模式:"+tSet.getString("TABLE_SCHEM")
            		+"_表名称:"+tSet.getString("TABLE_NAME")+"_表类型:"+tSet.getString("TABLE_TYPE")
            		//+"\n_表的解释性注释:"+tSet.getString("REMARKS")+"_类型的类别:"+tSet.getString("TYPE_CAT")
            		//+"\n_类型模式:"+tSet.getString("TYPE_SCHEM")+"_类型名称:"+tSet.getString("TYPE_NAME")
            		//+"\n_有类型表的指定'identifier'列的名称:"+tSet.getString("SELF_REFERENCING_COL_NAME")
            		//+"\n_指定在 SELF_REFERENCING_COL_NAME 中创建值的方式:"+tSet.getString("REF_GENERATION")
            		);
            //2_表类别:MANOR_表模式:PUBLIC_表名称:SYS_RESOURCE_表类型:TABLE
            String tableName = tSet.getString(3);
            String sql = "select * from " + tableName;
            ResultSet rsSet = conn.createStatement().executeQuery(sql);
    		ResultSetMetaData rsData = rsSet.getMetaData();
    		for (int i = 1; i <= rsData.getColumnCount(); i++) {
				log.info("==列的信息:获取SQL语句的列名:"+rsData.getColumnName(i)+"("+rsData.getColumnLabel(i)+","+rsData.getColumnType(i)+","+rsData.getColumnClassName(i)+")"
						+" 列宽"+rsData.getPrecision(i)+" 大小写敏感"+rsData.isCaseSensitive(i)+" isReadOnly:"+rsData.isReadOnly(i));
				//==列的信息:获取SQL语句的列名:LIMITLEVER(LIMITLEVER,5,java.lang.Short) 列宽5 大小写敏感true isReadOnly:false
			}
    		
		}
        tSet.close();
        
        log.info("###### 获取当前数据库所支持的SQL数据类型");
        ResultSet tableType = dbmd.getTypeInfo();
        while(tableType.next()){
        	log.info("数据类型名:"+tableType.getString(1)
        		 +",短整型的数:"+tableType.getString(2)
        		 +",整型的数:"+tableType.getString(3)
        		 +",最小精度:"+tableType.getString(14)
        		 +",最大精度:"+tableType.getString(15));
        	//数据类型名:TIMESTAMP,短整型的数:93,整型的数:23,最小精度:0,最大精度:10
        	//数据类型名:VARCHAR,短整型的数:12,整型的数:2147483647,最小精度:0,最大精度:0
        }
         
        log.info("###### 表的主键列信息");
        ResultSet primaryKey = dbmd.getPrimaryKeys("MANOR","PUBLIC","SYS_ROLE_RES");
        while(primaryKey.next()){
         log.info("表名:"+primaryKey.getString("TABLE_NAME")+",列名:"+primaryKey.getString("COLUMN_NAME")
        		 +" 主键名:"+primaryKey.getString("PK_NAME"));
         //表名:SYS_ROLE_RES,列名:SYS_RES_ID 主键名:CONSTRAINT_9
         //表名:SYS_ROLE_RES,列名:SYS_ROLE_ID 主键名:CONSTRAINT_9
        }
        
        log.info("###### 表的外键列信息");
        ResultSet foreinKey = dbmd.getImportedKeys("MANOR","PUBLIC","SYS_ROLE_RES");
        while(foreinKey.next()){
        	log.info("主键名:"+foreinKey.getString("PK_NAME")+",外键名:"+foreinKey.getString("FKCOLUMN_NAME")
        			+",主键表名:"+foreinKey.getString("PKTABLE_NAME")+",外键表名:"+foreinKey.getString("FKTABLE_NAME")
        			+",外键列名:"+foreinKey.getString("PKCOLUMN_NAME")+",外键序号:"+foreinKey.getString("KEY_SEQ"));
        	//主键名:PRIMARY_KEY_95,外键名:SYS_RES_ID,主键表名:SYS_RESOURCE,外键表名:SYS_ROLE_RES,外键列名:ID,外键序号:1
        	//主键名:PRIMARY_KEY_A,外键名:SYS_ROLE_ID,主键表名:SYS_ROLE,外键表名:SYS_ROLE_RES,外键列名:ID,外键序号:1
        }
        
        log.info("###### 获取数据库中允许存在的表类型");
        ResultSet tableTypes = dbmd.getTableTypes();
        while(tableTypes.next()){
        	log.info("类型名:"+tableTypes.getString(1));
        	/** H2
        	 类型名:SYSTEM TABLE
        	 类型名:TABLE
        	 类型名:TABLE LINK
        	 类型名:VIEW
        	 */
        }
        
        //此外还可以获取索引等的信息
        conn.close();
	}
	
	/**
	 * PreparedStatement 信息
	 * ResultSetMetaData 信息
	 * @throws SQLException
	 */
	public static void getDBParameterMetaData() throws SQLException{
		Connection conn = JDBCUtil.getConnection(); //id,name
		PreparedStatement pre = conn.prepareStatement("SELECT * FROM SYS_APPTYPE where id = ?");
		pre.setInt(1, 3);
		java.sql.ParameterMetaData pmd = pre.getParameterMetaData();
		log.info("参数的个数:"+pmd.getParameterCount());
		log.info("获取指定参数的 SQL 类型:"+pmd.getParameterType(1));
		log.info("culomn的参数类型:"+pmd.getParameterTypeName(1));
		log.info("Java 类的完全限定名称:"+pmd.getParameterClassName(1));
		log.info("获取指定参数的模式:"+pmd.getParameterMode(1));
		log.info("获取指定参数的指定列大小:"+pmd.getPrecision(1));
		log.info("获取指定参数的小数点右边的位数:"+pmd.getScale(1));
		log.info("是否允许在指定参数中使用 null 值:"+pmd.isNullable(1));
		log.info("指定参数的值是否可以是带符号的数字:"+pmd.isSigned(1));
		
		//获取结果集元数据
		ResultSet rs = pre.executeQuery();
		while (rs.next()) {
			log.info(rs.getString(1)+"___"+rs.getString(2));
		}
		rs.close();
	}

	/**
	 * 获取所有Driver信息
	 */
	public static void getAllDriverMsg(){
		Enumeration<Driver> drivers = DriverManager.getDrivers();
		while(drivers.hasMoreElements()) {
			Driver d = drivers.nextElement();
		    log.info(d.getClass().getName()+"_"+d.getMajorVersion());
		}

	}
}
 
分享到:
评论

相关推荐

    MetaDB:MetaDB 是一个用于代谢组学元数据管理和数据处理的开源 Web 应用程序。 它基于 ISA-Tab 作为元数据输入格式。 非目标数据的分析是使用 R 包 MetaMS 完成的。 该软件是 Fondazione Edmund Mach 的一个项目

    元数据库MetaDB 是一个用于代谢组学元数据管理和数据处理的开源 Web 应用程序。 它基于作为元数据输入格式。 非目标数据的分析是使用 R 包。 该软件是 Fondazione Edmund Mach 的一个项目。概述工作流程介绍ISAtab ...

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

    书名:《Java开发实战1200例(第I卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为...

    java连接sqoop源码-sqoop-example:sqoop-示例

    中导入和导出数据。 大多数 sqoop 作业都是通过脚本编写的,这对于临时作业来说是可以的,但是当您想要自动化并将其置于持续集成路径中时,有时您需要一种编译语言以及这给您带来的好处。 我选择 scala 将我自己的...

    你不知道的JDBC高级应用

    4.元数据(MetaData)的操作:包括 parameter , DB , ResultSet的元数据,配合反射,大幅度提升程序的灵活性. 5.储存过程和CRUD的操作,获得Statement可以添加的参数,最有用的是可以获得添加后的当前的自动增长的ID. 6....

    服务器架构ppt.pptx

    报表服务器 WebFOCUS Reporting Server概述 主要用于连接各种数据源 获取数据与执行计算 执行fex文件解析 WebFOCUS核心引擎 适配器 元数据 过程文件 延时报表过程 数据缓冲区 与各种客户端交换信息 服务器架构ppt...

    Elixir Report --提升专业质量与效率的报表控件

    实际上,如今更多复杂客户要求报表以各种硬拷贝和软拷贝形式传递,并且需要从各种数据源中获取数据,如XML,文本文件,LDAP,关系数据库以及应用数据库。Elixir Report 迎合了您的优秀,尤其可帮助您显著减少开发...

    doujindb:DoujinDB @ http 的 Git 克隆

    DataImport : 使用 doujinshidb API 系统获取漫画书元数据(其他系统可能稍后添加) DoujinDB 使用 ORM 框架作为其后端。 地位 DoujinDB 它基本上是稳定的:它已经在大约 450GB 的磁盘数据(图像文件)和大约 20MB ...

    hugegraph:HugeGraph数据库核心组件,包括图形引擎,API和内置后端

    架构元数据管理,包括VertexLabel,EdgeLabel,PropertyKey和IndexLabel 多类型索引,支持精确查询,范围查询和复杂条件组合查询 插件后端存储驱动程序框架,现在支持RocksDB,Cassandra,ScylaDB,HBase和MySQL,...

    InstallAnywhere v5.5.1--专业、强大的安装工具

    摘要 用于制作应用软件的安装程序,支持任何开发平台,灵活性强,性能突出,对JAVA程序的支持也相当完善。 组件列表 技术特性 &#9830;;;;&nbsp;;;;通用安装、配置和客户化 ·在终端用户的系统上,将文件和...

    开涛高可用高并发-亿级流量核心技术

    16.7.6 模板元数据存储HTML 342 16.7.7 库存接口访问量600w/分钟 343 16.7.8 微信接口调用量暴增 344 16.7.9 开启Nginx Proxy Cache性能不升反降 344 16.7.10 配送至读服务因依赖太多,响应时间偏慢 344 16.7.11 ...

    sqoop-service

    通过使用共享元存储,我们可以拥有 Sqoop2,但通过使用 Sqoop 1,我们可以获得以下好处: Sqoop 1 经过实战测试,功能丰富,社区活跃。 我们可以分享工作 我们有一个中心点供组织获取和概览 sqoop 导入/导出

    asp.net知识库

    如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法...

    二十三种设计模式【PDF版】

    很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. ...

    ZendFramework中文文档

    13.3. 从网页上获得Feed 13.4. RSS Feed的使用 13.5. Atom Feed的使用 13.6. 单个Atom条目的处理 13.7. 修改Feed和条目结构 13.8. 自定义Feed和条目类 14. Zend_Filter 14.1. 简介 14.1.1. 什么是过滤器...

Global site tag (gtag.js) - Google Analytics