Recuperación de información (Consultas)
Partiendo de una conexión con la base de datos (Clase Connection), ya podemos realizar consultas contra ella
Antes de nada importa esta pequeña base de datos para que practiquéis: bd.sql bd_paraDbeaver.sql
Statement (Consultas sin parámetros)
La clase Statement se obtiene del método createStament() de Connection:
try (Statement stmt = con.createStatement()) {
// use stmt here
}
A partir de Statement tenemos la posibilidad de ejecutar consultas simples con el método executeQuery(), de esta forma:
String selectSql = "SELECT * FROM employees";
try (ResultSet resultSet = stmt.executeQuery(selectSql)) {
// use resultSet here
}
Como observáis se obtiene un objeto Resulset que veremos más adelante.
PreparedStament (Consultas parametrizadas)
Esta clase nos sirve para realizar consultas más complejas. Que reciban datos o parámetros desde “fuera”, es decir desde nuestro programa. Para obtener dicho objecto se necesita el método prepareStament() de Connection, y se pasa la consulta sql parametrizada:
String consulta = "select * from Persona where nombre = ? ";
PreparedStatement sentencia= conexion.prepareStatement(consulta);
La consulta sql parametrizada tiene “?” (1 o más), que representa los parámetros de entrada desde nuestro programa a la consulta. Teniendo listo el PreparedStament necesitamos asignar el o los parámetros antes de la ejecución, este objeto tiene los sets necesarios para asignar:
sentencia.setString(1,"Juan");
sentencia.executeQuery(); //Nos devolverá un Resultset
Como puedes advinina el primer parámetro debe ser un número que indica a que “?” (o parámetro) de la sentencia sql quiere asignar. Ojo –> siempre empieza en 1 El segundo parámetro de los sets es el propio valor o variable que quieres pasar a la consulta. Debes consultar todos los set que te ofrece el jdbc en correlación a los tipos de datos del sistema gestor de base de datos.
Extra: hay otra forma para poder agregar parámetros a tu consulta SQL:
Statement sentencia = conexion.createStatement();
String nombre="pepe";
String consulta = "select * from Persona where nombre='"+nombre+"'";
ResultSet rs=sentencia.executeQuery(consulta);
Pero resulta muy peligrosa por el problema de seguridad SQL Injection.
ResultSet
Esta interfaz nos permitirá obtener toda la información que devuelve nuestras instrucciones sql. Como si fuera un cursor o iterable. El método más importante es el next(), que recorre el resultado de la consulta linea a linea hasta que devuelve false: Base de datos a importar
// Pojo de empleado
public class Employee {
private int id;
private String name;
private String position;
private double salary;
// standard constructor, getters, setters
}
String selectSql = "SELECT emp_id,name, posicion, salary FROM employees";
try (ResultSet resultSet = stmt.executeQuery(selectSql)) {
List<Employee> employees = new ArrayList<>();
while (resultSet.next()) {
Employee emp = new Employee();
emp.setId(resultSet.getInt("emp_id"));
emp.setName(resultSet.getString("name"));
emp.setPosition(resultSet.getString("posicion"));
emp.setSalary(resultSet.getDouble(4));
employees.add(emp);
}
}
Y tiene los correspondientes gets para ir obteniendo campo a campo la información, siempre en consonacia con los parámetros del “Select” de la consulta slq a ejecutar. Los gets tienen dos formas:
- resultSet.getInt(int indice_Columna): recibe un número que corresponde al orden en la clausula Select.
- resultSet.getInt(String etiqueta_Columna): recibe el nombre de la columna en la clausula Select.
Base de datos de prueba: empresa.sql
Conversión JDBC a Java
Ejercicio 1
Partiendo del ejemplo anterior, nos piden una pequeña aplicación que nos permita conocer el salario y su posición a partir del id del empleado (se recoge por teclado). Resultado por pantalla.
Posteriormente el total del gasto en salario de la empresa.
Y por último cuantos empleados tienen más que un salario (se pide por teclado) y una posición (también se pide por teclado).