在JDBC
中除了可以支持数据库的更新和查询操作外,还可以使用其本身提供的元数据类对数据库的组成进行分析。在JDBC
中提供了DatabaseMetaData
和ResultSetMetaData
接口来分析数据库的元数据。
DatabaseMetaData
DatabaseMetaData
可以得到数据库的一些基本信息,包括数据库的名称,版本,以及得到表的信息,这些方法如下表所示。
序号 | 方法 | 描述 |
---|---|---|
1 | String getDatabaseProductName() | 获取数据库的名称 |
2 | int getDriverMajorVersion() | 检索此JDBC驱动程序的主版本号 |
3 | int getDriverMinorVersion() | 检索此JDBC驱动程序的次版本号。 |
4 | ResultSet getPrimaryKeys(String catalog, String schema, String table) | 获取给定表的主键信息 |
对于上面的getPrimaryKeys
方法返回的主键信息
每个主键描述都具有下列6种描述:
TABLE_CAT
:表目录(可能为null
)TABLE_SCHEM
:表格式(可能为null
)TABLE_NAME
:表名COLUMN_NAME
:列名KEY_SEQ
short
:主键中的序列号(值1表示主键的第一列,值2表示主键中的第二列)。PK_NAME
:主键名称(可能为null
)
实例:使用DatabaseMetaData取得数据库的元信息
package my.metadata;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
public class DatabaseMetaDataDemo
{
public static final String driver = "com.mysql.jdbc.Driver";
public static final String url = "jdbc:mysql://localhost:3306/usersinfo";
public static final String user = "root";
public static final String password = "root";
public static void main(String args[]) throws Exception
{
Connection conn = null;
// 数据库元数据
DatabaseMetaData dmd = null;
ResultSet rs = null;
// 加载驱动程序
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
// 实例化元数据对象
dmd = conn.getMetaData();
System.out.println("数据库名称:" + dmd.getDatabaseProductName());
System.out.println("数据库版本:" + dmd.getDatabaseMajorVersion() + "." + dmd.getDatabaseMinorVersion());
// 取得test表的主键
rs = dmd.getPrimaryKeys(null, null, "test");
System.out.println("-----------------------------------------");
while (rs.next())
{
System.out.println("表的目录:" + rs.getString(1));//TABLE_CAT:表的目录
System.out.println("表的模式:" + rs.getString(2));//TABLE_SCHEM:表的格式(模式)
System.out.println("表名称:" + rs.getString(3));//TABLE_NAME:表名称
System.out.println("列名称:" + rs.getString(4));//COLUMN_NAME:列名称
System.out.println("主键序列号:" + rs.getShort(5));//KEY_SEQ short =>主键中的序列号(值1表示主键的第一列,值2表示主键中的第二列)。
System.out.println("主键名称:" + rs.getString(6));//PK_NAME 字符串=>主键名称(可能为null )
}
conn.close(); // 数据库关闭
}
}
运行结果:
数据库名称:MySQL
数据库版本:5.5
-----------------------------------------
表的目录:usersinfo
表的模式:null
表名称:test
列名称:id
主键序列号:1
主键名称:PRIMARY
ResultSetMetaData
使用ResultSetMetaData
可以获取关于ResultSet
对象中列的类型和属性信息。ResultSetMetaData
存储了ResultSet
的MetaData
,可以通过以下方法取得一些ResultSet
的信息,如下表所示。
序号 | 方法 | 描述 |
---|---|---|
1 | int getColumnCount() | 返回此 ResultSet对象中的列数。 |
2 | boolean isAutoIncrement(int column) | 判断指定列是否自动编号。 |
3 | String getColumnName(int column) | 获取指定列的名称。 |
要想获取一个ResultSetMetaData
,可以使用PreparedStatement
接口中的ResultSetMetaData getMetaData()
方法获取。
实例:取得ResultSet的MetaData
package my.metadata;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ResultSetMetaDataDemo
{
public static final String driver = "com.mysql.jdbc.Driver";
public static final String url = "jdbc:mysql://localhost:3306/usersinfo";
public static final String user = "root";
public static final String password = "root";
public static void main(String args[]) throws Exception
{
Connection conn = null;
ResultSetMetaData rsmd = null;
PreparedStatement pstmt = null;
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
String sql = "select id,name,sex,grade,major,birthday from test";
pstmt = conn.prepareStatement(sql); // 实例化对象
rsmd = pstmt.getMetaData();
System.out.println("该查询结果中有" + rsmd.getColumnCount() + "列");
if (rsmd.isAutoIncrement(1))
{
System.out.println(rsmd.getColumnName(1) + "列是自动增长的。");
}
else
{
System.out.println(rsmd.getColumnName(1) + "列不是自动增长的。");
}
ResultSet rs=pstmt.executeQuery();
while(rs.next())
{
System.out.print("id:"+rs.getString(1));//id
System.out.print(",name:"+rs.getString(2));//name
System.out.print(",sex:"+rs.getString(3));//sex
System.out.print(",grade:"+rs.getString(4));//grade
System.out.print(",major:"+rs.getString(5));//major
System.out.print(",birthday:"+rs.getString(6));//birthday
System.out.println();
}
pstmt.close();
conn.close(); // 数据库关闭
}
}
test表中的数据:
运行结果:
该查询结果中有6列
id列不是自动增长的。
id:G1000,name:小赵,sex:男,grade:大三,major:计算机科学与技术,birthday:2015-06-09
id:G1001,name:小钱,sex:男,grade:大三,major:计算机科学与技术,birthday:2015-06-09