利用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 ????????try20 ????????{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);//执行sql25 ????????????rs = pstmt.executeQuery();//取得结果集26 ????????????if ( rs.next() )27 ????????????{28 ????????????????ResultSetMetaData metaData = rs.getMetaData();//取得ResultSetMetaData29 ????????????????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 ????????finally43 ????????{44 ????????????45 ????????????try46 ????????????{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 block63 ????????????????e.printStackTrace();64 ????????????}65 ????????????66 ????????}67 ????}68 }69 结果:70 getColumnName取得的名称:id ??getColumnLabel取得的名称:tid71 getColumnName取得的名称:name ??getColumnLabel取得的名称:tname72 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 ????????try20 ????????{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);//执行sql25 ????????????rs = pstmt.executeQuery();//取得结果集26 ????????????if ( rs.next() )27 ????????????{28 ????????????????ResultSetMetaData metaData = rs.getMetaData();//取得ResultSetMetaData29 ????????????????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 ????????finally43 ????????{44 ????????????45 ????????????try46 ????????????{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 block63 ????????????????e.printStackTrace();64 ????????????}65 ????????????66 ????????}67 ????}68 }69 结果:70 getColumnName取得的名称:tid ??getColumnLabel取得的名称:tid71 getColumnName取得的名称:tname ??getColumnLabel取得的名称:tname72 getColumnName取得的名称:tsex ??getColumnLabel取得的名称:tsex
总结:
mysql在用两个方法获取sql语句名称时显然getColumnName不符合使用者的要求,取到的不是别名。但是oracle对于两种方法取到的值是一样的。因此一般情况下还是建议使用getColumnLabel方法
注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!
ResultSetMetaData中getColumnLabel和getColumnName的区别
原文地址:https://www.cnblogs.com/wy697495/p/9091193.html