菜鸟学JDBC(四)

上一篇( http://blog.csdn.net/rowandjj/article/details/8967816)我们用jdbc写了一个执行简单CRUD操作的demo,并且学习了几种常见的数据类型(日期、BLOB、CLOB)。那本篇我们主要讲jdbc中的元数据的知识。
jdbc到了版本3以后加入元数据的功能,有了jdbc元数据就可以很方便的获取数据库相关的信息,如果大家了解这项功能,就会发现操作数据库的时候会更得心应手,同时也可以开发出比以前更加自动化的程序.
JDBC中的元数据分为三类,DatabaseMetaData(数据库元数据)、ParameterMetaData(参数元数据),ResultSetMetaData(结果集元数据).他们的作用不同,下面我们逐个研究:
1.DatabaseMetaData(数据库元数据):用来获取数据库的整体综合信息
使用方式:1.通过Connection类的getMetaData方法返回DatabaseMetaData对象;2.操作该元数据对象。
我们主要关注DatabaseMetaData的方法(方法太多,具体不一一列举,读者请自己查看文档,下同):

①getURL():返回一个String类对象,代表数据库的URL。

②getUserName():返回连接当前数据库管理系统的用户名。

③getDatabaseProductName():返回数据库的产品名称。

④getDatabaseProductVersion():返回数据库的版本号。

⑤getDriverName():返回驱动驱动程序的名称。

⑥getDriverVersion():返回驱动程序的版本号。

⑦isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

我们测试一下上面的方法:

package demo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DatabaseMetaDataDemo
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db_test","root","sjjhong");
            getBasicInfo(conn);
        }
        catch (ClassNotFoundException e)
        {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        catch (SQLException e)
        {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    public static void getBasicInfo(Connection conn) throws SQLException
    {
        Properties dbProp = new Properties();
        File file = new File("src\\demo\\basicInfo.properties");
        
        DatabaseMetaData dbmd = conn.getMetaData();//获取数据库元数据对象
        
        String url = dbmd.getURL();
        String userName = dbmd.getUserName();
        String dbName = dbmd.getDatabaseProductName();
        String dbVersion = dbmd.getDatabaseProductVersion();
        String drName = dbmd.getDriverName();
        String drVersion = dbmd.getDriverVersion();
        boolean isReadOnly = dbmd.isReadOnly();
        
        String temp = (isReadOnly==true) ? "true" : "false";
//        设置属性
        dbProp.setProperty("url",url);
        dbProp.setProperty("userName",userName);
        dbProp.setProperty("dbName",dbName);
        dbProp.setProperty("dbVersion",dbVersion);
        dbProp.setProperty("drName",drName);
        dbProp.setProperty("drVersion",drVersion);
        dbProp.setProperty("isReadOnly",temp);
//        把属性全部写入文件
        try
        {
            PrintWriter pw = new PrintWriter(file);//创建一个新的打印流对象,并使用指定文件作为对象(也可选择控制台)
//            PrintWriter pw = new PrintWriter(System.out);//选择控制台作为打印对象
//            dbProp.list(System.out);//输出到控制台

            dbProp.list(pw);//列出所有属性到打印流中
            pw.flush();//注意:这里一定要刷新,因为默认是不自动刷新的
            System.out.println("write success...");
        }
        catch (FileNotFoundException e)
        {
            // TODO 自动生成的 catch 块
            System.out.println("can not find the file!");
            e.printStackTrace();
        }
        
    }
} 


 

结果:
-- listing properties --
url=jdbc:mysql://localhost/db_test
dbVersion=5.6.10-log
drName=MySQL-AB JDBC Driver
dbName=MySQL
userName=root@localhost
drVersion=mysql-connector-java-5.1.23 ( Revisio...
isReadOnly=false 


 

当然,该类方法不仅限于此,比如我们还可以获得数据库中的表,主外键信息等(不一一举例):

  public static void showTables(Connection connection) throws SQLException 
    {
        DatabaseMetaData meta = connection.getMetaData(); //获取数据库连接的元数据
        //查询连接的所有Table(如果需要查询视图等,可以在最后的数组中添加VIEW...,依此类推)
        ResultSet rsTable = meta.getTables(null, null, null, new String[] { "TABLE" });
        //获取到的数据是以ResultSet形式返回
        while (rsTable.next()) 
        {
            System.out.println(rsTable.getString(1)); //第一列是Database名称
            System.out.println(rsTable.getString(2)); //第二列是用户名称(有的表可能没有对应的用户)
            System.out.println(rsTable.getString(3)); //第三列就是表名称
        }
    } 


 

2.ParameterMetaData(参数元数据):
获取关于PreparedStatement对象中每个参数标记的类型和属性信息的对象.

使用方式:

1.通过PreparedStatement 类的getParameterMetaData()获取ParameterMetaData对象;2.编写sql语句,调用相应方法。

来看一下ParameterMetaData类的主要方法:

①getParameterCount():获得指定参数的个数

②getParameterType(int param):获得指定参数的sql类型

简单使用下:

public static void basicInfo(Connection conn) throws SQLException
    {
        String sql = "select * from tb_9 where id >= ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        
        ps.setInt(1,1);
        
        ParameterMetaData pmd = ps.getParameterMetaData();
        int count = pmd.getParameterCount();//获取参数个数
        
        System.out.println("count = " + count );
        ResultSet rs = ps.executeQuery();
        while(rs.next())
        {
            System.out.println(rs.getObject("name"));
        }
        JDBCUtils.free(rs, ps, conn);//关闭数据库--->不安全,如果上面语句抛出异常则这行读不到
    } 
3.ResultSetMetaData(结果集元数据):可用于获取关于ResultSet对象中列的类型和属性信息的对象
使用方法:
1.通过ResultSet的getMetaData方法,返回ResultSetMetaData对象;2.调用该对象的方法。
该类主要方法:

①getColumnCount():返回resultset对象的列数

②getColumnName(int column):获得指定列的名称

③getColumnTypeName(int column):获得指定列的类型

具体使用
public static void basicInfo()
    {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        String sql = "select * from tb_9";
        
        try
        {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            
            ResultSetMetaData rsmd = rs.getMetaData();
            System.out.println("******************************");
            
            int count = rsmd.getColumnCount();
            
            for(int i = 0; i < count; i++)
            {
                System.out.println(rsmd.getColumnName(i+1));
            }
            System.out.println("*****************************");
            while(rs.next())
            {
                for(int i = 1; i <= count ; i++)
                {
                    System.out.println(rs.getObject(i));
                }
                
            }
        }
        catch (SQLException e)
        {
            // TODO: handle exception
            e.printStackTrace();
        }
        finally
        {
            JDBCUtils.free(rs, ps, conn);
        }
    } 

到这里相信大家对元数据有一定的了解了,希望本文对大家有所帮助。
下一篇我们介绍jdbc事务处理方面的知识,敬请期待!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值