package ar.com.javacuriosities.jdbc; import static ar.com.javacuriosities.jdbc.util.Constants.PASSWORD; import static ar.com.javacuriosities.jdbc.util.Constants.URL; import static ar.com.javacuriosities.jdbc.util.Constants.USER; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; /* * El ResultSet es la estructura de records que consumimos desde la DB, cada record tiene la misma * cantidad de columnas, aunque puede suceder que no todas las columnas tengan valor. * Este cuenta con algunos atributos importantes * * - Type * - Concurrency * - Holdability * * Dependiendo el motor de base de datos y el JDBC Driver puede ser que se soportan distintos valores * para estos atributos esto lo podemos verificar por medio de distintos métodos * * - Type: Podemos verificar los valores soportados por medio de "DatabaseMetaData.supportsResultSetType(int type)" * - Concurrency: Podemos verificar los valores soportados por medio de "DatabaseMetaData.supportsResultSetConcurrency(int concurrency)" * - Holdability: Podemos verificar los valores soportados por medio de "DatabaseMetaData.supportsResultSetHoldability(int holdability)" * * ResultSet Type: * * - ResultSet.TYPE_FORWARD_ONLY: Es el valor por defecto y solo nos permite movernos para adelante en el ResultSet * - ResultSet.TYPE_SCROLL_INSENSITIVE: Podemos navegar por el ResultSet pero si los datos son modificados por otro thread en la DB no los veremos desde nuestro ResultSet * - ResultSet.TYPE_SCROLL_SENSITIVE: Podemos navegar por el ResultSet y si los datos son modificados por otro thread en la DB también serán actualizados en nuestro ResultSet * * ResultSet Concurrency: * * - ResultSet.CONCUR_READ_ONLY: El ResultSet solo puede ser usado para lectura * - ResultSet.CONCUR_UPDATABLE: El ResultSet puede ser leído y actualizado (Para la actualización podemos usar los métodos "update" del ResultSet) * * ResultSet Holdability: * * - ResultSet.CLOSE_CURSORS_OVER_COMMIT: Esto indica que las conexiones son cerradas cuando ejecuto el commit * - ResultSet.HOLD_CURSORS_OVER_COMMIT:Esto indica que la conexion queda abierta luego de ejecutar el commit * */ public class Lesson03ResultSet { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) { String sql = "SELECT * FROM alumnos"; // Utilizamos un Statement para ejecutar nuestra consulta Statement statement = connection.createStatement(); try (ResultSet rs = statement.executeQuery(sql)) { // Podemos obtener metadata sobre el ResultSet ResultSetMetaData resultSetMetaData = rs.getMetaData(); System.out.println("Number of columns: " + resultSetMetaData.getColumnCount()); /* * Cada vez que se ejecuta el método next() sobre el ResultSet este verifica si tiene * datos y si no tiene, intenta recuperar mas datos desde la DB, los datos son van * recuperando en conjunto, el tamaño de este conjunto esta delimitado por el método * "setFetchSize()", usualmente este valor ya viene configurado en el valor óptimo, pero * en algunos casos puede ser útil cambiarlo */ while (rs.next()) { // Podemos acceder por nombre o por índice, empezando desde 1 String name = rs.getString("nombre"); double average = rs.getDouble("promedio"); System.out.println("Name: " + name); System.out.println("Average: " + average); } } } } catch (Exception e) { // Log and Handle exception e.printStackTrace(); } } }