Como criar uma classe genérica para lidar com ResultSets em Java e Kotlin?

O ruim dos ResultSets do JDBC em Java, Kotlin, Groovy, etc é que você precisa fazer o parse manual de cada consulta. Para deixar isso genérico você pode:

Em Kotlin

Usando um Hikari Data Source

Função em Kotlin para obter um List>

@Throws(SQLException::class)fun queryToList(cp: HikariDataSource, query: String): List> {    val con = cp.connection    val st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)    val rs = st.executeQuery(query)    val md = rs.metaData    val columns = md.columnCount    rs.last()    val numberOfRows = rs.row    rs.first()    println(numberOfRows)    //val rows = arrayOfNulls>(size)    val rows = mutableListOf>()    while (rs.next()) {        val row = mutableMapOf()        for (i in 1..columns) {            row[md.getColumnName(i)] = rs.getObject(i)        }        rows.add(row)    }    rs.close()    st.close()    con.close()    return rows}

Função em Kotlin para obter um Map>

@Throws(SQLException::class)fun queryToMap(cp: HikariDataSource, query: String, idColumnName: String): Map> {    val con = cp.connection    val st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)    val rs = st.executeQuery(query)    val md = rs.metaData    val columns = md.columnCount    val rows = mutableMapOf>()    while (rs.next()) {        val row = mutableMapOf()        for (i in 1..columns) {            row[md.getColumnName(i)] = rs.getObject(i)        }        rows[row[idColumnName] as Int] = row    }    rs.close()    st.close()    con.close()    return rows}

Referências

Jeito eficiente de lidar com ResultSet em Java
https://stackoverflow.com/questions/7507121/efficient-way-to-handle-resultset-in-java

Usando Try With Resources no Kotlin
https://www.baeldung.com/kotlin-try-with-resources

You should also read: