Tem como um método retornar um Objeto?

Salve, pessoal do GUJ!

Estou começando com o Java(e, concomitantemente, estou começando com a OO), mas várias dúvidas vêm me assombrando. Uma delas é a seguinte: Há alguma maneira de fazer um método retornar um Objeto ?
Para ser mais específico, esse meu método vai pertencer a um objeto que se encarregará de fazer a conexão, busca, inserção , … , com o BD. No caso, ele irá fazer a busca do elemento desejado no BD e deverá retorná-lo, caso o encontre. Por isso pensei que o retorno desse meu método, caso fosse um objeto, facilitaria muito a minha vida.
Dei uma lida na internet e cheguei a pensar que isso envolve algo referente a ORM (object-relational mapping), ou eu estou fazendo muita confusão ?

Agradeço a atenção de todos vocês.
:wink:

[quote=shin_chan]Salve, pessoal do GUJ!

Estou começando com o Java(e, concomitantemente, estou começando com a OO), mas várias dúvidas vêm me assombrando. Uma delas é a seguinte: Há alguma maneira de fazer um método retornar um Objeto ?
Para ser mais específico, esse meu método vai pertencer a um objeto que se encarregará de fazer a conexão, busca, inserção , … , com o BD. No caso, ele irá fazer a busca do elemento desejado no BD e deverá retorná-lo, caso o encontre. Por isso pensei que o retorno desse meu método, caso fosse um objeto, facilitaria muito a minha vida.
Dei uma lida na internet e cheguei a pensar que isso envolve algo referente a ORM (object-relational mapping), ou eu estou fazendo muita confusão ?

Agradeço a atenção de todos vocês.
:wink:[/quote]

Sim, você pode retornar um objeto através de um método!
A declaração do método transcorreria da seguinte maneira: (escopo do método) (valor de retorno) (nome do método) b[/b]. Sendo assim, um método pode ter as seguintes assinaturas:

private int somarValores(int primeiroValor, int segundoValor);
public List<String> listarNomesAlunos();
protected void acionarBotaoConcluir(ActionEvent evento);

Suponhamos que você queira retornar o objeto Aluno, listado aqui abaixo:

public class Aluno
{
   private int codigo;
   private String nome;

   // Getters e Setters omitidos...
}

Para criar um método que retorne um objeto, podemos fazer da seguinte maneira:

public Aluno retornarAluno()
{
   Aluno aluno = new Aluno();
   aluno.setCodigo(1);
   aluno.setNome("Zé das Couves");

   return aluno;
}

Através dele, se retorna um objeto Aluno, que você usar onde quiser!
Agora, como você quer carregar do banco de dados, podemos fazer da seguinte maneira:

public Aluno retornarAluno(int codigo, Connection connection) throws Exception
{
   String query = String.format("Select * From Alunos Where Codigo = %s", codigo);
   PreparedStatement statement = connection.prepareStatement(query);
   ResultSet result = statement.executeQuery();
   
   Aluno aluno = null;
   if (result != null)
   {
      aluno = new Aluno();
      if (result.next())
      {
         aluno.setCodigo(result.getInt("Codigo"));
         aluno.setNome(result.getString("Nome"));
      }
   }

   result.close();
   statement.close();

   return aluno;
}

Basicamente por aí!
Espero ter ajudado, abraços!!

1 curtida

Desse jeito fica fácil aprender java, hein ?

Nicolas, muito obrigado por esclarecer a minha dúvida.
Solucionou com perfeição o problema que eu tinha.

Edit: Para aproveitar o embalo, qual a diferença da Classe Statement e da PreparedStatement ?

[quote=shin_chan]Salve, pessoal do GUJ!

Estou começando com o Java(e, concomitantemente, estou começando com a OO), mas várias dúvidas vêm me assombrando. Uma delas é a seguinte: Há alguma maneira de fazer um método retornar um Objeto ?
Para ser mais específico, esse meu método vai pertencer a um objeto que se encarregará de fazer a conexão, busca, inserção , … , com o BD. No caso, ele irá fazer a busca do elemento desejado no BD e deverá retorná-lo, caso o encontre. Por isso pensei que o retorno desse meu método, caso fosse um objeto, facilitaria muito a minha vida.
Dei uma lida na internet e cheguei a pensar que isso envolve algo referente a ORM (object-relational mapping), ou eu estou fazendo muita confusão ?

Agradeço a atenção de todos vocês.
:wink:[/quote]
Boa noite shin_chan , eu acharia melhor ao invés de retorna um objeto aluno com os dados do aluno no banco, eu preferería retorna uma lista com os dados dos alunos, ou do aluno em si, o que vc acha??

Anderson, no caso uma lista de objetos do tipo Object ?

Não uma lista do tipo alunos, contendo todos os dados do aluno.

A classe PreparedStatement permite que você passe parâmetros pra sua consulta. É preferível utiliza-la no lugar do Statement, mas não da forma que o Nicolas fez, e sim, assim:

public Aluno retornarAluno(int codigo, Connection connection) throws SQLException //Nunca lance "Exception"
{
   PreparedStatement statement = null;
   ResultSet result = null;

   try {
      statement = connection.prepareStatement("SELECT * FROM Alunos WHERE Codigo = ?");
      statement.setInt(1, codigo); //Aqui definimos o valor e o tipo dele
      resul = statement.executeQuery();
   
      if (result.next())
      {
         Aluno aluno = new Aluno();
         aluno.setCodigo(result.getInt("Codigo"));
         aluno.setNome(result.getString("Nome"));
         return aluno;
      }
   } finally {      
      if (result != null) result.close();
      if (statement != null) statement.close();
   }

   return null;
}

Corrigi algumas coisinhas no código dele:

  1. Usei o parâmetro do PreparedStatement. Isso tem diversas vantagens:
    1.1. Você não precisa se incomodar com o formato de datas;
    1.2. Você não precisa escrever aspas simples para Strings. Isso evita também que o código dê pau caso a String do seu usuário tenha uma aspas simples dentro. (Com um nome = Jeff’s, por exemplo)
    1.3. Impede que alguém faça o ataque de SQL injection;
    1.4. Torna o código mais portável;
  2. Lancei a exception correta e mais específica. É um erro grave lançar “Exception”: http://blog.caelum.com.br/2006/10/07/lidando-com-exceptions/
  3. Fechei o ResultSet e o Statement num finally. Isso garante que não ficarão abertos após a execução. O ideal seria fechar a conexão também, mas isso não é eficiente sem usar um Pool de conexões.
  4. Retirei um if inútil, já que o executeQuery nunca retorna null, não é necessário testar se o resultset é diferente de nulo na linha 8.
1 curtida

ViniGodoy, eu não tenho nem palavras para descrever a ajuda que você me deu.
Conseguiu iluminar bastante o meu pensamento.

Obrigado!
:wink: