Java通过JDBC获取到连接后,可以从连接对象中获取有关数据库的各种信息,包括数据库
方法名 | 描述 |
---|---|
DatabaseMetaData getMetaData() | 获取数据库元数据信息 |
DatabaseMetaData类中提供了许多用于获取数据库信息的方法,方法如下:
测试代码:
package com.dfbz.demo;
import com.dfbz.utils.JdbcUtils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo16_元数据 {
/**
* 数据库元数据
*
* @throws Exception
*/
@Test
public void test1() throws Exception {
Connection connection = JdbcUtils.getConnection();
// 获取数据库元数据
DatabaseMetaData metaData = connection.getMetaData();
System.out.println(metaData.getURL()); // 打印数据库的URL
System.out.println(metaData.getUserName()); // 打印数据库的用户名
System.out.println(metaData.isReadOnly()); // 打印数据库的用户名
System.out.println(metaData.getDatabaseProductName()); // 打印数据库产品的名称
System.out.println(metaData.getDatabaseProductVersion()); // 打印数据库版本号
System.out.println(metaData.getDriverName()); // 打印数据库版本号
System.out.println(metaData.getDriverVersion()); // 打印数据库版本号
JdbcUtils.close(connection, null);
}
}
运行效果:
当使用语句对象(PreparedStatement、Statement)执行查询获取结果集时,使用结果集对象(ResultSet)可以获取本次查询结果集的元数据,元数据中包含了查询结果集的列数量、指定列的类型、指定列所在的表名等详细情况;
方法名 | 描述 |
---|---|
ResultSetMetaData getMetaData() | 获取结果集元数据信息 |
ResultSetMetaData 类中提供了许多用于获取数据库信息的方法,方法如下:
String getTableName(int column)
:获取指定列所在的表名int getColumnCount()
:结果集中有多少列String getColumnName(int column)
:结果集中指定列的列名String getColumnTypeName(int column)
:结果集中指定列的类型int getColumnDisplaySize(int column)
:结果集中指定列大小boolean isAutoIncrement(int column)
:结果集中指定列是否是自增列int isNullable(int column)
:结果集中指定列是否可以为nulldrop table if exists test1;
drop table if exists test2;
CREATE TABLE test1 (
id INT(10) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
insert into test1 values(1,'a');
insert into test1 values(2,'b');
CREATE TABLE test2 (
id INT(10) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
insert into test2 values(1,'a');
insert into test2 values(2,'b');
/**
* 结果集元数据
*
* @throws Exception
*/
@Test
public void test2() throws Exception {
// 获取连接
Connection connection = JdbcUtils.getConnection();
// 获取语句对象
Statement statement = connection.createStatement();
// 执行查询,获取结果集
ResultSet rs = statement.executeQuery("select * from test1,test2");
// 获取结果集元数据对象
ResultSetMetaData metaData = rs.getMetaData();
// 获取指定列所在的表名
System.out.println(metaData.getTableName(1)); // test1
System.out.println(metaData.getTableName(3)); // test2
System.out.println("----------------");
// 结果集中有多少列
System.out.println(metaData.getColumnCount()); // 4
System.out.println("----------------");
// 结果集中的列名
System.out.println(metaData.getColumnName(1)); // id
System.out.println(metaData.getColumnName(2)); // name
System.out.println("----------------");
// 结果集中的列名
System.out.println(metaData.getColumnTypeName(1)); // INT
System.out.println(metaData.getColumnTypeName(2)); // VARCHAR
System.out.println(metaData.getColumnTypeName(3)); // INT
System.out.println("----------------");
// 列大小
System.out.println(metaData.getColumnDisplaySize(1)); // 10
System.out.println(metaData.getColumnDisplaySize(2)); // 20
System.out.println(metaData.getColumnDisplaySize(3)); // 10
System.out.println("----------------");
// 是否是自增列
System.out.println(metaData.isAutoIncrement(1)); // true
System.out.println(metaData.isAutoIncrement(2)); // false
System.out.println(metaData.isAutoIncrement(3)); // true
System.out.println("----------------");
// 是否可以为null
System.out.println(metaData.isNullable(1)); // 0(不可以为null)
System.out.println(metaData.isNullable(2)); // 1(可以为null)
System.out.println("----------------");
JdbcUtils.close(connection, statement);
}
执行结果集:
test1
test2
----------------
4
----------------
id
name
----------------
INT
VARCHAR
INT
----------------
10
20
10
----------------
true
false
true
----------------
0
1
1
----------------
当使用PreparedStatement对参数进行预编译处理时,可以获取参数的元数据,例如预编译的参数个数、参数的类型等,但在MySQL驱动大部分方法都不支持,关于这个功能我们了解即可;
方法名 | 描述 |
---|---|
ParameterMetaData getParameterMetaData() | 获取参数元数据信息 |
int getParameterCount()
:获取预编译的参数个数String getParameterTypeName(int param)
:获取指定参数的sql类型,MySQL数据库驱动不支持/**
* 参数元数据
*
* @throws Exception
*/
@Test
public void test3() throws Exception {
// 获取连接
Connection connection = JdbcUtils.getConnection();
// 获取语句对象
PreparedStatement ps = connection.prepareStatement("select * from test1 where name=? and money=?");
// 获取参数元数据
ParameterMetaData metaData = ps.getParameterMetaData();
// 获取预编译的参数个数
System.out.println(metaData.getParameterCount());
// 获取指定参数的sql类型,MySQL数据库驱动不支持
// System.out.println(metaData.getParameterTypeName(1));
// System.out.println(metaData.getParameterTypeName(2));
System.out.println("--------------------");
JdbcUtils.close(connection, ps);
}