`
lhxctc
  • 浏览: 52227 次
  • 性别: 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开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例186 泛型方法与数据查询 236 实例187 泛型化方法与最小值 238 实例188 泛型化接口与最大值 239 实例189 使用通配符增强泛型 240 实例190 泛型化的折半查找法 241 第9章 编程常用类 343 9.1 Calendar类的使用 244...

    Java2核心技术.part5

    4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 ...

    Java2核心技术.part3

    4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 ...

    Java2核心技术.part1

    4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与...

    Java2核心技术.part6

    4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 ...

    Java2核心技术.part4

    4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 ...

    Java2核心技术.part2

    4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 ...

    支持多数据库的ORM框架ef-orm.zip

    表结构元数据的API也向用户开放,同时支持在使用过程中,灵活调整映射关系,因此用户可以用API动态的创建表结构的模型,从而实现各种动态类型和表的映射(例如POJO中包含一个Map,用于映射各种动态扩展的字段)企业...

    Spring中文帮助文档

    3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ApplicationContext? 3.8.2. 利用MessageSource实现国际化 ...

    Spring API

    3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ApplicationContext? 3.8.2. 利用MessageSource实现国际化 ...

    超级有影响力霸气的Java面试题大全文档

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    java 面试题 总结

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    java api最新7.0

    javax.naming.spi 提供一些方法来动态地插入对通过 javax.naming 和相关包访问命名和目录服务的支持。 javax.net 提供用于网络应用程序的类。 javax.net.ssl 提供用于安全套接字包的类。 javax.print 为 JavaTM ...

    JAVA_API1.6文档(中文)

    javax.naming.spi 提供一些方法来动态地插入对通过 javax.naming 和相关包访问命名和目录服务的支持。 javax.net 提供用于网络应用程序的类。 javax.net.ssl 提供用于安全套接字包的类。 javax.print 为 JavaTM ...

    Java范例开发大全 (源程序)

     实例26 存上100元需要多少天 40  实例27 输出100之间的所有偶数 41  实例28 如何判断回文数字 42  3.4 do…while语句 43  实例29 输出100之间的所有奇数 44  实例30 求最大的随机数 44  3.5 switch...

    java范例开发大全(pdf&源码)

    实例26 存上100元需要多少天 40 实例27 输出100之间的所有偶数 41 实例28 如何判断回文数字 42 3.4 do…while语句 43 实例29 输出100之间的所有奇数 44 实例30 求最大的随机数 44 3.5 switch语句 45 实例31 判断字母...

    java范例开发大全源代码

     实例26 存上100元需要多少天 40  实例27 输出100之间的所有偶数 41  实例28 如何判断回文数字 42  3.4 do…while语句 43  实例29 输出100之间的所有奇数 44  实例30 求最大的随机数 44  3.5 ...

Global site tag (gtag.js) - Google Analytics