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

xiaoxiao2025-01-30  15

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(); }}
转载请注明原文地址: https://www.6miu.com/read-5023583.html

最新回复(0)