前段时间做数据源开发时用到了JDBC,碰到了一个问题,记录一下。
创建了一个JDBC工具类用来创建连接,并传入SQL查询,向调用者返回ResultSet对象,随后在工具类中关闭连接。
但是调用之后发现ResultSet始终拿不到数据,最后发现 ResultSet随着工具类中在finally中关闭连接而清空。
百度后发现可以将ResultSet指向CacheRowSetImpl类然后返回的方法,但是部署服务器编译的时候提示 “com.sun.rowset.CachedRowSetImpl 是 Sun 的专用 API,在后续的JDK9版本后(包括JDK9)已经删除”。
原因是CacheRowSetImpl是过时的类,即将在JDK 9的版本中移除,所以不建议使用。
最后,如下所示,既可以给上层返回ResultSet,在上层解析完结果集后还可以关闭连接:
package com.JyoKou.utils;
import java.sql.*; /** * 创建JDBC连接工具类 * * @author JyoKou * @since 2022年7月7日 */ public class JDBCUtils { private final Connection conn; private final PreparedStatement ps; public JDBCUtils(String driver, String url, String userName, String password, String sql) { try { Class.forName(driver); this.conn = DriverManager.getConnection(url, userName, password); this.ps = conn.prepareStatement(sql); } catch (Exception e) { e.printStackTrace(); throw new BadRequestException(MsgConstants.MSG); } } /** * 创建JDBC连接并执行查询语句 * * @return ResultSet结果集 * @author JyoKou * @since 2022年7月7日 */ public ResultSet getQuery() { ResultSet rs; try { rs = this.ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); throw new BadRequestException(MsgConstants.MSG); } return rs; } /** * 关闭连接 * * @author JyoKou * @since 2022年7月15日 */ public void close() { try { if (this.ps != null) { this.ps.close(); } if (this.conn != null) { this.conn.close(); } } catch (Exception e) { e.printStackTrace(); throw new BadRequestException(MsgConstants.MSG); } } }
调用的时候可以这样写:
public Object getDataFromDs(String connectDrivers, BaSysHomepageDatasourceEntity baSysHomepageDatasourceEntity) {
//JDBC执行查询
JDBCUtils jdbcUtils = new JDBCUtils(connectDrivers , baSysHomepageDatasourceEntity.getDataUrl() , baSysHomepageDatasourceEntity.getDataUserName() , baSysHomepageDatasourceEntity.getDataUserPwd() , homepageCardQueryData.getQuerySql()); ResultSet resultSet = jdbcUtils.getQuery(); try { if (resultSet.next()) { return resultSet.getInt("F_NUM"); } else { throw new BadRequestException(MsgConstants.MSG); } } catch (SQLException e) { e.printStackTrace(); throw new BadRequestException(MsgConstants.MSG); } finally { jdbcUtils.close(); } }
总结:JDBC工具类使用构造函数对成员变量conn进行构造,然后调用查询方法拿到结果集进行解析,解析完毕后再使用JDBCUtils.close()关闭成员变量conn连接。
声明:本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。