Java创建一个JDBC工具类并解决返回ResultSet的问题

打印 上一主题 下一主题

主题 861|帖子 861|积分 2583

前段时间做数据源开发时用到了JDBC,碰到了一个问题,记录一下。
创建了一个JDBC工具类用来创建连接,并传入SQL查询,向调用者返回ResultSet对象,随后在工具类中关闭连接。
但是调用之后发现ResultSet始终拿不到数据,最后发现 ResultSet随着工具类中在finally中关闭连接而清空。
百度后发现可以将ResultSet指向CacheRowSetImpl类然后返回的方法,但是部署服务器编译的时候提示 “com.sun.rowset.CachedRowSetImpl 是 Sun 的专用 API,在后续的JDK9版本后(包括JDK9)已经删除”。
原因是CacheRowSetImpl是过时的类,即将在JDK 9的版本中移除,所以不建议使用。
最后,如下所示,既可以给上层返回ResultSet,在上层解析完结果集后还可以关闭连接:
  1. package com.JyoKou.utils;
  2. import java.sql.*;
  3. /**
  4. * 创建JDBC连接工具类
  5. *
  6. * @author JyoKou
  7. * @since 2022年7月7日
  8. */
  9. public class JDBCUtils {
  10.     private final Connection conn;
  11.     private final PreparedStatement ps;
  12.     public JDBCUtils(String driver, String url, String userName, String password, String sql) {
  13.         try {
  14.             Class.forName(driver);
  15.             this.conn = DriverManager.getConnection(url, userName, password);
  16.             this.ps = conn.prepareStatement(sql);
  17.         } catch (Exception e) {
  18.             e.printStackTrace();
  19.             throw new BadRequestException(MsgConstants.MSG);
  20.         }
  21.     }
  22.     /**
  23.      * 创建JDBC连接并执行查询语句
  24.      *
  25.      * @return ResultSet结果集
  26.      * @author JyoKou
  27.      * @since 2022年7月7日
  28.      */
  29.     public ResultSet getQuery() {
  30.         ResultSet rs;
  31.         try {
  32.             rs = this.ps.executeQuery();
  33.         } catch (SQLException e) {
  34.             e.printStackTrace();
  35.             throw new BadRequestException(MsgConstants.MSG);
  36.         }
  37.         return rs;
  38.     }
  39.     /**
  40.      * 关闭连接
  41.      *
  42.      * @author JyoKou
  43.      * @since 2022年7月15日
  44.      */
  45.     public void close() {
  46.         try {
  47.             if (this.ps != null) {
  48.                 this.ps.close();
  49.             }
  50.             if (this.conn != null) {
  51.                 this.conn.close();
  52.             }
  53.         } catch (Exception e) {
  54.             e.printStackTrace();
  55.             throw new BadRequestException(MsgConstants.MSG);
  56.         }
  57.     }
  58. }
复制代码
调用的时候可以这样写:
  1. public Object getDataFromDs(String connectDrivers, BaSysHomepageDatasourceEntity baSysHomepageDatasourceEntity) {
  2.         //JDBC执行查询
  3.         JDBCUtils jdbcUtils = new JDBCUtils(connectDrivers
  4.             , baSysHomepageDatasourceEntity.getDataUrl()
  5.             , baSysHomepageDatasourceEntity.getDataUserName()
  6.             , baSysHomepageDatasourceEntity.getDataUserPwd()
  7.             , homepageCardQueryData.getQuerySql());
  8.         ResultSet resultSet = jdbcUtils.getQuery();
  9.         try {
  10.             if (resultSet.next()) {
  11.                 return resultSet.getInt("F_NUM");
  12.             } else {
  13.                 throw new BadRequestException(MsgConstants.MSG);
  14.             }
  15.         } catch (SQLException e) {
  16.             e.printStackTrace();
  17.             throw new BadRequestException(MsgConstants.MSG);
  18.         } finally {
  19.             jdbcUtils.close();
  20.         }
  21.     }
复制代码
总结:JDBC工具类使用构造函数对成员变量conn进行构造,然后调用查询方法拿到结果集进行解析,解析完毕后再使用JDBCUtils.close()关闭成员变量conn连接。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表