经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架 - Stars-one
来源:cnblogs  作者:Stars-one  时间:2019/5/13 8:53:42  对本文有异议

介绍

可用于获取关于 ResultSet 对象中列的类型和属性信息的对象,在持久框层框架(如:mybatis, hibernate)中被广泛的应用。

常用方法

  • int getColumnCount()
    返回此 ResultSet 对象中的列数
  • String getColumnLabel(int column)
    获取用于打印输出和显示的指定列的建议标题。建议标题通常由 SQL AS 子句来指定。
  • String getColumnName(int column)
    获取指定列的名称

    1. Statement stmt = conn.createStatement();
    2. ResultSet rs = stmt.executeQuery("select ename,job,hiredate from employee");
    3. ResultSetMetaData resultSetMetaData = rs.getMetaData();
    4. int colCount = resultSetMetaData.getColumnCount();
    5. System.out.println("共有多少列:" + colCount);
    6. for (int i = 1; i <= colCount; i++) {
    7. //得到列名
    8. String colLabel = resultSetMetaData.getColumnLabel(i);
    9. //通过列名得到该列的值
    10. Object value = rs.getObject(colLabel);
    11. System.out.println("第" + i + "列的值:" + value);
    12. }

一个简单的框架例子代码

以下是一个类,主要是讲数据库返回的ResultSet转为对应的实体类,要注意,实体类的属性名要与数据库中的列名保持一致
可以直接拿来用

  1. import java.lang.reflect.Field;
  2. import java.sql.ResultSet;
  3. import java.sql.ResultSetMetaData;
  4. import java.sql.SQLException;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. /**
  10. * 将查询结果集的数据组装成相应的POJO(简单的Java对象)实体
  11. *
  12. * @author StarsOne
  13. * @date Create in 2019-4-27 0027 09:43:40
  14. * @description
  15. */
  16. public class ResultSetHandler<T> {
  17. private List<T> beanList;
  18. private Class<T> type;
  19. private ResultSetMetaData metaData;
  20. private ResultSet resultSet;
  21. public ResultSetHandler(ResultSet resultSet, Class<T> type) {
  22. //初始化beanList
  23. beanList = new ArrayList<>();
  24. this.resultSet = resultSet;
  25. try {
  26. //获得数据集元数据
  27. this.metaData = resultSet.getMetaData();
  28. } catch (SQLException e) {
  29. e.printStackTrace();
  30. }
  31. this.type = type;
  32. handlerData();
  33. }
  34. private void handlerData() {
  35. /*
  36. 思路分析:
  37. 1. 首先获得实体类中的所有属性:Class.getDeclareFields(),存放在Map<属性名,Field> 中
  38. 2. 通过ResultSetMetaData结果集元数据中的列名,将查询结果相应的列的值取出来resultset.getObject()
  39. 3. 将实体类的属性的名与结果集中相应的列进行反射赋值*/
  40. Field[] declaredFields = type.getDeclaredFields();
  41. Map<String, Field> fieldMap = new HashMap<>();
  42. for (Field declaredField : declaredFields) {
  43. //Map<"NUM",NUm属性对象>
  44. fieldMap.put(declaredField.getName().toUpperCase(), declaredField);
  45. }
  46. try {
  47. // while循环,遍历结果集ResultSet中的全部数据
  48. while (resultSet.next()) {
  49. //将一条数据对应的实体类对象添加到list中
  50. beanList.add(getT(fieldMap));
  51. }
  52. } catch (SQLException | IllegalAccessException | InstantiationException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. /**
  57. * 获得每一条数据所对应的一个实体类对象
  58. * @param fieldMap 存放属性field的Map集合
  59. * @return 一个实体类对象
  60. * @throws InstantiationException
  61. * @throws IllegalAccessException
  62. * @throws SQLException
  63. */
  64. private T getT(Map<String, Field> fieldMap) throws InstantiationException, IllegalAccessException, SQLException {
  65. // 获得查询结果中的列数
  66. int columnCount = metaData.getColumnCount();
  67. T target = type.newInstance();
  68. // 一次循环代表一列
  69. for (int i = 1; i <= columnCount; i++) {
  70. // 获得列的标题(列名)
  71. String columnLabel = metaData.getColumnLabel(i);
  72. // 检查此列是否有对应的属性存在
  73. if (fieldMap.containsKey(columnLabel)) {
  74. // 通过列名从Map中获得对应的Field对象
  75. Field field = fieldMap.get(columnLabel);
  76. field.setAccessible(true);
  77. //根据此属性的类型来调用相应的结果集方法,
  78. // 如:String ename --> resultSet.getString()
  79. Object value = null;
  80. Class<?> fieldType = field.getType();
  81. if (fieldType == String.class) { //Character
  82. value = resultSet.getString(columnLabel);
  83. } else if (fieldType == Byte.class || fieldType == Byte.TYPE) { // int
  84. value = resultSet.getByte(columnLabel);
  85. } else if (fieldType == Short.class || fieldType == Short.TYPE) { //
  86. value = resultSet.getShort(columnLabel);
  87. } else if (fieldType == Integer.class || fieldType == Integer.TYPE) { //
  88. value = resultSet.getInt(columnLabel);
  89. } else if (fieldType == Long.class || fieldType == Long.TYPE) { //
  90. value = resultSet.getLong(columnLabel);
  91. } else if (fieldType == Double.class || fieldType == Double.TYPE) { //
  92. value = resultSet.getDouble(columnLabel);
  93. } else if (fieldType == Float.class || fieldType == Float.TYPE) { //
  94. value = resultSet.getFloat(columnLabel);
  95. } else if (fieldType == java.util.Date.class || fieldType == java.sql.Date.class) { //
  96. value = resultSet.getDate(columnLabel);
  97. } else if (fieldType == java.sql.Time.class) { //
  98. value = resultSet.getTime(columnLabel);
  99. } else if (fieldType == Boolean.class || fieldType == Boolean.TYPE) { //
  100. value = resultSet.getBoolean(columnLabel);
  101. }
  102. field.set(target, value);
  103. } // end if
  104. } // end for
  105. return target;
  106. }
  107. /**
  108. * 获得list
  109. *
  110. * @return
  111. */
  112. public List<T> getBeanList() {
  113. return beanList;
  114. }
  115. public T getBean(){
  116. beanList!=null && beanList.size()>0?beanList.remove(0):null;
  117. }
  118. }

原文链接:http://www.cnblogs.com/kexing/p/10843874.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号