http://chuwiki.chuidiang.org/index.php?title=Ejemplo_con_preparedStatement
https://www.arquitecturajava.com/jdbc-prepared-statement-y-su-manejo/
http://puntocomnoesunlenguaje.blogspot.com/2017/11/java-jdbc-prepared-statements.html
Un ejemplo:
package com.trifulcas.datos; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class AccesoSakila { public static void main(String[] args) { try { // Lo primero de todo crear una conexión CTRL+MAY+O -> importación automática de // los paquetes que falten // Esta línea nos 'registra' el conector mysql dentro de Java Class.forName("com.mysql.cj.jdbc.Driver"); // Aquí nos creamos la conexión con una cadena de conexión // Lo primero es el tipo de conector: jdbc:mysql // Después la url del servidor SGBD //localhost:3306/ // Después opcionalmente pero está bien ponerlo la base de datos /sakila // Por último usuario y contraseña root '' Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", ""); System.out.println("Conexión correcta"); // Statement es una sentencia SQL // PreparedStatement es una sentencia SQL lo único que 'preparada' String sql = "Select * from actor where last_name like '%b%'"; System.out.println(sql); String cad = "b"; sql = "select * from actor where last_name like '%" + cad + "%'"; System.out.println(sql); // Cuando en mi sentencia tengo parámetros dinámicos que me pueden venir // de un teclado, o de un fichero o de un bucle o de donde sea // Yo puedo crear una sentencia preparada // Una sentencia sql en la que dejamos unos huecos para insertar un valor // En este insert yo estoy diciendo que voy a insertar un actor, pero no // especifico los valores // Estoy dejando dos huecos: los interrogantes sql = "insert into actor(first_name,last_name) values (?,?)"; PreparedStatement ps = con.prepareStatement(sql); // Yo no puedo ejecutar mi sentencia preparada porque no he rellenado los huecos // Pero el conector ya ha establecido un 'plan' para mi sql // Para poder ejecutar la sentencia tengo que poner valores en los huecos ps.setString(1, "Juan"); ps.setString(2, "L'hopital"); // Aquí ejecuto la sentencia ps.executeUpdate(); // Pongo otros valores en los huecos ps.setString(1, "Ana"); ps.setString(2, "D'anjou"); // ventajas: Más claridad que con la concatenación // Más rapidez porque se analiza el plan de ejecución una vez aunque se llame // varias // Evita inyección SQL // Evita problemas con comillas simples // Desventajas: Tenmos que indicar los parámetros y cuando son muchos podemos // liarnos ps.executeUpdate(); // Podemos usarlo para modificar o en una condición para leer los datos ps = con.prepareStatement("select * from actor where first_name like ?"); ps.setString(1, "%ar%"); ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println( rs.getInt("actor_id") + " " + rs.getString("first_name") + " " + rs.getString("last_name")); } } catch (Exception ex) { System.out.println(ex); } } }