Carregando...
Sem categoria

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<Map<String, Any?>>

@Throws(SQLException::class)
fun queryToList(cp: HikariDataSource, query: String): List<Map<String, Any?>> {
    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<Map<String, Any?>>(size)
    val rows = mutableListOf<Map<String, Any?>>()
    while (rs.next()) {
        val row = mutableMapOf<String, Any?>()
        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<Int, Map<String, Any?>>

@Throws(SQLException::class)
fun queryToMap(cp: HikariDataSource, query: String, idColumnName: String): Map<Int, Map<String, Any?>> {
    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<Int, Map<String, Any?>>()
    while (rs.next()) {
        val row = mutableMapOf<String, Any?>()
        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

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *