关于PreparedStatement.setObject()的问题

本文探讨了对JdbcTemplate进行封装时遇到的问题,特别是在使用pstmt.setObject方法进行参数设置时出现的数据获取异常现象。作者尝试解决为何在条件查询时无法正常获取数据的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近模仿spring的JdbcTemplate的类了一个简单对JDBC的封装类,但是在设置pstmt.setObject(i + 1, args[i])有点问题,当SQL语句不是条件查询的时候会有数据,但是是条件查询,传入参数的时候,获得不了数据的数据,应该调试发现是pstmt.setObject(i + 1, args[i])这句话的问题,但是搞不清楚是什么原因.

if (isPage >= 2) { try (Connection connection = DynamicDataSourceManager.getConnection(url, user, password); PreparedStatement preparedStatementCount = connection.prepareStatement(String.valueOf(countSql))) { for (int i = 0; i < sqlParamList.size(); i++) { DataSetSqlParam dataSetSqlParam = sqlParamList.get(i); Object value = dataSetSqlParam.getValue(); if (value == null || value.toString().equals("")) { preparedStatementCount.setNull(i + 1, dataSetSqlParam.getSqlType()); } else { preparedStatementCount.setObject(i + 1, dataSetSqlParam.getValue(), dataSetSqlParam.getSqlType()); } } try (ResultSet resultSet = preparedStatementCount.executeQuery()) { if (resultSet.next()) { int countValue = resultSet.getInt("count"); totalCnt = countValue; totalPage = (int) Math.ceil((double) totalCnt / (double) pageSize); } else { log.info("获取数据异常"); } } } catch (SQLException e) { } try (Connection connection = DynamicDataSourceManager.getConnection(url, user, password); PreparedStatement preparedStatement = connection.prepareStatement(resSql.toString())) { for (int i = 0; i < sqlParamList.size(); i++) { DataSetSqlParam dataSetSqlParam = sqlParamList.get(i); Object value = dataSetSqlParam.getValue(); if (value == null || value.toString().equals("")) { preparedStatement.setNull(i + 1, dataSetSqlParam.getSqlType()); } else { preparedStatement.setObject(i + 1, dataSetSqlParam.getValue(), dataSetSqlParam.getSqlType()); } } try (ResultSet resultSet = preparedStatement.executeQuery()) { ResultSetMetaData metaData = resultSet.getMetaData(); Integer columnCount = resultSet.getMetaData().getColumnCount(); //字段列表 for (int h = 0; h < columnCount; h++) { String columnLabel = metaData.getColumnLabel(h + 1); columnLabelList.add(columnLabel); } try { while (resultSet.next()) { Map<String, Object> rowData = new HashMap<>(columnLabelList.size()); for (String columnLabelName : columnLabelList) { Object columnValue = resultSet.getObject(columnLabelName); rowData.put(columnLabelName, columnValue); } dataList.add(rowData); } } finally { if (resultSet != null) { resultSet.close(); } } } } catch (SQLException e) { } } else { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = DynamicDataSourceManager.getConnection(url, user, password); preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < sqlParamList.size(); i++) { DataSetSqlParam dataSetSqlParam = sqlParamList.get(i); Object value = dataSetSqlParam.getValue(); if (value == null || value.toString().equals("")) { preparedStatement.setNull(i + 1, dataSetSqlParam.getSqlType()); } else { preparedStatement.setObject(i + 1, dataSetSqlParam.getValue(), dataSetSqlParam.getSqlType()); } } try (ResultSet resultSet = preparedStatement.executeQuery()) { ResultSetMetaData metaData = resultSet.getMetaData(); Integer columnCount = resultSet.getMetaData().getColumnCount(); //字段列表 for (int h = 0; h < columnCount; h++) { String columnLabel = metaData.getColumnLabel(h + 1); columnLabelList.add(columnLabel); } try { while (resultSet.next()) { Map<String, Object> rowData = new HashMap<>(columnLabelList.size()); for (String columnLabelName : columnLabelList) { Object columnValue = resultSet.getObject(columnLabelName); rowData.put(columnLabelName, columnValue); } dataList.add(rowData); } } finally { if (resultSet != null) { resultSet.close(); } } } } catch (SQLException e) { } finally { preparedStatement.close(); connection.close(); } totalCnt = dataList.size(); if (dataList.size() > 0) { totalPage = 1; } } 这段代码优化一下 并且能否有数据库连接池替换下不然频繁创建销毁是不是有oom的风险
07-11
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值