@Override
 public List<Producto> readForName(String name) {
   List<Producto> lista = new ArrayList<Producto>();
   Connection cn = null;
   try {
     cn = AccesoDB.getConnection();
     String query =
         "select idprod, idcat, nombre, precio, stock "
             + "from producto "
             + "where upper(nombre) like ?";
     PreparedStatement pstm = cn.prepareStatement(query);
     name = "%" + name.toUpperCase() + "%";
     pstm.setString(1, name);
     ResultSet rs = pstm.executeQuery();
     while (rs.next()) {
       Producto o = rsToBean(rs);
       lista.add(o);
     }
     rs.close();
     pstm.close();
   } catch (SQLException e) {
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     throw new RuntimeException("No se puede consultar la base de datos.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
   return lista;
 }
 /**
  * Control de transacción en el procedimiento almacenado
  *
  * @param prod
  */
 @Override
 public void create2(Producto prod) {
   Connection cn = null;
   try {
     cn = AccesoDB.getConnection();
     cn.setAutoCommit(true);
     String query = "{call usp_crea_producto(?,?,?,?,?)}";
     CallableStatement cstm = cn.prepareCall(query);
     cstm.registerOutParameter(1, Types.INTEGER);
     cstm.setInt(2, prod.getIdcat());
     cstm.setString(3, prod.getNombre());
     cstm.setDouble(4, prod.getPrecio());
     cstm.setInt(5, prod.getStock());
     cstm.executeUpdate();
     prod.setIdprod(cstm.getInt(1));
     cstm.close();
   } catch (SQLException e) {
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     throw new RuntimeException("No se puede crear el producto.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
 }
 @Override
 public Producto readForId(int id) {
   Producto o = null;
   Connection cn = null;
   try {
     cn = AccesoDB.getConnection();
     String query =
         "select idprod, idcat, nombre, precio, stock " + "from producto " + "where idprod = ?";
     PreparedStatement pstm = cn.prepareStatement(query);
     pstm.setInt(1, id);
     ResultSet rs = pstm.executeQuery();
     if (rs.next()) {
       o = rsToBean(rs);
     }
     rs.close();
     pstm.close();
   } catch (SQLException e) {
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     throw new RuntimeException("Error en la lectura del producto.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
   return o;
 }
 @Override
 public List<Producto> readAll() {
   List<Producto> lista = new ArrayList<Producto>();
   Connection cn = null;
   try {
     cn = AccesoDB.getConnection();
     String query = "select idprod, idcat, nombre, precio, stock " + "from producto ";
     Statement stm = cn.createStatement();
     ResultSet rs = stm.executeQuery(query);
     while (rs.next()) {
       Producto o = rsToBean(rs);
       lista.add(o);
     }
     rs.close();
     stm.close();
   } catch (SQLException e) {
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     throw new RuntimeException("No se puede consultar la base de datos.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
   return lista;
 }
 /**
  * Control de transacción desde el cliente
  *
  * @param prod
  */
 @Override
 public void create1(Producto prod) {
   Connection cn = null;
   try {
     // Variables
     Statement stm;
     PreparedStatement pstm;
     String query;
     int id;
     ResultSet rs;
     // Conexión
     cn = AccesoDB.getConnection();
     // Iniciar la Tx
     cn.setAutoCommit(false);
     // Obtener el Id del producto
     query = "select sq_producto.NextVal id from dual";
     stm = cn.createStatement();
     rs = stm.executeQuery(query);
     rs.next();
     id = rs.getInt("id");
     // Insertar el producto
     query = "insert into producto" + "(idprod,idcat,nombre,precio,stock) " + "values(?,?,?,?,?) ";
     pstm = cn.prepareStatement(query);
     pstm.setInt(1, id);
     pstm.setInt(2, prod.getIdcat());
     pstm.setString(3, prod.getNombre());
     pstm.setDouble(4, prod.getPrecio());
     pstm.setInt(5, prod.getStock());
     pstm.executeUpdate();
     // Retornar el id
     prod.setIdprod(id);
     // Confirmar Tx
     cn.commit();
     // Cerrar objetos
     rs.close();
     stm.close();
     pstm.close();
   } catch (SQLException e) {
     try {
       cn.rollback();
     } catch (Exception e1) {
     }
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     try {
       cn.rollback();
     } catch (Exception e1) {
     }
     throw new RuntimeException("Error en el proceso crear producto.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
 }
 @Override
 public void delete(int id) {
   Connection cn = null;
   String query;
   PreparedStatement pstm;
   ResultSet rs;
   int cont;
   try {
     cn = AccesoDB.getConnection();
     cn.setAutoCommit(false);
     // Verificar si el producto rgistra ventas
     query = "select count(*) cont from detalle where idprod = ?";
     pstm = cn.prepareStatement(query);
     pstm.setInt(1, id);
     rs = pstm.executeQuery();
     rs.next();
     cont = rs.getInt("cont");
     rs.close();
     pstm.close();
     if (cont > 0) {
       throw new SQLException("El producto registra ventas, no se puede eliminar.");
     }
     // Eliminar el producto
     query = "delete from producto where idprod=?";
     pstm = cn.prepareStatement(query);
     pstm.setInt(1, id);
     int filas = pstm.executeUpdate();
     if (filas == 0) {
       throw new SQLException(
           "Código de producto no existe, " + "posiblemente fue eliminado por otro usuario.");
     }
     cn.commit();
     pstm.close();
   } catch (SQLException e) {
     try {
       cn.rollback();
     } catch (Exception e1) {
     }
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     try {
       cn.rollback();
     } catch (Exception e1) {
     }
     throw new RuntimeException("Error al tratar de eliminar el producto.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
 }
 @Override
 public void update(Producto prod) {
   Connection cn = null;
   try {
     // Variables
     PreparedStatement pstm;
     String query;
     int filas;
     // Conexión
     cn = AccesoDB.getConnection();
     // Iniciar la Tx
     cn.setAutoCommit(false);
     // Insertar el producto
     query = "update producto set idcat=?, nombre=?, precio=?, " + "stock=? where idprod = ? ";
     pstm = cn.prepareStatement(query);
     pstm.setInt(1, prod.getIdcat());
     pstm.setString(2, prod.getNombre());
     pstm.setDouble(3, prod.getPrecio());
     pstm.setInt(4, prod.getStock());
     pstm.setInt(5, prod.getIdprod());
     filas = pstm.executeUpdate();
     if (filas == 0) {
       throw new SQLException("Producto no existe.");
     }
     // Confirmar Tx
     cn.commit();
     // Cerrar objetos
     pstm.close();
   } catch (SQLException e) {
     try {
       cn.rollback();
     } catch (Exception e1) {
     }
     throw new RuntimeException(e.getMessage());
   } catch (Exception e) {
     try {
       cn.rollback();
     } catch (Exception e1) {
     }
     throw new RuntimeException("Error en el proceso crear producto.");
   } finally {
     try {
       cn.close();
     } catch (Exception e) {
     }
   }
 }