- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 Java 应用程序,该应用程序对数据库进行大量 JDBC 查询,每个查询都在一个单独的方法中指定,格式大致如下。
public static void sampleJDBCQuery(String query, DBUtil dbUtil, DataStructure dataStructure) {
ResultSet rs = null;
Handle handle = null;
Connection conn = null;
Statement stmt = null;
LOGGER.debug("Executing query = {}", query);
try {
handle = dbUtil.getConnectionHandle();
conn = handle.getConnection();
if (conn != null) {
stmt = conn.createStatement();
if (stmt != null) {
rs = stmt.executeQuery(query);
if (rs != null) {
while (rs.next()) {
// populate dataStructure using rs
}
}
}
}
} catch (Exception e) {
Metrics.markMeter("vertica.read.error");
LOGGER.error(e.getMessage(), e);
} finally {
DBUtil.closeResultSet(rs);
DBUtil.closeStatement(stmt);
DBUtil.close(handle);
LOGGER.debug("Finished query = {}", query);
}
}
通过上述格式的许多不同示例查询(和数据结构类),我的代码库已经大幅增长。我的目标是拥有一个帮助器方法,为我抽象掉大部分 JDBC 逻辑。我的第一个想法是拥有一个具有以下签名的方法。
public static ResultSet executeJDBCQuery(String query, DBUtil dbUtil)
然后我可以循环 ResultSet
的行并填充相关的DataStructure
对于每一行。问题是我仍然必须关闭返回的 ResultSet
并关闭ResultSet
用不同的方法似乎是糟糕的设计。
我想我正在寻找的东西可能类似于Python的函数装饰器概念,这样我就可以“装饰”一个JDBC查询来处理sampleJDBCQuery
中存在的大部分样板文件。多于。我怎样才能实现这个目标?
最佳答案
您可以传入一个策略来告诉该方法如何将行映射到对象上的字段。
这就是 spring-jdbc 所做的,它定义了 RowMapper如:
public interface RowMapper<T> {
T mapRow(ResultSet resultSet, int rowNum) throws SQLException;
}
这是您可以更改方法的方法,包括合并 rowMapper:
public static <T> List<T> queryList(String query, Connection conn, RowMapper<T> rowMapper) throws SQLException {
LOGGER.debug("Executing query = {}", query);
try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
List<> list = new ArrayList<>();
while (rs.next()) {
list.add(rowMapper.mapRow(rs, list.size() + 1));
}
return list;
} finally {
DBUtil.closeResultSet(rs);
DBUtil.closeStatement(stmt);
LOGGER.debug("Finished query = {}", query);
}
}
在这里捕获所有异常并不好,因为如果出现问题,您希望能够使用异常来退出当前操作。否则,日志中将有多个错误堆栈跟踪,其中一个是错误发生的地方,另一个是下游,当代码期望出现不是由于上一个错误而导致的结果时,代码会失败。当第一个错误发生时,快速失败。
下一步将参数化您的查询,这样您就不必将参数值括在引号中或担心 SQL 注入(inject)。请参阅this answer有关 spring-jdbc 如何处理此问题的示例。
我将连接内容移出方法;传入连接允许您在同一个 JDBC 本地事务中执行多个 sql 语句。 (连接仍然需要关闭,这只是错误的地方。)
在这里传递这个句柄也违反了 the Law of Demeter :
In particular, an object should avoid invoking methods of a member object returned by another method. For many modern object oriented languages that use a dot as field identifier, the law can be stated simply as "use only one dot". That is, the code a.b.Method() breaks the law where a.Method() does not. As an analogy, when one wants a dog to walk, one does not command the dog's legs to walk directly; instead one commands the dog which then commands its own legs.
即使您只执行只读操作,让查询共享事务也可以提高一致性并提高性能。在 Spring 中使用事务不会那么痛苦,您可以使用注释以声明方式实现事务,以显示您想要的边界位置。
这里的总体答案是:最好采用一个预先存在的工具(spring-jdbc或类似的东西),它们已经解决了你还没有时间考虑的问题,而不是一点点地重新改造它,这显然是你正在走的路。
关于java - 当我需要在关闭 ResultSet 之前填充 ResultSet 时,如何抽象出 JDBC 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54136465/
在我的应用程序中,我必须获取记录并将它们放入二维数组中。我必须首先触发两个查询以找出计数,以便我可以初始化数组,其次是获取数据。它会导致性能下降。我需要提高性能的解决方案。 谢谢。 最佳答案 I ha
在 Zend Framework 应用程序中,它的构建与 ZF2 Getting Started tutorial 中的相册应用程序非常相似,我使用 ResultSet 对象将数据从模型通过 Cont
我是 java 和 SQL 新手,我重复了一个我不知道如何避免的问题: 假设我想创建两个executeQuery,一个在另一个内部,在getRequestsFromDB方法中我创建第一个execute
这个问题已经有答案了: Why should I call close() on a ResultSet and Connection instance? (4 个回答) 已关闭 7 年前。 使用完结
public List searchCourse(String name) { List list = null; Course course = null;
我正在使用两个不同的查询从两个表中选择数据。我正在使用一个连接和一个结果集。两个表都已填充,但第二个查询的 resultset.next() 返回 false,尽管它必须为 true。 我还尝试使用两
试图了解这里发生了什么。 DatabaseMetaData 返回一个空结果集,而实际上相同的 SQL 查询则不会。这不是主要问题,因为我使用第二个代码示例作为解决方法。 DatabaseMetaDat
假设我有多个结果集(每个结果集将引用数据库中的 1 行)(它们属于同一个表。)。现在我想创建合并的结果集,它将实习生拥有所有其他结果集。所以我的主要目标是创建一个组合的 ResultSet,它将指向以
我正在尝试将 influxdb 与我的应用程序集成并处理输出。我正在导入 InfluxDBClient 包以连接到在我的本地计算机上运行的 influx 实例。使用以“influxdb.results
我正在尝试创建一个框架来显示数据库中的所有电影名称,然后他们选择框架中的一行来执行另一个查询。 我有一个 ResultSet (rs),它接收查询执行的结果以选择电影名称。之后,我使用 SQLTabl
我有一个 Servlet,它使用返回 ResultSet 的静态实用程序方法。 在我的 Servlet 代码中,我有 ResultSet rs = SimpleSearch.searchByName(
在从 Postgres 或 Oracle 检索时间戳时(我们称之为 startDate),使用 resultSet.getString("startDate") 调用或 resultSet.getTi
全部, 对于名为Analyze 的类及其构造函数Analyze,该构造函数将Java JDBC Resultset 对象作为参数。 private Resultset analysisSet publ
m 尝试遍历 3 个结果集并比较它们的值。 bt 它抛出这个异常......有人可以帮助我了解我正在经历的地方吗?这是一段代码: java.lang.Object[] reconciledPaymen
我已经尝试使用谷歌搜索并在 SO 上查看了这些线程: java jdbc accessing multiple resultsets Open two resultsets simultaneousl
我在 SQLite 的 JDBC 驱动程序中遇到问题。 我正在使用 SELECT 语句执行查询。 如果我得到一个空的 ResultSet(0 行),那么我会在调用 getString(1) 时看到抛出
我正在尝试根据特定条件搜索表格。在 SQL Developer 中执行时,SQL 查询返回正确的结果(1 行)。在 JDBC 中,resultset 不为 null,但 resultset.next(
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在尝试在 Java 应用程序中处理大量数据。数据存储在 MySQL 数据库中,我使用的是 jdbc 连接器 8.0.11。 我的问题是我需要多次访问每条记录并且再次执行查询需要太多时间。使用 Re
这个问题已经有答案了: Getting java.sql.SQLException: Operation not allowed after ResultSet closed (2 个回答) 已关闭
我是一名优秀的程序员,十分优秀!