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

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();

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值