前段时间做数据源开发时用到了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连接。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |