DatabaseMetaData,ResultSet,ResultSetMetaData「建议收藏」

DatabaseMetaData,ResultSet,ResultSetMetaData「建议收藏」DatabaseMetaData,ResultSet,ResultSetMetaData三种类型的区别    出处:http://blog.csdn.net/suwu1501、DatabaseMetaData   有关整个数据库的信息:数据库产品的名称和版本,数据库中表和列等信息,关于数据库的整体综合信息。   接口关系:publicinterfaceDatabaseMetaD…

大家好,又见面了,我是你们的朋友全栈君。

DatabaseMetaData,ResultSet,ResultSetMetaData三种类型的区别       出处: http://blog.csdn.net/suwu150
1、DatabaseMetaData
    有关整个数据库的信息:数据库产品的名称和版本,数据库中表和列等信息,关于数据库的整体综合信息。
    接口关系:public interface DatabaseMetaData extends Wrapper
    所有超级接口:Wrapper 
    此接口由驱动程序供应商实现,让用户了解 Database Management System (DBMS) 在与驱动程序(基于与其一起使用的 JDBCTM 技术(“JDBC 驱动程序”))相结合时的能力。不同的关系 DBMS 常常支持不同的功能,以不同方式实现这些功能,并使用不同的数据类型。此外,驱动程序可以实现 DBMS 提供的顶级功能。此接口中的方法返回的信息关系到一起工作的特定驱动程序和特定 DBMS 的能力。注意,正如此文档中所使用的那样,术语“数据库”通常既指驱动程序,又指 DBMS。
   此接口的用户通常是一个需要发现如何处理底层 DBMS 的工具。对于试图与多个 DBMS 一起使用的应用程序而言尤其如此。例如,一个工具可能使用 getTypeInfo 方法找出可以在 CREATE TABLE 语句中使用的数据类型。或者用户可能调用 supportsCorrelatedSubqueries 方法查看是否可以使用相关子查询,或者调用 supportsBatchUpdates 查看是否可以使用批量更新。
   有些 DatabaseMetaData 方法以 ResultSet 对象的形式返回信息列表。常规 ResultSet 方法(比如 getString 和 getInt)可用于从这些 ResultSet 对象中获取数据。如果给定形式的元数据不可用,则将返回一个空 ResultSet。对于被定义为由 ResultSet 对象的给定方法所返回的列以外的其他列,可以由 JDBC 驱动程序供应商定义,且必须通过其列标签访问。

   有些 DatabaseMetaData 方法使用 String 模式的参数。这些参数都有 fooPattern 这样的名称。在模式 String 中,”%” 表示匹配 0 个或多个字符的任何子字符串,”_” 表示匹配任何一个字符。仅返回匹配搜索模式的元数据项。如果将搜索模式参数设置为 null,则从搜索中删除参数标准。

如以下代码就能获取数据库的相关信息:

 


import java.sql.Connection;

import java.sql.DatabaseMetaData;

import java.sql.DriverManager;

public class MySqlConnectionTest {

public static void getConnection() {

    Connection conn = null;

    try {

        Class.forName("com.mysql.jdbc.Driver"); // 注册数据库驱动

        String url = "jdbc:mysql://localhost:3306/briup"; // briup为数据库名称

        conn = DriverManager.getConnection(url, "root","root"); // 获取连接数据库的Connection对象

        //DatabaseMetaData实例的获取

        DatabaseMetaData metaData = conn.getMetaData();

        //获取数据库的名字

        System.out.println("获取数据库的名字:"+metaData.getDatabaseProductName());

        //获取数据库的版本

        System.out.println("获取数据库的版本:"+metaData.getDatabaseProductVersion());

        //获取数据库的主版本

        System.out.println("获取数据库的主版本:"+metaData.getDatabaseMajorVersion());

        //获取数据库的小版本

        System.out.println("获取数据库的小版本:"+metaData.getDatabaseMinorVersion());

    } catch (Exception e) {

        e.printStackTrace();

    }

}


public static void main(String[] args) {

        getConnection();

    }

}

 

获取结果如下所示:

 

DatabaseMetaData,ResultSet,ResultSetMetaData「建议收藏」

如以下代码就能获取数据库中表,队列,视图,索引的相关信息:

public void test2()

