`
lhxctc
  • 浏览: 53129 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

JDBC读取一些元数据的常用方法

    博客分类:
  • Java
阅读更多
JDBC读取一些元数据的常用方法,网上有很多这样的DEMO,在这里我也编写一个,我用的数据库是mysql,希望对大家有所帮助



import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;


public class XZou {

	static Connection con = null;

	static {

		try {
			Class.forName("com.mysql.jdbc.Driver");

			con = DriverManager
					.getConnection(
							"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8",
							"root", "root");

			PreparedStatement pst = con
					.prepareStatement("drop table if exists user;");

			pst.execute();

			pst = con
					.prepareStatement("create table user(id int auto_increment primary key comment '主键啊',name varchar(20) not"
							+ " null comment '名称啊',age int default 18 comment '年龄啊',salary float(8,2) comment '薪水啊',rq date,sj time,rj timestamp);");

			pst.execute();

			String sql = "insert into user (name,age,salary,rq,sj,rj) values (?,?,?,?,?,?)";

			pst = con.prepareStatement(sql);

			for (int i = 1; i <= 10; i++) {

				pst.setString(1, "zs" + i);

				pst.setInt(2, 17 + i);

				pst.setFloat(3, 2600 + i * 100.0f);

				long time = System.currentTimeMillis();

				pst.setDate(4, new java.sql.Date(time));

				pst.setTime(5, new java.sql.Time(time));

				pst.setTimestamp(6, new java.sql.Timestamp(time));

				pst.addBatch();

			}

			pst.executeBatch();

			pst.close();

		} catch (Exception ex) {
			throw new ExceptionInInitializerError(ex);
		}
	}
	
	/**
	 * DatabaseMetaData一些用法
	 * @throws Exception
	 */
	public static void getDBInfo() throws Exception {
		
		DatabaseMetaData dbmd = con.getMetaData();
		
		System.out.println(dbmd.getDatabaseProductName());//获取数据库产品名称
		
		System.out.println(dbmd.getDatabaseProductVersion());//获取数据库产品版本号

		System.out.println(dbmd.getCatalogSeparator());//获取数据库用作类别和表名之间的分隔符   如test.user
		
		System.out.println(dbmd.getDriverVersion());//获取驱动版本
		
		System.out.println("*******************可用的数据库列表*********************");
		ResultSet rs = dbmd.getCatalogs();//取可在此数据库中使用的类别名,在mysql中说白了就是可用的数据库名称,只有一列

		while(rs.next()){
			
			System.out.println(rs.getString(1));
		}
		
		System.out.println("********************所有表********************************");
		/**
		 * catalog 类别名称
		 * schemaPattern 用户方案模式,
		 * tableNamePattern 表
		 * types 类型
		 * 获取所有表
		 * dbmd.getTables(catalog, schemaPattern, tableNamePattern, types)
		 */
		
		rs = dbmd.getTables(null, null, null, new String[]{"TABLE"});//参数列表 1:类别名称,2: 模式名称的模式,3:表名称模式,4:要包括的表类型所组成的列表
		
		while(rs.next()){
			
			/** 所有的列信息。如下
			 *  TABLE_CAT String => 表类别(可为 null) 
				TABLE_SCHEM String => 表模式(可为 null) 
				TABLE_NAME String => 表名称 
				COLUMN_NAME String => 列名称 
				DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型 
				TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的 
				COLUMN_SIZE int => 列的大小。 
				BUFFER_LENGTH 未被使用。 
				DECIMAL_DIGITS int => 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。 
				NUM_PREC_RADIX int => 基数(通常为 10 或 2) 
				NULLABLE int => 是否允许使用 NULL。 
				columnNoNulls - 可能不允许使用 NULL 值 
				columnNullable - 明确允许使用 NULL 值 
				columnNullableUnknown - 不知道是否可使用 null 
				REMARKS String => 描述列的注释(可为 null) 
				COLUMN_DEF String => 该列的默认值,当值在单引号内时应被解释为一个字符串(可为 null) 
				SQL_DATA_TYPE int => 未使用 
				SQL_DATETIME_SUB int => 未使用 
				CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数 
				ORDINAL_POSITION int => 表中的列的索引(从 1 开始) 
				IS_NULLABLE String => ISO 规则用于确定列是否包括 null。 
				YES --- 如果参数可以包括 NULL 
				NO --- 如果参数不可以包括 NULL 
				空字符串 --- 如果不知道参数是否可以包括 null 
				SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
				SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
				SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
				SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null) 
				IS_AUTOINCREMENT String => 指示此列是否自动增加 
				YES --- 如果该列自动增加 
				NO --- 如果该列不自动增加 
				空字符串 --- 如果不能确定该列是否是自动增加参数 

			 */
			System.out.println(rs.getString(3) + "->" + rs.getString(4));//打印表类别,表模式,表名称,列名称,
			

		}
		
		
		System.out.println("##############################################################");
		
		/**
		 * catalog 类别名称
		 * schema 用户方案名称
		 * table 表名
		 * 获取指定表的主键信息
		 * dbmd.getPrimaryKeys(catalog, schema, table)
		 * 
		 */
		rs = dbmd.getPrimaryKeys("test", null, "user");
		
		while(rs.next()){
			
			/** 
			 *  所有列信息如下:
			 *  TABLE_CAT String => 表类别(可为 null) 
				TABLE_SCHEM String => 表模式(可为 null) 
				TABLE_NAME String => 表名称 
				COLUMN_NAME String => 列名称 
				KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。 
				PK_NAME String => 主键的名称(可为 null) 

			 */
			
			System.out.println(rs.getString(1) + "," + rs.getString(2) + "," + rs.getString(3) + ","
					+ rs.getString(4) + "," + rs.getShort(5) + "," + rs.getString(6));
			
		}
		
		
		System.out.println("##############################################################");
		
		/**
		 * catalog 类别名称
		 * schemaPattern 用户方案,模式
		 * tableNamePattern 表
		 * columnNamePattern 列
		 * 获取表的列信息
		 * dbmd.getColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern)
		 */
		rs = dbmd.getColumns("test", null, "user", null);
		
		while(rs.next()){
			
			/**
			 * 所有列如下:
			 * TABLE_CAT String => 表类别(可为 null) 
				TABLE_SCHEM String => 表模式(可为 null) 
				TABLE_NAME String => 表名称 
				COLUMN_NAME String => 列名称 
				DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型 
				TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的 
				COLUMN_SIZE int => 列的大小。 
				BUFFER_LENGTH 未被使用。 
				DECIMAL_DIGITS int => 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型,则返回 Null。 
				NUM_PREC_RADIX int => 基数(通常为 10 或 2) 
				NULLABLE int => 是否允许使用 NULL。 
				columnNoNulls - 可能不允许使用 NULL 值 
				columnNullable - 明确允许使用 NULL 值 
				columnNullableUnknown - 不知道是否可使用 null 
				REMARKS String => 描述列的注释(可为 null) 
				COLUMN_DEF String => 该列的默认值,当值在单引号内时应被解释为一个字符串(可为 null) 
				SQL_DATA_TYPE int => 未使用 
				SQL_DATETIME_SUB int => 未使用 
				CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数 
				ORDINAL_POSITION int => 表中的列的索引(从 1 开始) 
				IS_NULLABLE String => ISO 规则用于确定列是否包括 null。 
					YES --- 如果参数可以包括 NULL 
					NO --- 如果参数不可以包括 NULL 
				空字符串 --- 如果不知道参数是否可以包括 null 
				SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
				SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
				SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null) 
				SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null) 
				IS_AUTOINCREMENT String => 指示此列是否自动增加 
								YES --- 如果该列自动增加 
								NO --- 如果该列不自动增加 
								空字符串 --- 如果不能确定该列是否是自动增加参数 

			 */
			
			 
			System.out.println(rs.getString("COLUMN_NAME") + " 类型=" + rs.getInt("DATA_TYPE") + " 列大小=" + rs.getInt("COLUMN_SIZE") + 
					" 注释=" + rs.getString("REMARKS") +
					" 是否允许为NULL=" + rs.getInt("NULLABLE"));
			
			
			
			//还有很多很多方法,在这里就不一一列举了
			
		}
		
		
	}
	
	/**
	 * ResultSetMetaData一些用法
	 * @throws Exception
	 */
	public static void getRsInfo() throws Exception {
		
		PreparedStatement pst = con.prepareStatement("select * from user");
		
		ResultSet rs = pst.executeQuery();
		
		ResultSetMetaData rsmd = rs.getMetaData();//结果集元
		
		System.out.println("下面这些方法是ResultSetMetaData中方法");

	    System.out.println("获得1列所在的Catalog名字 : " + rsmd.getCatalogName(1));

	    System.out.println("获得1列对应数据类型的类 " + rsmd.getColumnClassName(1));

	    System.out.println("获得该ResultSet所有列的数目 " + rsmd.getColumnCount());

	    System.out.println("1列在数据库中类型的最大字符个数" + rsmd.getColumnDisplaySize(1));

	    System.out.println(" 1列的默认的列的标题" + rsmd.getColumnLabel(1));

	    //System.out.println("1列的模式" + rsmd.GetSchemaName(1));

	    System.out.println("1列的类型,返回SqlType中的编号 " + rsmd.getColumnType(1));

	    System.out.println("1列在数据库中的类型,返回类型全名" + rsmd.getColumnTypeName(1));

	    System.out.println("1列类型的精确度(类型的长度): " + rsmd.getPrecision(1));

	    System.out.println("1列小数点后的位数 " + rsmd.getScale(1));

	    System.out.println("1列对应的模式的名称(应该用于Oracle) " + rsmd.getSchemaName(1));

	    System.out.println("1列对应的表名 " + rsmd.getTableName(1));

	    System.out.println("1列是否自动递增" + rsmd.isAutoIncrement(1));

	    System.out.println("1列在数据库中是否为货币型" + rsmd.isCurrency(1));

	    System.out.println("1列是否为空" + rsmd.isNullable(1));

	    System.out.println("1列是否为只读" + rsmd.isReadOnly(1));

	    System.out.println("1列能否出现在where中" + rsmd.isSearchable(1));


		rs.close();
		
		pst.close();
		
	}

	public static void main(String[] args) throws Exception {
		
		//getRsInfo();
		
		getDBInfo();
		
	}

}


1
0
分享到:
评论

相关推荐

    java(jdbc)学习

    JDBC提供了获取数据库和参数元数据的机制,有助于理解数据库结构和优化查询。 #### 十一、批处理的使用 批处理允许一次性执行多条SQL语句,减少了网络往返次数,提高了批量数据处理的效率。 #### 十二、JDBC其他...

    jdbc API

    9. **元数据**:`DatabaseMetaData`接口提供了一系列方法,用于获取关于数据库的信息,如表结构、列信息、索引等。 10. **JDBC驱动类型**:JDBC驱动分为四种类型,从1到4,类型4(纯Java的驱动,也叫类型4 JDBC驱动...

    JDBCDriver最齐驱动包

    ResultSetMetaData是对这个结果集的元数据的描述,包含列的数量、名称、类型等信息。开发者可以通过ResultSetMetaData获取列的详细信息,方便在程序中动态处理结果集。 6. **配置对象的属性**:在使用JDBC驱动和...

    Jdbc深入分析

    JDBC还提供了许多其他的API,如`DatabaseMetaData`用于获取数据库元数据信息;`CallableStatement`用于调用存储过程等。 #### 十、元数据信息 **10.1 数据库元数据信息** 数据库元数据信息是指关于数据库本身的...

    jdbc学习文档

    通过本文档的学习,不仅可以深入了解JDBC的基本概念和技术细节,还能够掌握一些高级用法和最佳实践,例如数据库连接池的使用、DAO设计模式的应用等。这将有助于开发者更好地理解和使用JDBC,从而提高开发效率和软件...

    JAVA数据库驱动 Orcacle JDBC驱动

    此外,Oracle的JDBC驱动支持最新的JDBC规范,如JDBC 4.2及以上版本,提供了更多特性,如结果集的滚动和分页,以及元数据查询等功能。 总之,Oracle JDBC驱动是Java开发者与Oracle数据库进行交互的关键组件,理解和...

    Java_JDBC学习教程 由浅入深.doc

    - **11.1 数据库元数据信息** - **11.2 参数元数据信息** #### 十二、批处理的使用 - 批处理可以显著提高执行大量 SQL 语句时的性能。 - 通过 `addBatch()` 方法添加 SQL 语句到批处理列表,最后使用 `executeBatch...

    Java常用架包

    通过这些驱动,开发者可以执行SQL查询、事务管理、数据库元数据获取等一系列操作。 **MySQL JDBC驱动**: MySQL的JDBC驱动是MySQL官方提供的用于Java应用程序连接MySQL数据库的接口。使用它可以创建数据库连接、...

    java常用API[整理].pdf

    Class 和 ClassLoader 是 Java 中两个重要的类,Class 表示一个类的元数据,ClassLoader 负责加载类。Class 提供了许多有用的方法,如 getClassLoader()、newInstance() 等,ClassLoader 提供了许多有用的方法,如 ...

    java常用的jar包

    Java开发过程中,jar(Java Archive)包是必不可少的组件,它们包含了预编译的类、资源文件以及元数据,使得开发者能够轻松地复用代码和依赖。以下是对标题和描述中涉及的一些关键jar包的详细解释: 1. **数据库...

    开发中常用的技术点

    它们提供API来处理PDF文档的内容、结构和元数据。 3. **基于JDBC的数据库连接池技术** 数据库连接池是管理数据库连接的一种高效机制,它可以避免频繁创建和关闭数据库连接导致的性能开销。常见的JDBC连接池有: -...

    spring-mvc开发所有jar包【4.3.4】

    5. **spring-beans-4.3.4.RELEASE.jar**:Bean工厂和元数据读取模块,用于创建、配置和管理Bean。它支持XML和注解方式的Bean定义。 6. **spring-test-4.3.4.RELEASE.jar**:提供了对Spring应用进行单元测试和集成...

    数据分析系统Hive

    其中 CLI 是最常用的交互方式之一,它支持多种命令选项,例如 `-d` 或 `--define` 用于变量替换,`-e` 用于直接执行 SQL 查询字符串,`-f` 用于从文件中读取 SQL 命令,`-h` 用于连接远程的 Hive Server,等等。...

    java笔试复习资料.pdf

    - 获取数据库元数据(DatabaseMetaData),了解数据库的具体信息。 3. Java基础API 文档中提及了几个Java基础API的使用,例如BufferedReader、InputStreamReader以及相关的异常处理。BufferedReader类用于从文本...

    利用xml技术连接数据库

    - **丰富的元数据**:XML支持自定义标签和属性,可以携带更多的上下文信息。 然而,也有其局限性,比如解析和操作XML可能会消耗更多的时间和资源,且不适用于实时、高性能的数据库操作。因此,选择适合项目需求的...

    java中的常用反射机制详细分析案例

    - **注解处理**:反射可以用于读取类、方法或字段上的注解,进行元数据驱动的编程。 - **序列化与反序列化**:`java.io.ObjectInputStream`和`java.io.ObjectOutputStream`利用反射实现对象的序列化和反序列化。 ...

    开发用的jar包

    在IT行业中,jar(Java Archive)包是一种标准的文件格式,用于封装Java类库和相关的元数据,使得多个Java类可以被一起分发和执行。标题提到的是“开发用的jar包”,这意味着这些jar文件是为Java开发人员准备的,...

    JAVA面试题

    其中,`&lt;head&gt;`部分通常包含文档的元数据,如标题、样式表链接和脚本引用,而`&lt;body&gt;`部分则包含了实际可见的内容。 ### Linux命令行基础 第五题提及了Linux命令行中的`pwd`命令,其作用是打印当前工作目录的完整...

Global site tag (gtag.js) - Google Analytics