`
jiauwu
  • 浏览: 83393 次
  • 性别: 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());
		}

	}
}
 
分享到:
评论

相关推荐

    DB2导数据字典

    DB2 数据字典是数据库管理系统中的一个重要组成部分,它包含了关于数据库结构、权限、索引、表、视图、存储过程等各种元数据的信息。在DB2中,数据字典是系统自动维护的一组内部表和视图,用于提供关于数据库对象和...

    hive元数据生成建表语句

    1. **Hive Metastore API**:Hive提供了Metastore服务,通过Java API可以获取到元数据信息,包括表的字段、分区等,然后自定义脚本来生成建表语句。 2. **Hive CLI或Beeline**:使用命令行工具,如`DESCRIBE ...

    石竹元数据管理软件MetaOneCatalog_1.5分享.pdf

    4. 主流开放性:基于J2EE架构,100%采用JAVA编写,元数据存储于主流的关系型数据库系统,且支持CWM规范的XML文件生成,提供了开放的接口,便于扩展和集成。 5. 全中文化产品:作为国内唯一成熟的全中文元数据管理...

    java代码操作数据转移,把一个数据库里的东西移动到另一个数据库,自动建库建表

    在提供的"override-db"文件中,可能包含了实现上述功能的具体Java代码,包括连接管理、数据库元数据获取、结构创建和数据迁移的逻辑。如果需要进一步的分析和解释,需要查看这些源代码文件。 总之,使用Java和MySQL...

    db2数据库驱动jar包(全) db2jcc.jar+db2jcc_license_cu.jar

    - **数据库元数据获取**: 通过`DatabaseMetaData`接口,可以获取关于数据库、表、列等的各种元数据信息。 在实际开发中,通常将这两个jar文件添加到项目的类路径(classpath)中,或者在Maven或Gradle等构建工具的...

    GaussDB-driver 高斯数据库驱动 包含jdbc odbc GDS

    使用这些驱动,开发者可以创建数据库连接、执行SQL语句、处理结果集、管理事务,并进行数据库元数据的查询。例如,JDBC驱动通常需要`Class.forName()`来加载驱动,然后使用`DriverManager.getConnection()`建立连接...

    如何操作Excel读取数据导入DB2数据库

    为了解决这个问题,我们可以考虑实现一个通用转换类,例如使用Java中的反射机制来动态读取Excel文件的元数据,并根据元数据生成对应的SQL语句来将Excel数据导入到数据库中。 Excel读取数据导入DB2数据库需要使用POI...

    db2 数据库连接客户端

    6. **数据库元数据**:获取数据库的结构信息,如表字段、索引、主键和外键等。 7. **插件扩展**:SQuirreL支持安装插件,可以扩展其功能,例如支持更多的数据库类型或提供额外的可视化工具。 对于DB2数据库来说,...

    DB2数据操纵数据库

    DB2 支持多种数据模型,如关系模型,其中元数据包含了数据库中对象的定义,如表结构、列类型、约束等。元数据主要存储在系统的编目表和视图中,比如 SYSIBM 模式的表和 SYSCAT 模式的视图。开发人员可以通过查询这些...

    IBM DB2 JAR包

    在Java开发中,JAR(Java Archive)文件是一种打包格式,用于集合多个类文件、资源文件以及元数据,便于Java虚拟机执行。 在Java应用中,IBM DB2 JAR包通常包含了以下关键知识点: 1. **JDBC驱动程序**:DB2 JAR...

    db2code.zip

    1. **数据库连接与元数据获取**: 工具首先需要建立与数据库的连接,这通常通过JDBC(Java Database Connectivity)实现。它利用数据库驱动程序,如IBM的DB2 JDBC驱动,来获取数据库的连接。一旦连接建立,工具将...

    IBM DB2 jdbc 驱动 for v10.5(官方版)

    6. 其他特性:包括连接池、批处理、游标、元数据查询等,提供了丰富的功能和优化选项。 在实际应用中,为了确保最佳性能和稳定性,需要配置合适的连接参数,如最大连接数、超时设置等。此外,定期更新驱动到最新...

    DB2数据库连接JAR包

    JAR(Java Archive)文件是一种归档格式,用于打包Java类库,包括类文件、资源文件以及相关的元数据。 DB2 JAR包通常包含以下几种类型的驱动: 1. **类型1(JDBC-ODBC桥接驱动)**:这是一种早期的解决方案,依赖...

    db2jcc.jar,db2jcc_license_cu.jar

    此外,它还提供了对数据库元数据的访问,允许开发人员动态地获取关于数据库架构的信息,如表、列和索引。 在部署Java应用到生产环境时,确保db2jcc.jar和db2jcc_license_cu.jar与应用程序一起打包是非常重要的。在...

    获取数据库中表结构信息

    - **获取结果集元数据**:使用`ResultSet`对象的`getMetaData()`方法获取元数据信息。 - **遍历并打印元数据**:循环遍历所有列,并打印出每列的名称、类型名称、类型编码以及精度。 #### 4. 结论 通过以上介绍,...

    DB2 JDBC jar包驱动

    DB2 JDBC驱动还支持高级特性,例如事务管理、批处理、预编译的SQL语句(PreparedStatement)、存储过程调用以及数据库元数据获取等。此外,它提供了一套全面的异常处理机制,帮助开发者处理连接失败、权限问题和其他...

    构建DB2CubeView元数据桥之二

    该接口主要负责处理XML格式的数据,使得开发者可以通过各种编程语言(如Java、C++等)调用此存储过程进行元数据的交互。 ##### 2. 存储过程的优势 - **中性语言**: 由于存储过程实现了应用程序接口的中性语言特性...

    Java JDBC

    它不仅支持基本的数据查询和修改操作,还提供了高级功能如批处理、可更新的结果集以及对元数据的访问,从而提高了应用程序的性能和灵活性。 #### 关系型数据库与SQL简介 关系型数据库基于表格形式存储数据,通过...

Global site tag (gtag.js) - Google Analytics