PreparedStatement

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();
	}

}

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos