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:

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.PreparedStatement;
 4 import java.sql.ResultSet;
 5 import java.sql.ResultSetMetaData;
 6 import java.sql.SQLException;
 7 
 8 public class Test
 9 {
10     public static void main(String[] args)
11     {
12         String dirver = "com.mysql.jdbc.Driver";//数据库驱动
13         String dburl = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK";//数据库地址
14         String user = "testuser";//用户
15         String password = "testuser";//密码
16         Connection conn = null;//定义链接
17         PreparedStatement pstmt = null;//定义预编译命令
18         ResultSet rs = null;//定义结果集
19         try
20         {
21             Class.forName(dirver);//加载驱动
22             conn = DriverManager.getConnection(dburl, user, password);//获取连接
23             String sql = "select t.id as tid,t.name as tname,t.sex as tsex from t_user t";//定义sql语句
24             pstmt = conn.prepareStatement(sql);//执行sql
25             rs = pstmt.executeQuery();//取得结果集
26             if ( rs.next() )
27             {
28                 ResultSetMetaData metaData = rs.getMetaData();//取得ResultSetMetaData
29                 int count = metaData.getColumnCount();//返回此 ResultSet对象中的列数。
30                 //遍历取出每一个查询的字段的名称
31                 for (int i = 0; i < count; i++)
32                 {
33                     System.out.println("getColumnName取得的名称:" + metaData.getColumnName(i + 1).toLowerCase() + "   "
34                             + "getColumnLabel取得的名称:" + metaData.getColumnLabel(i + 1).toLowerCase());
35                 }
36             }
37         }
38         catch (Exception e)
39         {
40             e.printStackTrace();
41         }
42         finally
43         {
44             
45             try
46             {
47                 if ( rs != null )
48                 {
49                     rs.close();
50                 }
51                 if ( pstmt != null )
52                 {
53                     pstmt.close();
54                 }
55                 if ( conn != null )
56                 {
57                     conn.close();
58                 }
59             }
60             catch (SQLException e)
61             {
62                 // TODO Auto-generated catch block
63                 e.printStackTrace();
64             }
65             
66         }
67     }
68 }
69 结果:
70 getColumnName取得的名称:id   getColumnLabel取得的名称:tid
71 getColumnName取得的名称:name   getColumnLabel取得的名称:tname
72 getColumnName取得的名称:sex   getColumnLabel取得的名称:tsex

oracle:

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.PreparedStatement;
 4 import java.sql.ResultSet;
 5 import java.sql.ResultSetMetaData;
 6 import java.sql.SQLException;
 7 
 8 public class Test
 9 {
10     public static void main(String[] args)
11     {
12         String dirver = "oracle.jdbc.driver.OracleDriver";//数据库驱动
13         String dburl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";//数据库地址
14         String user = "testuser";//用户
15         String password = "testuser";//密码
16         Connection conn = null;//定义链接
17         PreparedStatement pstmt = null;//定义预编译命令
18         ResultSet rs = null;//定义结果集
19         try
20         {
21             Class.forName(dirver);//加载驱动
22             conn = DriverManager.getConnection(dburl, user, password);//获取连接
23             String sql = "select t.id as tid,t.name as tname,t.sex as tsex from t_user t";//定义sql语句
24             pstmt = conn.prepareStatement(sql);//执行sql
25             rs = pstmt.executeQuery();//取得结果集
26             if ( rs.next() )
27             {
28                 ResultSetMetaData metaData = rs.getMetaData();//取得ResultSetMetaData
29                 int count = metaData.getColumnCount();//返回此 ResultSet对象中的列数。
30                 //遍历取出每一个查询的字段的名称
31                 for (int i = 0; i < count; i++)
32                 {
33                     System.out.println("getColumnName取得的名称:" + metaData.getColumnName(i + 1).toLowerCase() + "   "
34                             + "getColumnLabel取得的名称:" + metaData.getColumnLabel(i + 1).toLowerCase());
35                 }
36             }
37         }
38         catch (Exception e)
39         {
40             e.printStackTrace();
41         }
42         finally
43         {
44             
45             try
46             {
47                 if ( rs != null )
48                 {
49                     rs.close();
50                 }
51                 if ( pstmt != null )
52                 {
53                     pstmt.close();
54                 }
55                 if ( conn != null )
56                 {
57                     conn.close();
58                 }
59             }
60             catch (SQLException e)
61             {
62                 // TODO Auto-generated catch block
63                 e.printStackTrace();
64             }
65             
66         }
67     }
68 }
69 结果:
70 getColumnName取得的名称:tid   getColumnLabel取得的名称:tid
71 getColumnName取得的名称:tname   getColumnLabel取得的名称:tname
72 getColumnName取得的名称:tsex   getColumnLabel取得的名称:tsex

总结:

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

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

原文地址:https://www.cnblogs.com/wy697495/p/9091193.html