利用jdbc连接数据库查询时,通常返回的结果就是每行数据的键值对集合。这时我们需要知道查询出来的数据有哪些字段。根据ResultSet结果集得到的ResultSetMetaData就可以获取到每个字段的名称。其中主要用getColumnLabel(int column)和getColumnName(int column)两种方法来获取。以下是3个名词的含义(取自于JDK API 1.6.0中文版)

ResultSetMetaData:用于获取关于 ResultSet 对象中列的类型和属性信息的对象;

getColumnName(int column):获取指定列的名称。

getColumnLabel(int column):获取用于打印输出和显示的指定列的建议标题。

区别:getColumnName可能只能取到查询的数据库表的字段名称,而不是sql语句中用到的别名,而getColumnLabel取到的是sql语句中指定的名称(字段名或别名)。以下是MySQL数据库和oracle数据库查询sql时两种方法的不同之处

mysql:

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException; public class Test
{
public static void main(String[] args)
{
String dirver = "com.mysql.jdbc.Driver";//数据库驱动
String dburl = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK";//数据库地址
String user = "testuser";//用户
String password = "testuser";//密码
Connection conn = null;//定义链接
PreparedStatement pstmt = null;//定义预编译命令
ResultSet rs = null;//定义结果集
try
{
Class.forName(dirver);//加载驱动
conn = DriverManager.getConnection(dburl, user, password);//获取连接
String sql = "select t.id as tid,t.name as tname,t.sex as tsex from t_user t";//定义sql语句
pstmt = conn.prepareStatement(sql);//执行sql
rs = pstmt.executeQuery();//取得结果集
if ( rs.next() )
{
ResultSetMetaData metaData = rs.getMetaData();//取得ResultSetMetaData
int count = metaData.getColumnCount();//返回此 ResultSet对象中的列数。
//遍历取出每一个查询的字段的名称
for (int i = 0; i < count; i++)
{
System.out.println("getColumnName取得的名称:" + metaData.getColumnName(i + 1).toLowerCase() + " "
+ "getColumnLabel取得的名称:" + metaData.getColumnLabel(i + 1).toLowerCase());
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{ try
{
if ( rs != null )
{
rs.close();
}
if ( pstmt != null )
{
pstmt.close();
}
if ( conn != null )
{
conn.close();
}
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
}
结果:
getColumnName取得的名称:id getColumnLabel取得的名称:tid
getColumnName取得的名称:name getColumnLabel取得的名称:tname
getColumnName取得的名称:sex getColumnLabel取得的名称:tsex

oracle:

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException; public class Test
{
public static void main(String[] args)
{
String dirver = "oracle.jdbc.driver.OracleDriver";//数据库驱动
String dburl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";//数据库地址
String user = "testuser";//用户
String password = "testuser";//密码
Connection conn = null;//定义链接
PreparedStatement pstmt = null;//定义预编译命令
ResultSet rs = null;//定义结果集
try
{
Class.forName(dirver);//加载驱动
conn = DriverManager.getConnection(dburl, user, password);//获取连接
String sql = "select t.id as tid,t.name as tname,t.sex as tsex from t_user t";//定义sql语句
pstmt = conn.prepareStatement(sql);//执行sql
rs = pstmt.executeQuery();//取得结果集
if ( rs.next() )
{
ResultSetMetaData metaData = rs.getMetaData();//取得ResultSetMetaData
int count = metaData.getColumnCount();//返回此 ResultSet对象中的列数。
//遍历取出每一个查询的字段的名称
for (int i = 0; i < count; i++)
{
System.out.println("getColumnName取得的名称:" + metaData.getColumnName(i + 1).toLowerCase() + " "
+ "getColumnLabel取得的名称:" + metaData.getColumnLabel(i + 1).toLowerCase());
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{ try
{
if ( rs != null )
{
rs.close();
}
if ( pstmt != null )
{
pstmt.close();
}
if ( conn != null )
{
conn.close();
}
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
}
结果:
getColumnName取得的名称:tid getColumnLabel取得的名称:tid
getColumnName取得的名称:tname getColumnLabel取得的名称:tname
getColumnName取得的名称:tsex getColumnLabel取得的名称:tsex

总结:

  mysql在用两个方法获取sql语句名称时显然getColumnName不符合使用者的要求,取到的不是别名。但是oracle对于两种方法取到的值是一样的。因此一般情况下还是建议使用getColumnLabel方法

注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!

ResultSetMetaData中getColumnLabel和getColumnName的区别的更多相关文章

  1. java.sql.ResultSetMetaData.getColumnLabel和getColumnName的区别

    如果将ResultSet的结果映射到HashMap中,要使用getColumnLabel,而不要用getColumnName,这样可提高程序的健壮性 理由: getColumnName返回的是sql语 ...

  2. 【转】为什么我们都理解错了HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  3. Visual Studio 中 Build 和 Rebuild 的区别

    因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...

  4. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...

  5. java集合中List与set的区别

       java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayL ...

  6. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  7. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

  8. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

  9. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

随机推荐

  1. Git 学习第二天(三)

    删除文件: 先新建一个test文件到webgit版本库中,然后 git add            git commit 当然,我们可以在文件夹中删除文件,git 也提供了命令 rm file 此时 ...

  2. 3-vim-打开和新建文件-02-删除交换文件

    vim的异常处理 如果vim异常退出,在磁盘上可能会保存有交换文件. 若使用vi编辑该文件时看到如下图信息,按下字母d就可以删除交换文件. 注意:输入命令操作的时候关闭输入法.

  3. shiro注解权限拦截失效解决

    今天在给项目添加注解拦截的时候,总是发现拦截不起作用,加入了这个注解按照角色来进行拦截.角色不是1的用户访问此方法都会被拦截. 测试了一会发现把注解bean配置到了shiro.xml中没有起作用.需要 ...

  4. javascript基础入门之js中的数据类型与数据转换01

    javascript基础入门之js中的数据结构与数据转换01 js的组成(ECMAScript.BOM.DOM)        js中的打印语句:        数据类型        变量      ...

  5. android webview 输入法键盘遮挡输入框的问题

    新建一个工具类: /** * 解决webView键盘遮挡问题的类 * Created by zqy on 2016/11/14. */ public class KeyBoardListener { ...

  6. 文件上传到ftp服务工具类

    直接引用此java工具类就好 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep ...

  7. pandas-pd.read_csv

    read_csv()接受以下常见参数: 参数 中文名 参数类型 默认参数 参数功能 说明 filepath_or_buffer   various :文件路径.URL.或者 是read()函数返回的对 ...

  8. 利用字节流文件生成包含多文件的zip文件

    InputStream[] inputStreamsList = new InputStream[jsonArr.size()]; String[] fileNameList = new String ...

  9. leetcode-回溯

    题17: 方法一:回溯 class Solution: def letterCombinations(self, digits: str) -> List[str]: res = [] dic ...

  10. 如何配置vue-cli4.0

    这是一期主要分享vue-cli4.0配置 新建一个项目,最令人为难的是配置环境.拿vue来说,创建项目很简单,跟着文档走即可,但是要知道配置本地,测试,生产环境,以及反向代理等等,如果对于一个对vue ...