Buen día, antes de modificar el metodo guardar el programa compila, pero despues de hacer lo que sugiere el video me da este error:
Exception in thread "main" java.lang.NullPointerException
at com.alura.jdbc.controller.ProductoController.listar(ProductoController.java:36)
at com.alura.jdbc.view.ControlDeStockFrame.cargarTabla(ControlDeStockFrame.java:215)
at com.alura.jdbc.view.ControlDeStockFrame.configurarTablaDeContenido(ControlDeStockFrame.java:61)
at com.alura.jdbc.view.ControlDeStockFrame.<init>(ControlDeStockFrame.java:47)
at com.alura.jdbc.ControlDeStockMain.main(ControlDeStockMain.java:10)
El metodo guardar() quedo asi:
private void guardar() {
if (textoNombre.getText().isBlank() || textoDescripcion.getText().isBlank()) {
JOptionPane.showMessageDialog(this, "Los campos Nombre y Descripción son requeridos.");
return;
}
Integer cantidadInt;
try {
cantidadInt = Integer.parseInt(textoCantidad.getText());
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, String
.format("El campo cantidad debe ser numérico dentro del rango %d y %d.", 0, Integer.MAX_VALUE));
return;
}
// TODO
var producto = new HashMap<String, String>();
// Acá llama a u obtiene el texto de un TextField
producto.put("NOMBRE", textoNombre.getText());
// Acá llama a u obtiene el texto de un TextField
producto.put("DESCRIPCION", textoDescripcion.getText());
// Acá llama a u obtiene el texto de un TextField el valor esta en Integer y lo
// pasa a String
producto.put("CANTIDAD", String.valueOf(cantidadInt));
//Aca se hace uso de una instancia ya creada para usar el metodo guardar y se pasa el producto
//para llevarlo a la BD y a su respectiva tabla.
//Habia eliminado esta parte
var categoria = comboCategoria.getSelectedItem();
try {
this.productoController.guardar(producto);
} catch (SQLException e) {
throw new RuntimeException(e);
}
JOptionPane.showMessageDialog(this, "Registrado con éxito!");
this.limpiarFormulario();
}
Y en el ProductoController.java los metodos modificados estan asi:
public List<Map<String, String>> listar() throws SQLException {
//new ConnectionFactory();
//Se crea la coneccion a la base de datos con JDBC
Connection con = ConnectionFactory.recuperaConexion();
//Se crea un statement con la conneccion a la BD abierta, con el proposito de ejecutar Query's
Statement statement = con.createStatement();
//Se ejecuta una query, este metodo devuelve un boolean lo que devulve es confirmacion de
//ejecución de la Query
//boolean result = statement.execute("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM PRODUCTO");
//ResultSet es un tipo de objeto que recibe la info que esta en la tabla
ResultSet resultSet = statement.getResultSet();
//Para leer fila por fila de la tabla podemos usar lo siguiente:
List<Map<String, String>> resultado = new ArrayList<>();
while (resultSet.next()) {
Map<String,String> fila = new HashMap<>();
fila.put("ID", String.valueOf(resultSet.getInt("ID")));
fila.put("NOMBRE", resultSet.getString("NOMBRE"));
fila.put("DESCRIPCION", resultSet.getString("DESCRIPCION"));
fila.put("CANTIDAD", String.valueOf(resultSet.getInt("CANTIDAD")));
resultado.add(fila);
}
//Cierra la coneccion a la BD
con.close();
return resultado;
}
public void guardar(Map<String, String> producto) throws SQLException {
//TODO Kemmer Torres Crear coneccion a la BD
//TODO Kemmer Torres Crear un Statement para hacer la Query
Connection con = ConnectionFactory.recuperaConexion();
Statement statement = con.createStatement();
String query = String.format("INSERT INTO PRODUTO(NOMBRE, DESCRIPCION, CANTIDAD)"
+ "VALUES ('%s','%s',%d)", producto.get("NOMBRE"),producto.get("DESCRIPCION"),producto.get("CANTIDAD"));
statement.execute(query,Statement.RETURN_GENERATED_KEYS);
ResultSet resulSet = statement.getGeneratedKeys();
while(resulSet.next()) {
System.out.println(resulSet.getInt(1));
}
}
}
Por que sucede este problema?