{

    try {

        //1、注册驱动

        Class.forName(driver);

        //2、获得数据库连接

        conn=DriverManager.getConnection(url, user, password);

        //DatabaseMetaData实例的获取

        DatabaseMetaData metaData = conn.getMetaData();

        //获取数据库中表的信息

        //metaData.getTables(catalog, schema, tableName, types);

        //rs=metaData.getTables(null, "BRIUP", "LOVER",new String[]{"TABLE","VIEW"});

        //rs=metaData.getTables(null, "BRIUP", null,new String[]                        
        {"TABLE","VIEW","SEQUENCE","INDEX"});

        //rs=metaData.getTables(null, "BRIUP", null,new String[]{"TABLE","VIEW"});

        rs=metaData.getTables(null, "BRIUP", null,new String[]{"TABLE"});

        while(rs.next())

        {

        String tableName=rs.getString("TABLE_NAME");

        String typeName=rs.getString("TABLE_TYPE");

        System.out.println(tableName+"--"+typeName);

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    finally

    {
    
        try {

            if(conn!=null)conn.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

 

还有获取表中相关列的信息:

//1、注册驱动

Class.forName(driver);

//2、获得数据库连接

conn=DriverManager.getConnection(url, user, password);

//DatabaseMetaData实例的获取

DatabaseMetaData metaData = conn.getMetaData();

//获取数据库中表的信息

//metaData.getColumns(catalog, schema, tableName, columnName);

// rs=metaData.getColumns(null, "BRIUP","STUDENT","NAME");

rs=metaData.getColumns(null, "BRIUP","LOVER",null);

while(rs.next())

{

    String colName=rs.getString("COLUMN_NAME");

    String typeName=rs.getString("TYPE_NAME");

    System.out.println(colName+"--"+typeName);

}

 

结果如下所示:

DatabaseMetaData,ResultSet,ResultSetMetaData「建议收藏」

当然还能获取其他信息

2、ResultSet  
    关于某个表的信息或一个查询的结果。必须逐行访问数据行,但是可以任何顺序访问列。这个ResultSet中包含的列可能是一个表中的所有列或者某些列,也能是多张表中不同的列,表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。       
    接口关系:public interface ResultSet extends Wrapper
    所有超级接口:Wrapper
    ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
    默认的 ResultSet 对象不可更新,仅有一个向前移动的光标。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。可以生成可滚动和/或可更新的 ResultSet 对象。以下代码片段(其中 con 为有效的 Connection 对象)演示了如何生成可滚动且不受其他更新影响的可更新结果集。
       Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery(“SELECT a, b FROM TABLE2”);
    ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次。
    对于获取方法,JDBC驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从 SQL 类型到 ResultSet 获取方法所使用的 Java 类型的映射关系。
    用作获取方法的输入的列名称不区分大小写。用列名称调用获取方法时,如果多个列具有这一名称,则返回第一个匹配列的值。在生成结果集的 SQL 查询中使用列名称时,将使用列名称选项。对于没有在查询中显式指定的列,最好使用列编号。如果使用列名称,则程序员应该注意保证名称唯一引用预期的列,这可以使用 SQL AS 子句确定。
    在JDBC 2.0 API(JavaTM 2 SDK 标准版 1.2 版)中,此接口添加了一组更新方法。
可以用以下两种方式使用更新方法:
    更新当前行中的列值。在可滚动的 ResultSet 对象中,可以向前和向后移动光标,将其置于绝对位置或相对于当前行的位置。以下代码片段更新 ResultSet 对象 rs 第五行中的 NAME 列,然后使用方法 updateRow 更新导出 rs 的数据源表。
           rs.absolute(5); // 定位光标到第五行
           rs.updateString(“NAME”, “AINSWORTH”); //更新第五行的name列为 AINSWORTH 
           rs.updateRow(); // 在数据源中更新     
    将列值插入到插入行中。可更新的 ResultSet 对象具有一个与其关联的特殊行,该行用作构建要插入的行的暂存区域 (staging area)。以下代码片段将光标移动到插入行,构建一个三列的行,并使用方法 insertRow 将其插入到 rs 和数据源表中。
           rs.moveToInsertRow(); // 将光标移动到插入行
           rs.updateString(1, “AINSWORTH”); //更新插入行中的第一列为AINSWORTH
           rs.updateInt(2,35); // 更新插入行中的第二列为35
           rs.updateBoolean(3, true); // 更新插入行中的第三列为true
           rs.insertRow(); //在源中更新
           rs.moveToCurrentRow();//移动光标到当前行
    当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,ResultSet 对象将自动关闭。
    ResultSet 对象的列的编号、类型和属性由 ResultSet.getMetaData 方法返回的 ResulSetMetaData 对象提供。 
3、ResultSetMetaData  
    有关 ResultSet 中列的名称和类型的信息,可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。
    接口:public interface ResultSetMetaData extends Wrapper
    所有超级接口:Wrapper              
    以下代码片段创建 ResultSet 对象 rs,创建 ResultSetMetaData 对象 rsmd,并使用 rsmd 查找 rs 有多少列,以及 rs 中的第一列是否可以在 WHERE 子句中使用。
     ResultSet rs = stmt.executeQuery(“SELECT a, b, c FROM TABLE2”);
     ResultSetMetaData rsmd = rs.getMetaData();
     int numberOfColumns = rsmd.getColumnCount();
     boolean b = rsmd.isSearchable(1);

如下所示代码:

public void test4()

{

    try {

        //1、注册驱动

        Class.forName(driver);

        //2、获得数据库连接

        conn=DriverManager.getConnection(url, user, password);

        stmt=conn.createStatement();

        String sql="select * from lover where id=1";

        rs=stmt.executeQuery(sql);

        //ResultSetMetaData实例的获取

        ResultSetMetaData metaData = rs.getMetaData();

        // 返回ResultSet结果中的列的数量

        int columnNum=metaData.getColumnCount();

        System.out.println(metaData.isSearchable(1));
    
        System.out.println("长度为:"+columnNum);

        for(int i=1;i<=columnNum;i++)
    
        {

            //返回列序号为i的列名

            System.out.println(metaData.getColumnName(i));

            //返回此列序号为i的SQL数据类型

            System.out.println(metaData.getColumnTypeName(i));

            System.out.println("--------------------");
    
        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    finally

    {

        try {

            if(conn!=null)conn.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

结果如下所示,第一个为true,第二个为列的长度,后面三个为三组,分别对应于列名和SQL数据类型:

 

DatabaseMetaData,ResultSet,ResultSetMetaData「建议收藏」

    

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150997.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ora 01031 权限不足_sql权限不足

    ora 01031 权限不足_sql权限不足原因分析:因为当前用户没有对其他用户的表的修改权限,所有报权限不足的错误。解决办法:把自己所有的权限都给用户B。grantallprivilegestoB;

    2022年4月19日
    219
  • 永恒之蓝病毒解决方法蠕虫_永恒之蓝病毒解决方法

    永恒之蓝病毒解决方法蠕虫_永恒之蓝病毒解决方法辛亏“永恒之蓝”爆发在周末,绝大部分员工在家休息,为我们避免内网病毒爆发赢取了时间,整个周末一直加固已有系统和准备应急预案,避免周一发生大规模“永恒之蓝”在内部大面积爆发的可能。整体措施和预防传染病的原理类似:控制传染源、切断传播途径,保护易感人群。1控制传染源:所有的办公电脑开机前都必须网络隔离,所有计算机严禁插入U盘,一旦出现感染电脑,直接拔电源。就内网环境而言,一旦出现一例,大概率爆…

    2022年10月10日
    4
  • Linux改变图片大小的命令,Linux运维知识之linux下使用convert命令修改图片分辨率…

    Linux改变图片大小的命令,Linux运维知识之linux下使用convert命令修改图片分辨率…本文主要向大家介绍了Linux运维知识之linux下使用convert命令修改图片分辨率,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。Convert的resize子命令应该是在ImageMagick中使用较多的命令,它实现了图片任意大小的缩放,唯一需要掌握的就是如何使用它的一些参数测试设定值:此说明文件中所用的原始文件(src.jpg),宽度:200,高度:150命令格式:…

    2022年7月16日
    19
  • python文件操作的相关函数_python 高级

    python文件操作的相关函数_python 高级前言:本博文主要讲解Python文件操作的写法,属于Python高级语法。基础语法见:深入浅出Python——Python基础语法全解,更多内容请访问博主的主页,谢谢!文章目录一、文件操作的作用二、文件的基本操作1.文件操作步骤1.1打开1.1.1打开文件模式1.1.2快速体验2.1文件对象方法1.2.1写1.2.2读1.2.3seek()3.1关闭三、文件备份1.步骤2.代码实现3.思考四、文件和文件夹的操作1.文件重命名2.删除文件3.创建文件夹4.删除文件夹5.获

    2022年10月17日
    1
  • 关于c++操作符的优先级

    优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。具有最高优

    2021年12月20日
    56
  • Cinemachine初体验

    Cinemachine初体验一、安装可以直接从packagemanager里面安装(踩过的坑:导入samples时可能会出现sample和当前使用的unity版本不兼容的情况,更换版本即可)二、cinemachine使用说明场景中需要已存在一个unitycamera,然后在该相机上挂载CinemachineBrain组件(ps:如果不是在timeline中使用虚拟相机的话,这两个属性会决定多个虚拟相机之间切换的方式)或者直接使用cinemachine新建相机,这样会自动在原有的unitycamera上挂载Cinema

    2022年5月27日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号