利用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方法
注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!