Insertar datos en MySQL con PreparedStatement

Resumen

Aprende a implementar el método save en Java para insertar un nuevo empleado en MySQL usando JDBC y PreparedStatement. Esta guía está pensada para quienes ya manejan operaciones de lectura y quieren avanzar hacia la escritura en bases de datos relacionales.

Antes de escribir, conviene validar que la lectura funciona. Una prueba rápida con getById confirma que el repositorio responde con los datos esperados, por ejemplo el employee número tres con todos sus campos completos [0:30].

¿Cómo se construye la consulta SQL para insertar un empleado?

La base de toda inserción es una declaración SQL clara. Aquí trabajamos con un INSERT INTO sobre la tabla employees, pasando cinco columnas: firstName, paSurname, maSurname, email y salary [1:10].

Los valores se representan con interrogantes como marcadores de posición:

java String sql = "INSERT INTO employees (firstName, paSurname, maSurname, email, salary) VALUES (?, ?, ?, ?, ?)";

Este patrón con placeholders es el estándar para usar PreparedStatement, que protege contra inyección SQL y simplifica la asignación de valores tipados.

¿Qué es un PreparedStatement? Es una declaración SQL precompilada que recibe parámetros con métodos set, como setString o setFloat. Mejora el rendimiento y evita inyección SQL.

¿Cómo se implementa el método save con try con recursos?

El bloque try con recursos abre la conexión y la cierra automáticamente al terminar. Dentro de él se prepara el statement con la consulta y se asignan los valores uno a uno [2:00].

java try (Connection myConn = getConnection(); PreparedStatement myStmt = myConn.prepareStatement(sql)) {

myStmt.setString(1, employee.getFirstName()); myStmt.setString(2, employee.getPaSurname()); myStmt.setString(3, employee.getMaSurname()); myStmt.setString(4, employee.getEmail()); myStmt.setFloat(5, employee.getSalary()); myStmt.executeUpdate();

}

Cada parámetro corresponde a un interrogante de la consulta en el orden declarado. El método executeUpdate dispara la inserción y devuelve el número de filas afectadas [3:20].

¿Por qué usar setString y setFloat según el tipo de dato?

Los métodos set deben coincidir con el tipo de la columna en la base de datos. Los nombres y el correo son cadenas, así que usan setString. El salario, al estar definido como tipo float, requiere setFloat para mantener la precisión decimal.

Un error frecuente es declarar una conexión extra que no se utiliza. Si ya tienes el PreparedStatement obtenido desde la conexión, no necesitas duplicarla en el try [3:50].

¿Cómo probar la inserción desde el método main?

La prueba se hace en tres pasos visibles en consola. Primero listas los empleados existentes, luego insertas uno nuevo y finalmente vuelves a listar para confirmar el cambio [4:30].

java System.out.println("Listando empleados:"); repository.findAll().forEach(System.out::println);

Employee employee = new Employee(); employee.setFirstName("Diego"); employee.setPaSurname("Pimentel"); employee.setMaSurname("Gutiérrez"); employee.setEmail("diego@example.com"); employee.setSalary(15000f);

repository.save(employee);

System.out.println("Nuevo empleado insertado"); repository.findAll().forEach(System.out::println);

Al ejecutar, la terminal muestra primero los cinco empleados originales y después seis registros, donde el último es Diego. La verificación final se hace directamente en la base de datos con un select rows sobre la tabla employees [5:40].

¿Qué hace executeUpdate en JDBC? Ejecuta sentencias INSERT, UPDATE o DELETE y devuelve la cantidad de filas modificadas. A diferencia de executeQuery, no retorna un ResultSet.

¿Cómo decidir entre insertar o actualizar un empleado?

Un patrón común en repositorios es usar el ID como bandera. Si el empleado llega con un ID mayor a cero, significa que ya existe en la base de datos, así que corresponde un UPDATE. Si el ID es cero o nulo, se trata de un registro nuevo y procede el INSERT [6:30].

Esta lógica concentra la decisión en un solo método save y evita exponer dos operaciones separadas al cliente del repositorio. El reto está en implementarla manteniendo la consulta SQL adecuada para cada caso.

¿Cómo escribirías tú esa validación dentro del método save? Comparte tu enfoque en los comentarios.