jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》
1. jdbc 元数据
jdbc 的元数据, 指的是数据库的基本信息(数据库版本号, 数据库列表等) 和 查询结果集中的列信息(列名称, 列数量等).
1.1 DatabaseMetaData 常用API
DatabaseMetaData 用于获取数据库的基本信息, 如数据库版本号, 数据库连接地址,用户名, 数据库表类型等信息.DatabaseMetaData 通过Connection 对象获取, 也就是说只要拿到数据库连接, 便可以获取到数据库的一切信息DatabaseMetaData 很多API 会返回ResultSet 类型返回值, 需要对ResultSet 进行遍历解析DatabaseMetaData API 有很多, 笔者列举几个常用的:
方法签名方法描述
String getURL()获取数据库连接URL, 即配置的jdbcUrlString getUserName()获取数据库连接用户名String getDatabaseProductName()获取数据库产品名称String getDatabaseProductVersion()获取数据库版本号int getDatabaseMajorVersion()获取数据库主版本号int getDatabaseMinorVersion()获取数据库子版本号String getDriverName()获取jdbc驱动名称ResultSet getTableTypes()获取数据库支持的表类型ResultSet getCatalogs()获取数据库列表ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String types[])获取数据库表列表
1.2 ResultSetMetaData 常用API
ResultSetMetaData 用于获取ResultSet 结果集返回的信息, 可以获取ResultSet 的列数, 列名称, 列别名, 列类型等ResultSetMetaData 不仅仅可用于查询返回的ResultSet的信息, 只要是ResultSet 便可以获取其MetaData 信息. 如DatabaseMetaData 的某些APIResultSetMetaData API 有很多, 笔者列举几个常用的:
方法签名方法描述
int getColumnCount()获取列数量String getColumnName(int column)获取列名称String getColumnLabel(int column)获取列别名, 若未指定别名,则返回列名称int getColumnType(int column)获取列类型, 返回数据库类型, 为java.sql.Types中常量对应的数值String getColumnClassName(int column)获取列自动映射的java类型String getTableName(int column)获取表名称String getCatalogName(int column)获取数据库名称
2. API 测试
2.1 测试用例
拿到数据库连接对象, 便可以获取数据库相关信息.任何返回ResultSet类型的API, 都可以获取ResultSet 的相关信息
@Test
public void test_database_metadata() throws SQLException
{
Connection connection
= DbConnUtil
.getConnection();
DatabaseMetaData dbMetaData
= connection
.getMetaData();
System
.out
.println("数据库连接地址:" + dbMetaData
.getURL());
System
.out
.println("用户名:" + dbMetaData
.getUserName());
System
.out
.println("数据库名称:" + dbMetaData
.getDatabaseProductName());
System
.out
.println("数据库版本号:" + dbMetaData
.getDatabaseProductVersion());
System
.out
.println("数据库主版本号:" + dbMetaData
.getDatabaseMajorVersion());
System
.out
.println("数据库小版本号:" + dbMetaData
.getDatabaseMinorVersion());
System
.out
.println("jdbc驱动名称:" + dbMetaData
.getDriverName());
System
.out
.println("jdbc驱动版本号:" + dbMetaData
.getDriverVersion());
System
.out
.println("******************** 数据表类型 ********************");
ResultSet tableTypesRs
= dbMetaData
.getTableTypes();
int columnCount
= tableTypesRs
.getMetaData().getColumnCount();
while (tableTypesRs
.next()) {
for (int i
= 1; i
<= columnCount
; i
++) {
System
.out
.println(tableTypesRs
.getMetaData().getColumnLabel(i
) + ":" + tableTypesRs
.getObject(i
));
}
}
System
.out
.println("******************** 数据库列表 ********************");
ResultSet catalogsRs
= dbMetaData
.getCatalogs();
while (catalogsRs
.next()) {
System
.out
.println(catalogsRs
.getObject("TABLE_CAT"));
}
System
.out
.println("******************** 数据表列表 ********************");
ResultSet tableNamesRs
= dbMetaData
.getTables("learn-mybatis3", null
, null
, new String[]{"TABLE"});
while (tableNamesRs
.next()) {
System
.out
.println(tableNamesRs
.getObject("TABLE_NAME"));
}
}
public void test_result_metaData() throws SQLException
, ClassNotFoundException
{
Connection connection
= DbConnUtil
.getConnection();
String sql
= "select id uId, name uName, password from t_user where id = 1";
Statement statement
= connection
.createStatement();
ResultSet resultSet
= statement
.executeQuery(sql
);
ResultSetMetaData metaData
= resultSet
.getMetaData();
System
.out
.println("结果集中列数量:" + metaData
.getColumnCount() + ", 列详情:");
for (int i
= 1; i
<= metaData
.getColumnCount(); i
++) {
System
.out
.print("列名称:" + metaData
.getColumnName(i
));
System
.out
.print(",\t\t列别名:" + metaData
.getColumnLabel(i
));
System
.out
.print(",\t\t列数据库类型:" + metaData
.getColumnType(i
));
System
.out
.print(",\t\t列java类型:" + metaData
.getColumnClassName(i
));
System
.out
.print(",\t\t表名称:" + metaData
.getTableName(i
));
System
.out
.println(",\t\t数据库名:" + metaData
.getCatalogName(i
));
}
while (resultSet
.next()) {
Integer id
= resultSet
.getObject("id", Integer
.class);
String uName
= resultSet
.getObject("uName", String
.class);
Object password
= resultSet
.getObject(3);
System
.out
.println("id:" + resultSet
.getObject("id"));
System
.out
.println("name:" + resultSet
.getObject("uName"));
System
.out
.println("password:" + resultSet
.getObject(3));
}
}
2.2 控制台输出
test_database_metadata:
数据库连接地址:jdbc:mysql://localhost:3306/learn-jdbc?characterEncoding=UTF-8
用户名:root@localhost
数据库名称:MySQL
数据库版本号:5.7.20-0ubuntu0.16.04.1
数据库主版本号:5
数据库小版本号:7
jdbc驱动名称:MySQL Connector Java
jdbc驱动版本号:mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e20009be )
******************** 数据表类型 ********************
TABLE_TYPE:LOCAL TEMPORARY
TABLE_TYPE:SYSTEM TABLE
TABLE_TYPE:SYSTEM VIEW
TABLE_TYPE:TABLE
TABLE_TYPE:VIEW
******************** 数据库列表 ********************
information_schema
learn-jdbc
learn-mybatis3
learn-sboot2
******************** 数据表列表 ********************
t_person
t_user
test_result_metaData:
结果集中列数量:3, 列详情:
列名称:id, 列别名:uId, 列数据库类型:4, 列java类型:java.lang.Integer, 表名称:t_user, 数据库名:learn-jdbc
列名称:name, 列别名:uName, 列数据库类型:12, 列java类型:java.lang.String, 表名称:t_user, 数据库名:learn-jdbc
列名称:password, 列别名:password, 列数据库类型:12, 列java类型:java.lang.String, 表名称:t_user, 数据库名:learn-jdbc