Actualización y Eliminación de Datos en Java con JDBC
Resumen
¿Cómo realizar actualizaciones y eliminaciones en Java con JDBC?
Aprender a interactuar con bases de datos es esencial en el desarrollo de software. En esta sesión, nos centraremos en la actualización y eliminación de datos usando Java Database Connectivity (JDBC). Este conocimiento es clave para manipular datos eficazmente en Java, así como para gestionar información en nuestras aplicaciones. Vamos a sumergirnos en los detalles del código y los mejores momentos para aplicar estas operaciones.
¿Qué necesitas para realizar una actualización en una base de datos?
Para actualizar datos en una base de datos con JDBC, iniciamos estableciendo la conexión, creando un Statement y ejecutando la consulta de actualización con executeUpdate(). Veamos este proceso en acción:
Configuración Inicial:
Comienza con la importación de las bibliotecas necesarias y establece una conexión a tu base de datos.
Utiliza createStatement() para crear un objeto Statement.
Statement myStmt = myConn.createStatement();
Ejecutar la Actualización:
Escribe y ejecuta tu expresión SQL de actualización.
int rowsAffected = myStmt.executeUpdate("UPDATE employees SET email='joanna2@example.com' WHERE firstName='Joanna'");
Verificación de Resultados:
Puedes usar un ResultSet para ver los cambios.
ResultSet myRs = myStmt.executeQuery("SELECT * FROM employees ORDER BY firstName");while(myRs.next()){System.out.println(myRs.getString("firstName")+", "+ myRs.getString("email"));}
Recuerda siempre manejar las excepciones que puedan surgir durante estas operaciones para diagnosticar cualquier problema fácilmente.
¿Qué errores comunes puedes encontrar al actualizar registros?
Los errores sintácticos son la trampa más común al escribir queries SQL. Un paréntesis mal colocado o usar comillas incorrectas puede detener la ejecución de todo el comando. Durante la creación del ejercicio, surgió un error en la consulta SQL por no cerrar correctamente comillas o paréntesis. Otros errores comunes se refieren a problemas de tipo de datos y errores al especificar columnas incorrectas. Aquí hay algunos consejos para evitarlos:
Comprueba tu sintaxis SQL: Revisa que la consulta esté correcta en un entorno de trabajo independiente, como MySQL Workbench.
Verifica la disponibilidad de columnas: Asegúrate de que las columnas que estás intentando actualizar existen y son accesibles para el usuario de base de datos que realiza la conexión.
Maneja las excepciones adecuadamente: Utiliza try-catch para capturar y gestionar SQLException.
¿Cómo eliminar registros de una base de datos?
Eliminar datos es una de las operaciones cruciales en la gestión de bases de datos. La eliminación permanente de registros debe realizarse con precaución. Ahora, te mostraré cómo hacerlo usando JDBC:
Establecer la Conexión y Crear el Statement:
Similar al proceso de actualización, comienza estableciendo la conexión y creando el Statement.
Statement myStmt = myConn.createStatement();
Ejecutar el Delete:
Define tu consulta de eliminación y ejecuta.
int rowsAffected = myStmt.executeUpdate("DELETE FROM employees WHERE firstName='Joanna'");
Verificación:
Después de realizar el delete, ejecuta un SELECT para confirmar que el registro deseado ya no existe.
ResultSet myRs = myStmt.executeQuery("SELECT * FROM employees");while(myRs.next()){System.out.println(myRs.getString("firstName")+", "+ myRs.getString("email"));}
¿Cómo proteger tus operaciones CRUD en JDBC?
Aunque ya hemos explorado estas operaciones básicas, es vital implementar prácticas de seguridad y eficiencia en tus consultas para proteger la integridad de tus datos. Aquí algunos consejos:
Usa parámetros: Implementa PreparedStatement en lugar de Statement para prevenir inyecciones SQL.
Limita los permisos de usuarios: Solo proporciona los permisos necesarios para el usuario de conexión.
Realiza copias de seguridad: Asegúrate de tener un sistema de copias de seguridad, especialmente antes de realizar actualizaciones masivas o eliminaciones.
Con este conocimiento sólido de JDBC, puedes comenzar a implementar funciones de CRUD efectivas y seguras en tus aplicaciones Java. ¡La práctica y el cuidado en la escritura de tus queries harán que te conviertas en un experto en el manejo de bases de datos! Adelante, sigue explorando y aprendiendo más sobre JDBC y otras tecnologías relacionadas.
He avanzado muy poco en este curso hasta este punto debido a que no comprendía cuando usar statement o preparedStatement y segun mi concepto considero que esta diferencia a este punto del curso no es tan explicita.
He visto leído bastante al respecto y creo tener la diferencia; principalmente Statement no permite el dinamismo que si ofrece preparedStatement, por ejemplo cuando veíamos que con el uso de marcadores de posición (simbolo ? dentro de las sentencias) podiamos inyectar valores dinámicos a las sentencias con los metodos set___ (Hasta aqui todo bien), el problema radica en que esta explicación va mas allá que solo esto, Statement da paso a vulnerabilidades como SQL injection debido a que al ser String estaticos suele ser mas vulnerable a estas practicas, evento que no sucede con preparedStatement y sus marcadores de posicion.
Por otro lado, preparedStatement ofrece mejor performance en tiempo de ejecución que Statement, Ahora, si se preguntan "¿Como usamos un SELECT * FROM X?" preparedStatement tambien permite el uso de ResultSet y el tipo de consultas que se hacen con Statement tambien pueden ser hechas por preparedStatement y viceversa en eso no se diferencian.
Espero que esto pueda ayudar a alguien que también se sienta como yo.
(Esto sin intención de atacar a la docente, pues simplemente abarco un problema puntual en una persona particular) ¡Sigan disfrutando del curso!
String queriUpdate = "update titan.empleados set name=?, lastName=?, salary=? where (id=?)";
stmt = conn.prepareStatement(queriUpdate);
stmt.setString(1,"Jose Alexis");
stmt.setString(2,"Nunez Torres");
stmt.setDouble(3,30000);
stmt.setInt(4,1);
stmt.executeUpdate();
rs = stmt.executeQuery("select * from empleados
según tengo entendido es mejor preparar primero la consulta para evitar inyeccion de codigo en la misma peticion
Me presento problema al actualizar el executeupdate, me toco quitar donde lo concatenaba con el + .
Lo coloque así y me permitió ya realizar el proceso, dejo comentada la línea que tenía antes siguiendo el ejemplo de la clase.
// int rowsAffected = myStamt.executeUpdate("UPDATE pb"+"set correo='micorreo.com'"+"WHERE id = '01'"); int rowsAffected = myStamt.executeUpdate("UPDATE pb SET correo='micorreo.com' WHERE id = '01'");
Te pasa porque el id es int y lo estas poniendo como string
Realmente te está pasando porque al concatenar no tienes en cuenta los espacios, entonces tu consulta termina siendo así:
UPDATE pbset correo='micorreo.com'WHERE id = '01'.
Una sola pregunta me surgió
¿Cúal sería la razón de concatenar el executeUpdate?
Muy buena clase y gran curso en lo que va! un gran saludo
La razón de concatenar el executeUpdate es para ejecutar una sentencia SQL que modifique los datos en la base de datos, como insertar, actualizar o eliminar registros.
Se utiliza para Crear, Actualizar y Eliminar registros, cuando se ejecuta una de estas acciones te retorna un entero que hace referencia al número de filas afectadas, cuantos registros insertaste, cuantos actualizaste o cuantos eliminaste.
Yo opté por separar mi código de una manera más ordenada, quedando así
Y en el main solo mando a llamar lo que ocupo, así
Asi es como la maestra debio haber hecho el curso
Para realizar un update, es preferible utilizar PreparedStatement en lugar de Statement. La razón principal es que PreparedStatement ofrece seguridad contra inyecciones SQL y mejora el rendimiento en situaciones donde se ejecutan múltiples consultas similares, ya que permite precompilar la consulta. Además, permite establecer parámetros de manera más sencilla y clara.
Aquí tienes un ejemplo de cómo se usaría PreparedStatement para un update:
String sql ="UPDATE employees SET email = ? WHERE firstName = ?";PreparedStatement pstmt = myConn.prepareStatement(sql);pstmt.setString(1,"joanna2.com");pstmt.setString(2,"Joana");pstmt.executeUpdate();
Esto es más seguro y eficiente en comparación con el uso de Statement, especialmente al manejar variables.
quien mas elimino a Jane xd
<3
int rowsAffected = myStament.executeUpdate("INSERT INTO countries (name) VALUES ('Chile')");// Createint rowsAffected = myStament.executeUpdate("UPDATE countries SET name = 'Mexico' WHERE (id = 9)");// Updateint rowsAffected = myStament.executeUpdate("DELETE FROM countries WHERE (id = 9)");// DeletemyRest = myStament.executeQuery("SELECT * FROM countries order by id asc");// Read
aca para limpiar un poco mas las queries dependiendo de la version de Java
Inicialmente se tenían estos datos en la BD:
Luego se hizo la eliminación del segundo registro:
✅
quien elimino su tabla por error?
import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.SQLOutput;publicclassEliminar{//VariablesstaticString sql =("DELETE FROM Docentes WHERE id_docente = ?");staticPreparedStatement preparedStatement;//Método para eliminarpublicstaticvoideliminar(String id_docente){try{ preparedStatement =Conectar.connection.prepareStatement(sql); preparedStatement.setString(1, id_docente); preparedStatement.executeUpdate();System.out.println("Datos eliminados correctamente");}catch(SQLException e){System.out.println("Error al eliminar: "+ e.getMessage());}}}
para la resolucion del problema pense, busque si habian en el Statement un executeDelete lo cual no habia y en temas de logica dije "Bueno si no hay un delete sera un update porque eliminar es una actualizacion de la tabla" y en efecto funciono con un execute Delete con el parametro sql de DELETE FROM employees WHERE first_name = 'Johana' por lo cual era pensar y revisar metodos y entender que statement es para consultas fijas xd
executeUpdate -> usar para insertar, actualizar y eliiminar
myStmt = myConn.createStatement();myRes = myStmt.executeQuery("SELECT * FROM usuarios");while(myRes.next()){System.out.println(myRes.getString("name"));}int rowsAffected = myStmt.executeUpdate("DELETE FROM usuarios WHERE name='Ernesto'");if(rowsAffected >0){System.out.println("Se ha eliminado correctamente 👍👍");}myRes = myStmt.executeQuery("SELECT * FROM usuarios");while(myRes.next()){System.out.println(myRes.getString("name"));}