【问题标题】:How can I determine that setMaxRows limited the number of rows returned (JDBC)如何确定 setMaxRows 限制了返回的行数(JDBC)
【发布时间】:2015-02-27 13:59:17
【问题描述】:

使用 JDBC 并且没有像 Hibernate 或 JSTL 库这样的特定框架。 (只是JDBC驱动mysql-connector-java-5.1.34-bin.jar

给定一个包含 20 到 25 行的表和一个我设置了 .setMaxRows(20) 的预准备语句,我如何确定返回的 20 行实际上可能超过 20 行? (我也尝试在 SQL 语句中使用 ... LIMIT 20

我知道 JSTL 在使用 <sql:query var="myRs" ... maxRows="20">... 时使 ${myRs.limitedByMaxRows} 可用,但我想了解如何从 pojo DAO 中检测到这一点。

感谢您的帮助。

【问题讨论】:

  • 我正在尝试理解您的问题。您是否正在尝试创建分页?另外,哪个库可以找到sql: JSTL 函数?
  • JSTL 代表 JavaServer Pages 标准标签库,请参阅 docs.oracle.com/javaee/5/tutorial/doc/bnakc.html - 我不是在这里寻找系统解决方案,我想要做的所有事情都在标题中进行了总结 - 不管“为什么”
  • 我知道 JSTL 是什么意思 @Mike。我不明白 JSTL sql 标签的来源。此外,您寻求的答案可能需要您了解 JDBC API 以及 RDBMS 供应商的 API 实现。并不是所有的都有 JDBC 兼容的驱动程序。
  • 嗨@Buhake,sql标签是JSTL(jstl-api-1.2.jar,jstl-impl-1.2.jar)的一部分,下面是如何在jsp页面中使用它的示例: <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <sql:query var="invRs" dataSource="jdbc/invDs"> select sku, name from INVENTORY </sql:query> <c:forEach var="widget" items="${invRs.rows}"> ${widget.sku}: ${widget.name} </c:forEach>
  • 谢谢@Mike。我不知道 JSTL 有 sql 标签。我学到了一些新东西。 :-D

标签: java mysql jdbc dao


【解决方案1】:

我查看了 MySQL 连接器的来源,结果发现 MysqlIO.readSingleRowSet 并没有表明返回的结果是否实际上是通过在准备好的语句上使用 setMaxRows 来限制的。

至于 JSTL sql 标签及其对maxRows 的实现,这有点误导。它实际上并未在其准备好的语句中使用.setMaxRows(),尤其是因为它需要确定是否已达到限制但存在更多行,以便能够将limitedByMaxRows 设置为true。所以在数据库上执行的查询实际上是不受限制的。

所以我在设置.setMaxRows() 时将在 POJO 中实现的解决方案如下:

if (pstmt.getMaxRows() > 0 && rowCount == pstmt.getMaxRows()) {
  try ( ResultSet countRs =
      conn.createStatement().executeQuery("select count(*) from INVENTORY") 
      ) {
    if (countRs.first()) {
      limitReached = rowCount < countRs.getInt(1);
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多