DepartamentoProdutoDAO + Model editar arquivo

0:00 / 0:00

Primeira edição da sequência CREATE. O DAO ganha o método daoInsert e o Model ganha o wrapper insert(bean). Duas adições mínimas — uma linha de lógica cada — que seguem exatamente o mesmo padrão do daoDelete da sequência anterior.

CÓDIGO COMPLETO — DAO
package br.xt.app.departamento.produto;

import br.jasap.core.AppManager;
import br.jasap.dao.Query;
import br.jasap.util.JasapList;
import br.xt.AppsRootDAO;

public class DepartamentoProdutoDAO extends AppsRootDAO {

    public DepartamentoProdutoDAO() {
    }

    public DepartamentoProdutoDAO(AppManager manager) {
        setManager(manager);
        setDataBase(manager.getDataBase());
    }

    public void daoList(JasapList list) throws Exception {
        StringBuilder sql = new StringBuilder();
        sql.append("select a.* from " + DepartamentoProdutoBean.TABLE + " a <orderby>");

        Query query = getDataBase().getQuery(sql.toString());
        select().executeList(query, list);

        while (query.next()) {
            DepartamentoProdutoBean bean = new DepartamentoProdutoBean();
            query.populateBean(bean);
            list.getList().add(bean);
        }
        query.release();
    }

    // ADICIONAR
    public void daoInsert(DepartamentoProdutoBean bean) throws Exception {
        insert().execute(bean, DepartamentoProdutoBean.TABLE);
    }
    // FIM

    public void daoDelete(DepartamentoProdutoBean bean) throws Exception {
        delete().execute(bean, DepartamentoProdutoBean.TABLE);
    }

}

Mudança nesta sequência: somente o método daoInsert (verde). Tudo o mais já existia das sequências CRUD READ e CRUD DELETE.

CÓDIGO COMPLETO — Model
package br.xt.app.departamento.produto;

import br.jasap.core.AppManager;

public class DepartamentoProdutoModel extends DepartamentoProdutoDAO {

    public DepartamentoProdutoModel(AppManager manager) {
        super(manager);
    }

    // ADICIONAR
    public void insert(DepartamentoProdutoBean bean) throws Exception {
        daoInsert(bean);
    }
    // FIM

}

Mudança nesta sequência: somente o método insert (verde). O construtor já existia da sequência CRUD READ.

Como insert().execute funciona?

Mesmo mecanismo do delete().execute — via reflection. O helper insert() herdado de JasapDAO inspeciona o Bean procurando todos os getters, monta automaticamente:

INSERT INTO departamento.produto (nome_produto, vl_produto, qtd_produto, obs_produto)
VALUES (?, ?, ?, ?)

O campo id_produto é excluído automaticamente porque tem @DBInfo(serial=true) — o banco gera o próximo ID via sequence.

Cada getter do Bean vira uma coluna + valor. O chamador só precisa preencher o Bean com os dados do formulário — todo o resto é o framework.

Por que o Model existe? (DAO vs Model)

O Model parece redundante — insert(bean) só chama daoInsert(bean). Mas a separação tem um propósito:

  • DAO — fala com o banco. Métodos começam com dao (daoInsert, daoDelete, daoList). Só SQL, sem regra de negócio.
  • Model — coordena. Métodos têm nome de negócio (insert, update). Pode chamar múltiplos DAOs, aplicar validações, disparar cascatas.

Hoje o insert é um wrapper direto. Mas quando a entidade crescer (ex: cascade de status, geração de campo qs_produto, vínculo com outras tabelas), a lógica extra entra no Model — o DAO continua limpo.

As Actions NUNCA chamam o DAO diretamente — sempre via Model. Isso garante que qualquer regra adicionada no Model será aplicada automaticamente em todos os pontos de entrada.