Ir para conteúdo
Entre para seguir isso  
Carcleo

Orientação

Recommended Posts

Pessoal, acho que preciso de uma orientação.


Não sei o rumo que estou indo em java e estou com muito problema na concepção da necessidade de uso de Objetos em java!


Antes de tudo quero dizer que tudo funciona corretamente. É mais para questão de aconselhamento mesmo!


Tenho a seguinte tabela MySQL


CREATE TABLE professor
(
id int(3) NOT NULL AUTO_INCREMENT,
nome varchar(200) NOT NULL DEFAULT '',
login varchar(10) NOT NULL DEFAULT '',
senha varchar(10) NOT NULL DEFAULT '',
dataCadastro date NOT NULL DEFAULT '0000-00-00',
sala int(1) NOT NULL DEFAULT '0',
status char(1) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

Tenho o arquivo index.jsp (apenas o form)


<div id="indexMeio">

<form action="ProfessorServlet?acao=AdicionaProfessor" method="post">
<label>Login</label> : <input type="text" name="login" id="login" maxlength="10" required="required"><br /><br />
<label>Senha</label> : <input type="text" name="senha" id="senha" maxlength="10" required="required"><br /><br />
<label>Nome</label> : <input type="text" name="nome" id="nome" maxlength="200" required="required"><br /><br />
<label>Sala</label> : <input type="text" name="sala" id="sala" maxlength="1" required="required"><br /><br />
<input type="submit" value="Envia">
</form><br />

</div>

Tenho a Servlet java "ProfessorServlet"


package controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.professor.BloqueiaProfessor;
import dao.professor.CadastraProfessor;
import dao.professor.EditaProfessor;
import dao.professor.ExcluiProfessor;

@WebServlet("/ProfessorServlet")
public class ProfessorServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;

public ProfessorServlet()
{
super();
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String acao = request.getParameter("acao");
if (acao.equals("AdicionaProfessor"))
{
String login = request.getParameter("login");
String senha = request.getParameter("senha");
String nome = request.getParameter("nome");
java.util.Date data = new java.util.Date();
int sala = Integer.parseInt(request.getParameter("sala"));

CadastraProfessor professorCad = new CadastraProfessor ();
professorCad.adicionaProfessor(login, senha, nome, data, sala);

RequestDispatcher rd = request.getRequestDispatcher("listar.jsp");
rd.forward(request, response);
}
else if (acao.equals("EditaProfessor"))
{
String login = request.getParameter("login");
String senha = request.getParameter("senha");
String nome = request.getParameter("nome");
java.util.Date data = new java.util.Date();
int sala = Integer.parseInt(request.getParameter("sala"));
int id = Integer.parseInt(request.getParameter("id"));

EditaProfessor professorEdita = new EditaProfessor ();
professorEdita.editaProfessor(login, senha, nome, data, sala, id);

RequestDispatcher rd = request.getRequestDispatcher("listar.jsp");
rd.forward(request, response);
}
else if (acao.equals("ExcluiProfessor"))
{
int id = Integer.parseInt(request.getParameter("id"));

ExcluiProfessor professorExclui = new ExcluiProfessor ();
professorExclui.excluiProfessor(id);

RequestDispatcher rd = request.getRequestDispatcher("listar.jsp");
rd.forward(request, response);
}
else if (acao.equals("BloqueiaProfessor"))
{
int id = Integer.parseInt(request.getParameter("id"));
String status = request.getParameter("status");

BloqueiaProfessor professorBloqueia = new BloqueiaProfessor ();
professorBloqueia.bloqueiaProfessor(status, id);

RequestDispatcher rd = request.getRequestDispatcher("listar.jsp");
rd.forward(request, response);
}
else if (acao.equals("AlteraSenhaProfessor"))
{
int id = Integer.parseInt(request.getParameter("id"));
String senha = request.getParameter("senha");

BloqueiaProfessor professorBloqueia = new BloqueiaProfessor ();
professorBloqueia.bloqueiaProfessor(senha, id);

RequestDispatcher rd = request.getRequestDispatcher("listar.jsp");
rd.forward(request, response);
}
}
}

