Java 数据库编程7---使用元数据分析数据库

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

DatabaseMetaData

  DatabaseMetaData可以得到数据库的一些基本信息,包括数据库的名称,版本,以及得到表的信息,这些方法如下表所示。

序号方法描述
1String getDatabaseProductName()获取数据库的名称
2int getDriverMajorVersion()检索此JDBC驱动程序的主版本号
3int getDriverMinorVersion()检索此JDBC驱动程序的次版本号。
4ResultSet 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的信息,如下表所示。

序号方法描述
1int getColumnCount()返回此 ResultSet对象中的列数。
2boolean isAutoIncrement(int column)判断指定列是否自动编号。
3String 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表中的数据:
test表中的数据
运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值