ResultSetMetaData中getColumnLabel和getColumnName的区别
利用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的区别的更多相关文章
- java.sql.ResultSetMetaData.getColumnLabel和getColumnName的区别
如果将ResultSet的结果映射到HashMap中,要使用getColumnLabel,而不要用getColumnName,这样可提高程序的健壮性 理由: getColumnName返回的是sql语 ...
- 【转】为什么我们都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- Visual Studio 中 Build 和 Rebuild 的区别
因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
随机推荐
- JOGL图形形状
图形对象 要访问程序特定于硬件和操作系统平台,以及其他语言编写,比如C和C++(原生应用)库,Java使用一种称为Java本地接口(JNI)编程框架的工作. JOGL内部使用此接口,如图中下面的图表来 ...
- ajax实现异步刷新
1. 导入 json 包: jackson-annotations-2.8.9.jar jackson-core-2.8.9.jar jackson-databind-2.8.9.jar json.j ...
- 51-Ubuntu-打包压缩-1-打包压缩简介
打包压缩是日常工作中备份文件的一种方式 在不同操作系统中,常用的打包压缩方式是不同的 Windows 常用 rar Mac 常用 zip Linux 常用 tar.gz
- Java的GC是什么?做了什么?
Java GC是Java的垃圾回收机制 Java堆是被所有线程共享的一块内存区域,所有对象实例和数组都在堆上进行内存分配.为了高效的进行垃圾回收,虚拟机把堆内存分为新生代,老年代和永久代3个区域 新生 ...
- C语言typedef
#include <stdio.h> //基本类型 typedef int MyInt; //可以对typedef产生的类型名二次起别名 typedef MyInt MyInt2; // ...
- Java Selenium起步
先将录制的脚本导出来,转成java的格式 在Eclipse中编辑并运行test 2.1 新建一个Java project: File-New-Java Project 2.2 在上一步 ...
- Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询
emmmm 写这个博客心情很复杂,,,本来这个触发器早就写好了,后来发生点事就写个博客当个备份吧,就当留纪念了:话不多数上问题以及SQL: 问题: 在ABONPB表上增加一个触发器,针对车牌号字段做u ...
- shell脚本将命令的结果赋值给变量的2种写法
Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式: variable=`command`variable=$(command) 第一种方式把命令用反引号` `(位于 Esc 键的下方 ...
- MySQL主从复制&读写分离&分库分表
MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...
- 【NOI2019模拟2019.7.1】为了部落 (生成森林计数,动态规划)
Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D ...