package com.trifulcas.country; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; public class StatementPreparado { public static void main(String[] args) { // ¿Qué es un procedimiento preparado? // Es la manera habitual hoy en día de hacer statements // Hemos visto en los ejemplos que las sentencias sql // normalmente las combinamos con variables // p. ej. "insert into category(name) values ('"+categoria+"')" // Lo puedo concatenar como estoy haciendo hasta ahora // pero puedo utilizar en vez de eso PreparedStatements // que son statements a los que les puedo pasar variables // 1.- Claridad, yo separo el sql de los valores // 2.- Eficiencia. Cuando hago un procedimiento preparado, si se repite la BD ya tiene cacheado el esquema // 3.- Protección contra inyección sql. Yo no sé que tiene la variable, puede tener sentencias sql // ¿Cómo hacer un procedimiento preparado? Muy parecido a normal Scanner scanner = new Scanner(System.in); System.out.println("Introduzca el nombre del país"); String pais = scanner.nextLine(); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); // Yo creo un sql y allá donde tengo el parámetro (donde metía la variable) // Pongo un interrogante String sql="insert into country (country) values(?)"; // En vez de Statement uso PreparedStatement PreparedStatement psst=con.prepareStatement(sql); // Añado los valores de los parámetros // Posición, valor psst.setString(1, pais); // Ejecuto int res=psst.executeUpdate(); System.out.println("Se han insertado "+res+" registros"); psst.close(); con.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }
package com.trifulcas.country; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Scanner; public class AddActors { public static void main(String[] args) { Connection con = null; PreparedStatement st = null; Scanner scanner = new Scanner(System.in); System.out.println("Introduzca el número de actores"); int cantidad = scanner.nextInt(); try { Class.forName("com.mysql.cj.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); String sql = "insert into actor (first_name,last_name) values (?,?);"; st = con.prepareStatement(sql); for (int i = 1; i <= cantidad; i++) { System.out.println(sql); st.setString(1, "nombre"+i); st.setString(2, "apellido"+i); int res = st.executeUpdate(sql); System.out.println(res + " registros afectados"); } st.close(); con.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } finally { try { st.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } scanner.close(); } } }
package com.trifulcas.country; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; public class AddCategory { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Introduzca el nombre de la categoría"); String categoria = scanner.nextLine(); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); String sql = "insert into category (name) values(?)"; PreparedStatement st = con.prepareStatement(sql); st.setString(1, categoria); System.out.println(st); int res = st.executeUpdate(); System.out.println(res + " registros afectados"); st.close(); con.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }
package com.trifulcas.country; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; public class AddCountry { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Introduzca el nombre del país"); String pais = scanner.nextLine(); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); String sql="insert into country (country) values(?)"; PreparedStatement st=con.prepareStatement(sql); st.setString(1, pais); int res=st.executeUpdate(); System.out.println("Se han insertado "+res+" registros"); st.close(); con.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }
package com.trifulcas.country; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; public class DeleteCountry { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Introduzca el id del país a eliminar"); String pais = scanner.nextLine(); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); String sql="delete from country where country_id=?"; PreparedStatement st=con.prepareStatement(sql); st.setString(1, pais); int res=st.executeUpdate(); System.out.println("Se han eliminado "+res+" registros"); st.close(); con.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }
package com.trifulcas.country; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Scanner; public class GetCountries { public static void main(String[] args) { // Buscar todos los países que tengan un texto determinado Scanner scanner = new Scanner(System.in); // Pido el texto System.out.println("Introduzca el texto a buscar"); String texto = scanner.nextLine(); try { // Hago lo estándar Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); // ¿Qué sql necesito? String sql = "select * from country where country like ?"; System.out.println(sql); PreparedStatement st = con.prepareStatement(sql); st.setString(1, '%'+texto+'%'); // Aquí no modificamos sino que seleccionamos, por lo tanto usamos // executeQuery para ejecutar y un ResultSet para almacenar los resultados ResultSet rs = st.executeQuery(); // Si yo hago un bucle recorro todos los registros while (rs.next()) { System.out.println(rs.getString("country")); System.out.println(rs.getDate("last_update")); } // Al tener el tipo TYPE_SCROLL_INSENSITIVE puedo ir a registros determinados st.close(); con.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } scanner.close(); } }