E tenho as classes CadastraProfessor.java e EditaProfessor.java


CadastraProfessor.java


package dao.professor;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import util.Conexao;

public class CadastraProfessor
{
Connection conexao = null;

public CadastraProfessor()
{
conexao = Conexao.getConnection();
}

public void adicionaProfessor(String _login, String _senha, String _nome, java.util.Date _data, int _sala)
{
try {
PreparedStatement insert = conexao.prepareStatement("insert into professor(login, senha, nome, dataCadastro, sala, status) values (?, ?, ?, ?, ?, ?)");

insert.setString(1, _login);
insert.setString(2, _senha);
insert.setString(3, _nome);
insert.setDate(4, new java.sql.Date(_data.getTime()));
insert.setInt(5, _sala);
insert.setString(6, "n");

insert.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}


EditaProfessor.java



package dao.professor;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import util.Conexao;

public class EditaProfessor
{
Connection conexao = null;

public EditaProfessor()
{
conexao = Conexao.getConnection();
}

public void editaProfessor(String _login, String _senha, String _nome, java.util.Date _data, int _sala, int _id)
{
try {
PreparedStatement edita = conexao.prepareStatement("update professor set nome=?, login=?, senha=?, dataCadastro=?, sala=?" + "where id=?");

edita.setString(1, _login);
edita.setString(2, _senha);
edita.setString(3, _nome);
edita.setDate(4, new java.sql.Date(_data.getTime()));
edita.setInt(5, _sala);
edita.setInt(6, _id);

edita.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}


Desta forma, estou gravando direto na base de dados e editando sem ter que criar um objeto do tipo new Professor() herdando de new Pessoa().


Tenho também as Classes Usuario e Sala.


Pessoal, por favor, não me entendam mau. Realmente penso que preciso conselho sobre a necessidade de se criar objetos de Professor estendendo à Pessoa na Servlet e depois pegar esse objeto do tipo Professor e manipula-lo na Classe CadastraProfessor!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um problema imediato que consigo ver em não utilizar objetos (especificamente no caso que você mostrou) é a proliferação de parâmetros nas funções.
De uma forma mais semântica, o método armazena várias strings sem relação (tem gente que brinca com isso perguntando se Java é orientado a strings, mas vale p/ qualquer linguagem) ou lida com informações de Professor?
Quando for necessário alterar a definição de Professor, você também terá que alterar as chamadas a esses métodos por não passar somente 1 objeto.

Você implementou duas classes que lidam com o mesmo objeto. Normalmente se faz um dao único com as operações do CRUD como métodos. Assim é instanciada apenas uma classe e a operação desejada é chamada sobre o objeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se entendi!

 

Terei apenas 1 classe professor com os atributos e métodos da abstração. Ok!

 

Vamos simplificar as coisas para facilitar meu entendimento?

 

Tenho uma tabela no mysql com os campos (fields)

 

id, nome, login, senha, dataCadastro, sala, status

 

Na classe Professor que herda da classe Pessoa possuo apenas

 

sala

 

Na Classe Pessoa tenho os demais campos.

 

id, nome, login, senha, dataCadastro, status

 

Mas na abstração de Pessoa e de Professor não há um atributo "id" igual tenho no banco de dados.

 

De sorte, quando estiver cadastrando o Professor, o field "id" é auto_increment então quanto ao criar o objeto e depois perdê-lo após a inserção na tabela MYSQL não há problema pois o mesmo esta salvo no Banco de Dados.

 

Mas quando precisar fazer uma alteração nesse professor, terei que chamar a mesma classe novamente e criar o objeto que será populado com os dados vindos do banco e receberá a alteração através do form.

 

O problema aqui é que a abstração de Professor não possui um atributo "id" e como os outros campos sofrem alteração, não posso buscar por eles na tabela MySQL. Então, na listagem dos objetos de Professor, como não tenho o atributo "id!", como fazer para indicar após as alterações e no momento da submissão do formulário para edição no banco para indicar qual será o registro que se refere àquele Professor aletrado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Na classe Professor que herda da classe Pessoa possuo apenas

sala

Na Classe Pessoa tenho os demais campos.

id, nome, login, senha, dataCadastro, status

 

Se você está herdando da classe Pessoa você tem um id.

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpa, escrevi errado lá

A Classe Pessoa não tem id pois é objeto de abstração.

 

Quem tem id é a Tabela Professor do MySQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

package daos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import models.Professor;

public class ProfessorDao {
    Connection conexao;
    
    private static Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc://postgresql:5432/professores", "postgres", "potsgres");
    }
    
    public void adicionar(Professor professor) {
        String sql = "insert into professor(nome, turma, sala) values (?, ?, ?)";
        PreparedStatement stmt = null;
        try {
            stmt = this.getConnection().prepareStatement(sql);
            stmt.setString(1, professor.getNome());
            stmt.setString(2, professor.getTurma());
            stmt.setInt(3, professor.getSala());
            
            stmt.execute();
            stmt.close();
        }catch (SQLException e) {
            System.err.println(e);
        }
    }
    
    public List<Professor> listar() {
        String sql = "select * from professor";
        PreparedStatement stmt = null;
        ResultSet rs;
        List<Professor> resultados = new ArrayList<Professor>();
        try {
            stmt = this.getConnection().prepareStatement(sql);
            rs = stmt.executeQuery();
            while(rs.next()) {
                Professor tmp = new Professor();
                tmp.setId(rs.getLong("id"));
                tmp.setNome(rs.getString("nome"));
                tmp.setTurma(rs.getString("turma"));
                tmp.setSala(rs.getInt("sala"));
                resultados.add(tmp);
            }
            stmt.close();
        }catch (SQLException e) {
            System.err.println(e);
        }
        
        return resultados;
    }
}

package servlets;

import daos.ProfessorDao;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Professor;

@WebServlet(name = "ProfessorServlet", urlPatterns = {"/ProfessorServlet"})
public class ProfessorServlet extends HttpServlet {    
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String acao = request.getParameter("acao");
        Professor p = null;
        
        if ("AdicionaProfessor".equals(acao)) {
            String nome = request.getParameter("nome");
            int  sala = Integer.parseInt(request.getParameter("sala"));
            String turma = request.getParameter("turma");
            p = new Professor();
            p.setNome(nome);
            p.setSala(sala);
            p.setTurma(turma);

            ProfessorDao pdao = new ProfessorDao();
            pdao.adicionar(p);
            RequestDispatcher rd = request.getRequestDispatcher("jsp/listar.jsp");
            rd.forward(request, response);
        }
    }
}

Estou com problemas p/ fazer o Glassfish levar em consideração o web.xml aqui. Experimente fazer da forma acima.

 

UPDATE: Mesmo que Professor não tenha ID, o campo no banco de dados é gerado automaticamente. O problema é você não definir um setter/getter para ID em Professor (objeto Java) e querer identificar o registro p/ alteração no banco. O resto dos campos muito provavelmente não pode ser considerado chave composta. Por isso é necessário você declarar o atributo id no Professor.

 

É ruim manter os SQLs espalhados pelo código principal. Por isso criou-se esse padrão do Data Access Object, que encapsula a lógica de acesso ao banco. Dessa forma, os servlets se preocupariam apenas com a lógica de negócio, delegando a tarefa de salvar os dados aos DAOs. Os JavaBeans, as classes com os getters e setters, são os Transfer Objects. Você pode ler sobre isso aqui: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

 

Uma coisa que vale a pena acrescentar. Você está usando SQL no Java diretamente. E também criou a tabela na mão no banco. O uso de objetos (transfer objects como referenciado no documento da oracle) p/ representar a tabela e encapsular os dados começa a ficar interessante quando se usa frameworks como Hibernate:

 

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch01.html#tutorial-firstapp-firstclass

Repare que a classe é um JavaBean normal, com a mesma cara da tua classe Professor.

 

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch01.html#tutorial-firstapp-workingpersistence

Note que as operações são realizadas com um transfer object, ao invés de se passar os atributos fragmentados.

 

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch05.html#mapping-declaration

Aqui as coisas mudam, porque dentro da classe Java você consegue mapear constraints, colunas no banco, relações e, caso você esteja utilizando o Hibernate Validator (http://hibernate.org/validator/)%C2'> regras de domínio diretamente associadas ao campo, ao invés de ficar fazendo um monte de if no código.

Editado por _Isis_

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é você não definir um setter/getter para ID em Professor (objeto Java) e querer identificar o registro p/ alteração no banco.

 

Sim. Mas o meu problema de lógica esta exatamente aí!

 

Eu tenho 2 classes Professor:

 

uma no pacote src.models (apenas com os atributos e métodos getAtributo())

uma no pacote src.dao (apenas com os métodos)

 

A classe que esta no pacote models, eu uso para criar os objetos (pelo construtor) e chamar a do pacote src.dao para acessar o banco e gravar. O que eu acho que fica uma coisa meio que estranha!

 

Mas nesse caso, como o field "id" da tabela Professor é auto_incremente, eu NÃO acrescentei ele à abstração da Classe Pessoa. Nesse caso, basta gravar no banco que "id" gera sozinho.

 

Mas é aií que mora o problema: Após gravado, se eu quiser alterar o nome da pessoa por exemplo semana que vem, não tenho mais o objeto na memória e sim no banco. E, se para alterar, precisarei pegar o Professor no banco e criar um objeto, se eu não tenho o atributo id na classe, como guardarei em memória esse "id" que veio do banco para depois que alterar os dados no formulário de alteração e dar um Post no form, eu receber esse "id" para comparar no banco?

 

".UPDATE ........WHERE id=?"

 

Desculpe a réplica mas é que não entendi muito bem sua resposta!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Outra coisa.


Quando você faz no ultimo bloco de código que você postou!


.........
Professor tmp = new Professor();
tmp.setId(rs.getLong("id"));
........


Como fazer



tmp.setId(rs.getLong("id"));


Se o objeto tmp da Classe Professor NÃO possui id como atributo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

A classe que esta no pacote models, eu uso para criar os objetos (pelo construtor) e chamar a do pacote src.dao para acessar o banco e gravar. O que eu acho que fica uma coisa meio que estranha!

 

É um padrão de projeto. O que é estranho nisso?

Você está separando a representação do objeto (o seu modelo, com os getters e setters) do acesso ao banco (dao).

 

 

 

 

Mas é aií que mora o problema: Após gravado, se eu quiser alterar o nome da pessoa por exemplo semana que vem, não tenho mais o objeto na memória e sim no banco. E, se para alterar, precisarei pegar o Professor no banco e criar um objeto, se eu não tenho o atributo id na classe, como guardarei em memória esse "id" que veio do banco para depois que alterar os dados no formulário de alteração e dar um Post no form, eu receber esse "id" para comparar no banco?

 

O seu objeto (modelo) precisa ter o atributo id junto com o get/set p/ fazer isso. Quando do dao faz o select * from professor o id vem junto e você tem que criar o objeto com o id vindo do banco. É simples.

 

 

 

 

Se o objeto tmp da Classe Professor NÃO possui id como atributo?

 

 

Novamente, ele precisa ter esse atributo. Se nenhum dos demais campos identifica unicamente o registro, a única coisa que sobra é o id, que é chave primária na tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto ao padrão de projeto eu entendi e concordo plenamente. Esta correto!

 

Mas quanto ao gravar no banco uma coisa ainda não ficou clara!

 

Se o id é o banco quem vai escolher na hora da inserção (auto_increment), você esta me sugerindo que no momento da criação do objeto, isto é, após dar um post (submit) no formulário de Cadastro de professor por exemplo, e chegar no servlet que pegará os dados vindo do formulário para criar o Objeto da Professor populando seus atributos com os dados que vem do formulário de cadastro, quando chegar no atributo "id" que não é escolhido pelo usuario pois é auto incrementado no banco, quer dizer que deveria fazer uma pesquisa no banco para saber qual o ultimo "id" gravado na tabela do MySQL na base de dados (mysql_insert_id() do php hehehe), e preencher com ele o atributo "id" do Objeto criado da classe Professor.

 

É isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca vi gente pegando id antes de inserir um registro novo no banco. Imagino que seja por problemas de concorrência. O container mantém um pool de Servlets que respondem a cada requisição. O banco também mantém um pool de conexões. Se você tiver 2 requisições que obtem o mesmo id do banco (o último inserido, suponha id=5) e sabendo que a execução da app pode ser entrelaçada (http://www.answers.com/Q/What_is_interleaved_execution_of_program), uma situação possível é ter as duas requisições criando objetos diferentes com o mesmo id=6 dentro dos Servlets. De uma forma simplificada, quem obter o primeiro acesso de escrita ao banco, insere o dado corretamente, fazendo com que o próximo id válido p/ inserção seja 7. Mas a segunda requisição está com o objeto contendo id=6. Isso vai dar pau na hora de inserir, já que a PK é UNIQUE.

 

P/ inserção de registro novo você não precisa definir o id do objeto dentro do Servlet.

P/ editar um registro você já vai ter que pesquisar por algum campo. Então retorne o id na consulta ao banco e preencha via Dao p/ passar p/ o Servlet.

Supondo que os professores sejam identificáveis pelo cpf, que não é gerado pelo banco, mas deve ser único,chave primária e NOT NULL, você teria que ler do banco o que já foi inserido e atribuir p/ que o usuário realize a alteração via formulário. É a mesma coisa com o id. A única diferença é que ele é gerado pelo banco. Não entendo onde está o problema. Se a classe não tem id, coloque.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok. Veja

 

Classe Pessoa =>: id, nome, login, senha, dataCadastro, status

Classe Professores extends Pessoa => sala
Classe Alunos extends Pessoa => email
O professor não requer e-mail pois será o administrador quem vai o cadastrar. E esses professores realmente são ente simples e não tem e-mail. São professores de sala de Escola Bíblica Dominical de Igreja simples!
Mas os usuarios (Classe Usuarios) do site são as pessoas que vão entrar e vão deixar perguntas nas salas para que os respectivos professores possam responder.
Então criei um "id" no MySQL e na Classe Pessoa para identificar Professor e Aluno.
Acho que dessa forma não haverá saída. O jeito será mesmo consultar o último id cadastrado antes de cadastrar o novo professor! No caso de alunos (usuarios) eles mesmos se cadastram no site!
Salvo se eu não entendi sua explicação!
Acho que nesse caso,

Compartilhar este post


Link para o post
Compartilhar em outros sites

De novo: não é necessário consultar id antes de inserir um novo registro. Você não preenche isso na mão. Leia o que eu falei no post anterior. A única vez em que você vai preencher esse campo no objeto -- salvo quando vier nos parâmetros da requisição -- é quando fizer busca no banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é. Mas é ai que não estou entendendo sua explicação!

 

Pelo que dá para entender, não terei uma classe modelo para cadastrar no Professor.

 

Apenas do formulário html vai direto pro banco MySQL assim como se faz no php estruturado.

 

Na edição, aí sim terei uma classe completa com atributos e métodos incluindo o atributo "id".

 

Seria isso?

 

Porque não, Na hora do INSERT no banco, o que eu faria com o "id" que NÃO existe na classe?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Banco de dados básico.
Você inclui esse id na classe professor porque você precisa dele pra alteração, não pra inserção. Consegue entender isso? Na inserção você não mexe nesse id, você deixa ele quieto. Você nem define ele porque não é o seu trabalho.

 

Se a classe professor não tem Id, você cria um campo id na classe porque você vai precisar identificar os registros p/ alteração e remoção.

public class Pessoa {
   private Long id;
   private String nome;
   private String CPF;
   // getters e setters
}
 
 
public class Professor extends Pessoa {
   private String sala;
 
   public void setSala(String sala) {
       this.sala = sala;
   }
 
   public String getSala() {
      return this.sala;
   }
}

Tabelas:

Pessoa: (ID, NOME, CPF)

Professor: (ID, NOME, CPF, SALA)

public class PessoDao {
   public getConnection() {
       return DriverManager.getConnection("jdbc:mysql://localhost/database" ,  "mysql", "mysql");
   }

  public void inserir(Pessoa p) {
     String sql = "insert into pessoa values (?,?)";
     PreparedStatement stmt = getConnection().prepareStatement(sql);
     /* Não tem que colocar nenhum id dentro do objeto em memória. */
     stmt.setString(1, p.getNome());
     stmt.setString(2, p.getCPF());
     stmt.execute();
     stmt.close()
  }
 
  public List<String> listar() {
      List<String> lista = new ArrayList<String>();
      String sql = "select * from pessoa";
      PreparedStatement stmt = getConnection().prepareStatement(sql);
      ResultSet resultados = stmt.executeQuery();
 
      while (resultados.next()) {
           Pessoa p = new Pessoa();
           /* Aqui se pega o id do banco porque você vai ter que identificar o registro p/ alterar e excluir. */
           p.setId(resultados.getLong("id"));
           p.setNome(resultados.getString("nome"));
           p.setCPF(resultados.getString("cpf"));
           lista.add(p);
      }
      stmt.close();
      return lista;
   }
 
   public List<String> pesquisarPorCPF(String CPF) {
      List<String> lista = new ArrayList<String>();
      String sql = "select * from pessoa where cpf = '?'";
      PreparedStatement stmt = getConnection().prepareStatement(sql);
      stmt.setString(1, CPF);
      ResultSet resultados = stmt.executeQuery();
 
      while (resultados.next()) {
           Pessoa p = new Pessoa();
           p.setId(resultados.getLong("id"));
           p.setNome(resultados.getString("nome"));
           p.setCPF(resultados.getString("cpf"));
           lista.add(p);
      }
      stmt.close();
      return lista;
   }
 
 
   public void remover(Long id) {
      String sql = "delete from pessoa where id = ?";
      PreparedStatement stmt = getConnection().prepareStatement(sql);
      stmt.setLong(1, id);
      stmt.execute();
      stmt.close();
   }
}

 

public class ProfessorDao {
   public getConnection() {
       return DriverManager.getConnection("jdbc:mysql://localhost/database" ,  "mysql", "mysql");
   }

  public void inserir(Professor p) {
     String sql = "insert into professor values (?,?,?)";
     PreparedStatement stmt = getConnection().prepareStatement(sql);
     /* Não tem que colocar nenhum id dentro do objeto em memória. */
     stmt.setString(1, p.getNome());
     stmt.setString(2, p.getCPF());
     stmt.setString(3, p.getSala());
     stmt.execute();
     stmt.close()
  }
 
  public List<String> listar() {
      List<String> lista = new ArrayList<String>();
      String sql = "select * from professor";
      PreparedStatement stmt = getConnection().prepareStatement(sql);
      ResultSet resultados = stmt.executeQuery();
 
      while (resultados.next()) {
           Professor p = new Professor();
           /* Aqui se pega o id do banco porque você vai ter que identificar o registro p/ alterar e excluir. */
           p.setId(resultados.getLong("id"));
           p.setNome(resultados.getString("nome"));
           p.setCPF(resultados.getString("cpf"));
           p.setSala(resultados.getString("sala"));
           lista.add(p);
      }
      stmt.close();
      return lista;
   }
 
   public List<String> pesquisarPorCPF(String CPF) {
      List<String> lista = new ArrayList<String>();
      String sql = "select * from professor where cpf = '?'";
      PreparedStatement stmt = getConnection().prepareStatement(sql);
      stmt.setString(1, CPF);
      ResultSet resultados = stmt.executeQuery();
 
      while (resultados.next()) {
           Professor p = new Professor();
           p.setId(resultados.getLong("id"));
           p.setNome(resultados.getString("nome"));
           p.setCPF(resultados.getString("cpf"));
           p.setSala(resultados.getString("sala"));
           lista.add(p);
      }
      stmt.close();
      return lista;
   }
 
 
   public void remover(Long id) {
      String sql = "delete from professor where id = ?";
      PreparedStatement stmt = getConnection().prepareStatement(sql);
      stmt.setLong(1, id);
      stmt.execute();
      stmt.close();
   }
}

Eu estou falando a mesma coisa desde o início do tópico. Pegue o código, faça desse jeito e observe. Não invente. Você não envia id p/ o banco p/ inserir um registro novo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar um pouco mais tarde com calma.

 

Mas me responde só ais uma coisa:

 

Você criou uma classe Pessoa com o atributo iD.

 

Mas não fez setId() para ela. Ou seja, na hora de criar o objeto para inserção na base dados, o objeto (embora tenha o atributo id_ vai ser criado sem valor para esse atributo.

 

Isso não da nenhum problema?

 

Fiz um zip do sisteminha e coloquei em:

 

http//www.funerariasaopedro.net.br/imwsaogotardo.zip

 

Se puder dar uma olhada agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Mas não fez setId() para ela. Ou seja, na hora de criar o objeto para inserção na base dados, o objeto (embora tenha o atributo id_ vai ser criado sem valor para esse atributo.

Como a _Isis_ disse:

 

 

Eu estou falando a mesma coisa desde o início do tópico. Pegue o código, faça desse jeito e observe. Não invente. Você não envia id p/ o banco p/ inserir um registro novo.

Configure no banco de dados o campo id pra ser auto incrementável ou utilizar sequenciais. https://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você criou uma classe Pessoa com o atributo iD.

Mas não fez setId() para ela. Ou seja, na hora de criar o objeto para inserção na base dados, o objeto (embora tenha o atributo id_ vai ser criado sem valor para esse atributo.

Isso não da nenhum problema?

 

Não. Não dá. Se desse eu não diria p/ você fazer desse jeito.

 

Não se define id ao salvar registro novo porque quem determina o id do registro é o banco, já que é um dado autoincrementável:

 

CREATE TABLE professor

(

id int(3) NOT NULL AUTO_INCREMENT,

nome varchar(200) NOT NULL DEFAULT '',

login varchar(10) NOT NULL DEFAULT '',

senha varchar(10) NOT NULL DEFAULT '',

dataCadastro date NOT NULL DEFAULT '0000-00-00',

sala int(1) NOT NULL DEFAULT '0',

status char(1) NOT NULL DEFAULT '',

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

 

 

O objeto em memória (dentro da JVM) apenas recupera o id do banco p/ poder identificar o registro dentro da aplicação, já que nenhum dos demais campos é uma chave primária.

 

http://www.guj.com.br/39526-erro-ao-cadastrar-servlet-ao-banco-de-dados

http://blogedsonbelem.com.br/artigos/java/15/java_15.html

Compartilhar este post


Link para o post
Compartilhar em outros sites
Se puder me ajudar agradeço. Porque é bastante difícil de entender para quem está no be-a-bá ainda!


Tenho a classe Professor que tem um atributo sala do tipo inteiro. Gostaria que fosse um objeto e não um inteiro. Mas para isso preciso de implmentar um método para criar esse objeto Sala e esse método pediria um parâmetro inteiro que viria do formulário de cadastro como o "id" da sala pega na base de dados então retorna o nome, o id e dataCadastro e então posso criar o Objeto.


chegue a fazer uma classe só para isso:


package dao.sala;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import util.Conexao;

public class ListaSala
{
Connection conexao = null;

public ListaSala()
{
conexao = Conexao.getConnection();
}

public String getNomeSala(int _id)
{
String sala = null;
try
{
PreparedStatement pesquisaSala = conexao.prepareStatement("select nome from sala where id = ?");
pesquisaSala.setInt(1, _id);
ResultSet ls = pesquisaSala.executeQuery();
sala = ls.getString("nome");
return sala;

} catch (SQLException e) {
e.printStackTrace();
return sala;
}

}

}

Mas na hora de pegar no jsp o nome via <jsp:useBean, retorna erro.

Me ajuda a pegar onde errei?

Segue o código do jsp

Quandol faço


${nomeSala.getNomeSala(${professores.sala})}

No lugar de


${professores.sala}

Dá erro


<div id="indexMeio">

<jsp:useBean id="listaDeProfessores" class="dao.professor.ListaProfessores" />
<jsp:useBean id="nomeSala" class="dao.sala.ListaSala" />

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:if test="${listaDeProfessores.getListaProfessores().isEmpty()}">Sem Registro<br /></c:if>
<c:if test="${!listaDeProfessores.getListaProfessores().isEmpty()}">Tem Registro<br /></c:if>


<table style="border-collapse: collapse;border: 1px solid; text-align:center">
<tr style="background-color:#000; color:#FFF">
<th style="padding:3px;width:200px;height:50px;text-align:center;">NOME</th>
<th style="padding:3px;width:100px;height:50px;text-align:center;">LOGIN</th>
<th style="padding:3px;width:100px;height:50px;text-align:center;">INCLUSÃO</th>
<th style="padding:3px;width:200px;height:50px;text-align:center;">SALA</th>
<th style="padding:3px;width:100px;height:50px;text-align:center;">EDITAR</th>
<th style="padding:3px;width:100px;height:50px;text-align:center;">TROCAR SENHA</th>
<th style="padding:3px;width:100px;height:50px;text-align:center;">BLOQ/DESBLOQ</th>
<th style="padding:3px;width:100px;height:50px;align:center;">EXCLUIR</th>
</tr>

<c:set var="lista" value="${listaDeProfessores.getListaProfessores().isEmpty()}" />
<c:choose>
<c:when test="${lista == true}">
<tr>
<td colspan=8 style="padding:3px;width:200px;height:30px;text-align:center;">Não há registros!</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${listaDeProfessores.getListaProfessores()}" var="professores">

<c:if test="${professores.status=='b'}">
<c:set var="status" value="d" />
<c:set var="imgEdicao" value="desbloquear.png" />
</c:if>
<c:if test="${professores.status=='d'}">
<c:set var="status" value="b" />
<c:set var="imgEdicao" value="bloquear.png" />
</c:if>

<tr>
<td style="padding:3px;width:200px;height:30px;text-align:left;">${professores.nome}</td>
<td style="padding:3px;width:100px;height:30px;text-align:left;">${professores.login}</td>
<td style="padding:3px;width:100px;height:30px;text-align:center;">${professores.dataCadastro}</td>
<td style="padding:3px;width:200px;height:30px;text-align:left;">${professores.sala}</td>
<td style="padding:3px;width:100px;height:30px;text-align:center;"><a href="editar.jsp?acao=form&id=${professores.id}"><img src="_img/editar.png" style='height: 30px'/></a></td>
<td style="padding:3px;width:100px;height:30px;text-align:center;"><a href="senha.jsp?acao=form&id=${professores.id}"><img src="_img/senha.png" style='height: 30px'/></a></td>
<td style="padding:3px;width:100px;height:30px;text-align:center;"><a href="ProfessorServlet?acao=BloqueiaProfessor&status=${status}&id=${professores.id}"><img src="_img/${imgEdicao}" style='height: 30px' /></a></td>
<td style="padding:3px;width:100px;height:30px;text-align:center;"><a href="ProfessorServlet?acao=ExcluiProfessor&id=${professores.id}"><img src="_img/excluir.png" style='height: 30px'/></a></td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</div>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.