在JDBC中除了可以支持数据库的更新和查询操作外,还可以使用其本身提供的元数据类对数据库的组成进行分析。在JDBC中提供了DatabaseMetaDataResultSetMetaData接口来分析数据库的元数据。

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存储了ResultSetMetaData,可以通过以下方法取得一些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表中的数据:

JAVA数据分析算法 java如何进行数据分析_JAVA数据分析算法


运行结果:

该查询结果中有6列
id列不是自动增长的。
id:G1000,name:小赵,sex:男,grade:大三,major:计算机科学与技术,birthday:2015-06-09
id:G1001,name:小钱,sex:男,grade:大三,major:计算机科学与技术,birthday:2015-06-09