ResultSetMetaData注意事项

ResultSetMetaData作用

ResultSetMetaData是做什么用的呢,刚接触jdbc的朋友可能不知道他能够做些什么事情。它能够帮我们动态获取结果集中的字段数量,字段的名称,字段的类型等信息。JDBC的ResultSet大家总知道吧。可以通过下面的语句得到ResultSetMetaData的对象:

ResultSetMetaData的更多接口信息可以看JDK安装目录下的rt.jar包中的java.sql.ResultSetMetaData接口声明

ResultSet rs = //查询出的结果集
ResultSetMetaData metaData = rs.getMetaData()

在工作中需要获取到返回结果中每一个字段的归属,即这个字段是属于哪个表的。因为在有些情况下两个不同的表里面可能会有两个相同的字段名称。查看ResultSetMetaData的接口声明发现里面有两个方法:

/**
     * Gets the designated column's suggested title for use in printouts and
     * displays. The suggested title is usually specified by the SQL <code>AS</code>
     * clause.  If a SQL <code>AS</code> is not specified, the value returned from
     * <code>getColumnLabel</code> will be the same as the value returned by the
     * <code>getColumnName</code> method.
     *
     * @param column the first column is 1, the second is 2, ...
     * @return the suggested column title
     * @exception SQLException if a database access error occurs
     */
    String getColumnLabel(int column) throws SQLException;
    /**
     * Get the designated column's name.
     *
     * @param column the first column is 1, the second is 2, ...
     * @return column name
     * @exception SQLException if a database access error occurs
     */
    String getColumnName(int column) throws SQLException;

那能否用这两个方法去获取我所想要的呢,通过代码去获取发现获得到的值是空的。那就去找资料为什么会是空的呢,发现JDBC规范中有一个参数控制做这个的值,这个参数就是:ResultSetMetaDataOptions,它的默认值是0,应该设置为1才能使我们想要的功能生效。在创建JDBC连接的时候有如下的一个创建方法,可以设置JDBC的参数:

public static Connection getConnection(String url,
        java.util.Properties info) throws SQLException {

那怎么使用呢?大家可以像下面这样使用,我们的用户名,密码都可以放到这里面:

java.util.Properties info = new java.util.Properties();
info.put("user", cfg.getUser());
info.put("password", cfg.getPassword());
Connection connection = DriverManager.getConnection(cfg.getUrl(), info);

OK,到此,已经设置完毕了,我应该能够拿到我所想要的值了吧,可最后发现还是取不了,那到底是什么原因呢?继续找资料,没有任何有帮助的资料,最后找到别人的一个回复才发现是JDBC驱动并没有去实现这个接口。说好多的数据库的JDBC都没有实现。到此就不继续往下了,有时间了之后再去验证网友的说法。

getColumnName与getColumnLabel的总结

前面讲到了如果我们想要获取到返回结果中的列的名称,可以使用到这两个结构,看接口中的解释知道getColumnLabel()获取到到是字段的别名,如果没有别名就和实际的列的别名一致。而getColumnName()是获取真正的列名的。

这里为什么单独拿出来说这一点,是因为不是所有的数据库的JDBC驱动都是一样的,自身我自己亲自测试过的Oracl的JDBC驱动这两个方法取出来的值都是一样的。如果有别名,取出来的都是别名,取不到真实的名称。看到网上有网友测试过SQLServer数据库的JDBC,发现也是一样的结果。

猜你喜欢

转载自blog.csdn.net/qq_14838603/article/details/84583714