Example code for Get the Number of Rows in a ResultSet
This commit is contained in:
parent
2695ba0fde
commit
3c9ba66969
|
@ -0,0 +1,43 @@
|
||||||
|
package com.baeldung.resultsetrowcount;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
|
||||||
|
class RowCounterApp {
|
||||||
|
|
||||||
|
static Logger logger = LoggerFactory.getLogger(RowCounterApp.class);
|
||||||
|
|
||||||
|
public static void main(String[] args) throws SQLException {
|
||||||
|
Connection conn = createDummyDB();
|
||||||
|
|
||||||
|
String selectQuery = "SELECT * FROM STORAGE";
|
||||||
|
|
||||||
|
StandardRowCounter standardCounter = new StandardRowCounter(conn);
|
||||||
|
logger.info("Standard counter count: {}", standardCounter.getQueryRowCount(selectQuery));
|
||||||
|
|
||||||
|
ScrollableRowCounter scrollableCounter = new ScrollableRowCounter(conn);
|
||||||
|
logger.info("Scrollable counter count: {}", scrollableCounter.getQueryRowCount(selectQuery));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Connection createDummyDB() throws SQLException {
|
||||||
|
String dbUrl = "jdbc:h2:mem:testdb";
|
||||||
|
Connection conn = DriverManager.getConnection(dbUrl);
|
||||||
|
try (Statement statement = conn.createStatement()) {
|
||||||
|
String sql = "CREATE TABLE STORAGE (id INTEGER not null, val VARCHAR(50), PRIMARY KEY (id))";
|
||||||
|
statement.executeUpdate(sql);
|
||||||
|
sql = "INSERT INTO STORAGE VALUES (1, 'Entry A')";
|
||||||
|
statement.executeUpdate(sql);
|
||||||
|
sql = "INSERT INTO STORAGE VALUES (2, 'Entry A')";
|
||||||
|
statement.executeUpdate(sql);
|
||||||
|
sql = "INSERT INTO STORAGE VALUES (3, 'Entry A')";
|
||||||
|
statement.executeUpdate(sql);
|
||||||
|
}
|
||||||
|
return conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.baeldung.resultsetrowcount;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A ResultSet counter that uses a scrollable cursor.
|
||||||
|
* Scrollable cursors must be supported by the underlying JDBC driver
|
||||||
|
* and will not always be available for use.
|
||||||
|
*/
|
||||||
|
class ScrollableRowCounter {
|
||||||
|
|
||||||
|
Connection conn;
|
||||||
|
|
||||||
|
ScrollableRowCounter(Connection conn) {
|
||||||
|
this.conn = conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getQueryRowCount(String query) throws SQLException {
|
||||||
|
try (Statement statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet scrollableRS = statement.executeQuery(query)) {
|
||||||
|
scrollableRS.last(); // check if we need a scrollable type for this (probably)
|
||||||
|
return scrollableRS.getRow();
|
||||||
|
// if we want to process the result set data we can move the cursor back to
|
||||||
|
// the beginning using the scrollableRS.beforeFirst() method
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.baeldung.resultsetrowcount;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A ResultSet counter that iterates through the query
|
||||||
|
* results and increments a counter variable until it
|
||||||
|
* reaches the last result.
|
||||||
|
*
|
||||||
|
* This solution will work on all cases but is ineffective,
|
||||||
|
* especially if the ResultSet will be discarded afterwards.
|
||||||
|
*/
|
||||||
|
class StandardRowCounter {
|
||||||
|
Connection conn;
|
||||||
|
|
||||||
|
StandardRowCounter(Connection conn) {
|
||||||
|
this.conn = conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getQueryRowCount(String query) throws SQLException {
|
||||||
|
try (Statement statement = conn.createStatement(); ResultSet standardRS = statement.executeQuery(query)) {
|
||||||
|
int size = 0;
|
||||||
|
while (standardRS.next()) {
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.baeldung.resultsetrowcount;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
class ScrollableRowCounterUnitTest {
|
||||||
|
|
||||||
|
Connection conn;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() throws SQLException {
|
||||||
|
conn = RowCounterApp.createDummyDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void tearDown() throws SQLException {
|
||||||
|
conn.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDummyDBWithThreeRows_whenAskingForScrollableRowCountForSelectStar_thenCountIsThree() throws SQLException {
|
||||||
|
ScrollableRowCounter counter = new ScrollableRowCounter(conn);
|
||||||
|
|
||||||
|
int queryRowCount = counter.getQueryRowCount("SELECT * FROM STORAGE");
|
||||||
|
|
||||||
|
Assertions.assertEquals(3, queryRowCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDummyDBWithThreeRows_whenAskingForScrollableRowCountForSelect1and2_thenCountIsTwo() throws SQLException {
|
||||||
|
ScrollableRowCounter counter = new ScrollableRowCounter(conn);
|
||||||
|
|
||||||
|
int queryRowCount = counter.getQueryRowCount("SELECT * FROM STORAGE WHERE ID IN (1,2)");
|
||||||
|
|
||||||
|
Assertions.assertEquals(2, queryRowCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.baeldung.resultsetrowcount;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
class StandardRowCounterUnitTest {
|
||||||
|
|
||||||
|
Connection conn;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() throws SQLException {
|
||||||
|
conn = RowCounterApp.createDummyDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void tearDown() throws SQLException {
|
||||||
|
conn.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDummyDBWithThreeRows_whenAskingForStandardRowCountForSelectStar_thenCountIsThree() throws SQLException {
|
||||||
|
StandardRowCounter counter = new StandardRowCounter(conn);
|
||||||
|
|
||||||
|
int queryRowCount = counter.getQueryRowCount("SELECT * FROM STORAGE");
|
||||||
|
|
||||||
|
Assertions.assertEquals(3, queryRowCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDummyDBWithThreeRows_whenAskingForStandardRowCountForSelect1and2_thenCountIsTwo() throws SQLException {
|
||||||
|
StandardRowCounter counter = new StandardRowCounter(conn);
|
||||||
|
|
||||||
|
int queryRowCount = counter.getQueryRowCount("SELECT * FROM STORAGE WHERE ID IN (1,2)");
|
||||||
|
|
||||||
|
Assertions.assertEquals(2, queryRowCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue