Qual a melhor maneira de criar aplicacao de banco de dados

Caros Amigos e Gurus do GUJ to eu aqui chato de novo fazendo perguntas meio bobas,coisa de iniciante sabe …, mais estou com o seguinte dilema estou desenvolvendo um sistema de acesso a BANCO DE DADOS e como eu venho da programação modular, agente pega ums vicios e fica meio confuso na hora de pensar em OO, bom vamos ao dilema …

EU TENHO UM JFRAME COM A JANELA DE ENTRADA DE DADOS SERA QUE EU VO TER DE FAZER A ROTINA DE CONEXÃO EM TODAS JANELAS ?

VOU TER DE FAZER UMA CLASSE PARA CADA TABELA DO MEU BANCO DE DADOS, E COLOCAR METODOS TIPO ADICIONAR E ETC …

bom meus amigos sintam se avontade para opinarem em qual melhor maneira eu devo seguir no meu projeto para que o mesmo fique rapido e mais facil de lidar …

Valew …

Oi,

Como voce esta trabalhando com uma aplicacao Cliente / Servidor que acessa constantemente uma base de dados, o ideal é abrir uma conexao logo ao iniciar a sua aplicacao e finaliza-la possivelmente em um destrutor da mesma.
Com essa conexao aberta, todas as janelas estariam fazendo o uso da mesma conexao de BD e realizando transacoes sob a mesma. Porem existem varias maneiras de voce realizar a persistencia de dados em um BD atraves de Java. Desde a programacao manual com JDBC ou SQLJ , ou ainda utilizar frameworks que ja fazem tudo isso para voce.
De uma olhada no seguinte Post do forum:
http://www.guj.com.br/forum/viewtopic.php?t=901

La estamos discutindo um pouco mais esses assuntos.

Essa minha maior duvida como estabelecer uma conexão no incicio da minha aplicação e compartilhar essa classe com minhas outras sem instancia-la em cada Classe, esse e o ponto G da questão, vc teria um exemplo para me dar ?

Obrigado t+

Posso dar uma dica?

Faça o seguinte: Crie um pacote e nele faça uma classe que irá fazer a conexao com o BD…assim

Código:


package Conexao 

public class classeConexao 
{ 
  . 
. 
. 
. 
.       <SEU CODIGO DE CONEXAO COM O BD AQUI> 

       <Dica: Crie aqui dentro um método que faz a conexao com o BD, não "jogue" a conexao dentro da classe senao depois fica dificil chamar ela em outra classe> 
. 
. 
. 
} 

Depois, digamos que vc tem a classe CadastraCliente, e tem que fazer a conexao lá…dai vc faz assim:

Código:

import Conexao.classeConexao 

public class CadastraCliente 
. 
. 
. 
. 

< vc pode criar esta classe, fazer o metodo publico, depois criar um objeto para referenciar esta classe, assim:> 

classeConexao conn = new classeConexao(); 
. 
. 
. 
} 
 

Bom, acho que a idéia eh essa, qualquer duvida, volte a postar perguntas!! Agora, manter a conexao sem estanciar nada em sua aplicação ficaria dificil…sei la, segue esta linha deraciocinio que te passei e vê se te interessa ok?

Ate mais…

A idea passada pelo Richard funcionaria bem para o seu caso.
Nessa classe conexao fosse teria todos os metodos de conexao com as bases de dados. Por exemplo, voce pode implementar um metodo que conecte no DB2, um que conecte no Oracle, um no SQLServer, etc …
Na classe que necessitar acessar a base de dados voce simplesmente importa a classe Conexao e chama o metodo desejado.
Exemplo:

import clsConexao;
.
.
.

private Connection conConexao = clsConexao.obterConexaoOracle();

Feito isso o atributo conConexao contem a conexao.

Bom espero ter ajudado.

Valew pela dica so tem um prob, bom eu ja ate mesmo criei a conexão numa classe, o que eu não queria na verdade e ter de chamar a rotina de estabelecimento de conexão com o BD a toda hora que uma determinada solicitação fosse dada como exclussões,alterações e listagens, eu queria uma conexão permanente e simplismente eu passar essa classe da conexão para a outra sem precisar de criar conexões a cada instancia da minha classe. OK

obrigado e valew …

Vc pode fazer o seguinte também: faça um extends da sua classe de conexao a sua classe que usará a conexão:

exemplo

public class CadastraCliente extends Conexao

Depois que vc fizer isso, os metodos da classe Conexao estarão “integrados” a sua classe cadastracliente, pois vc extendeu sua classe cadastra a classe de conexao, dai eh soh usar os metodos de conexao que vc tem na classe de conexao, como te disse, crie um metodo na classe conexao que faça a conexao com o BD em si ok?!

Ate mais…

Pessoal oque e melhor, eu ter uma conexão a cada classe solicitante ou eu ter uma classs statica com Singleton e chama-la dentro das classes que irão usala-la de modo que so terei uma conexão ?

Com uma classe livre mesmo sendo estendida eu terei uma conexão a cada instancia da minha classe.
Com uma classe baseada em Singleton eu terei uma conexão apenas na minha aplicação.

Pois minha duvida maior é , se eu ficar chamando metodos que realizam conexões a cada instancia, minha aplicação não vai ficar pesada ? pois toda hora vou ter de me logar no BD …

Valew pelas respostas e desculpe se eu falei besteira …
:lol:

Anjomal:

Vamos lá…acho que sua preocupação maior é se sua aplicação irá ficar pesada ou não certo?! Bom, acredito que quando vc estender sua classe a classe de conexao, vc estará “incorporando” a classe de conexão a sua classe que faz um cadastro, por exemplo. Vc tb pode dar o import como disse e tb pode criar uma classe publica e dar um new quando quiser usá-la. E complicado dizer o que vc deve fazer, sempre vc terá que chamar uma conexao com o BD, minha opinião pessoal seria vc criar uma classe publica, com um método que faz a conexao com o BD, depois vc dá um import nesta classe na classe que vc quer fazer um cadastro, por exemplo, e dar um new nela, ou seja, instanciar ela uma unica vez depois vc vai usando o objeto desta classe.
Acho que eh a melhor solução, eh a que eu uso na minha empresa e acredito que não foge muito disto nao.

Espero ter ajudado cara…

Ate mais…

Galera minha solução até agora está assim:

[code]public class Database {

private static Connection conn = null;
private static Database db = null;		

private  Database(String Host,String Db,String User,String Pass) { 

	try {
		Class.forName("org.gjt.mm.mysql.Driver");
		
	} catch (ClassNotFoundException e) {
		JOptionPane.showMessageDialog(null,e.toString());
		System.exit(1);
	}

	try {
		conn = DriverManager.getConnection("jdbc:mysql://" + Host + "/" + Db + "?user=" + User + "&password=" + Pass  );
	} catch (SQLException e) {
		JOptionPane.showMessageDialog(null,e.toString());
		System.exit(1);
	}
}		

//Retorna uma instancia de DB 

public static Database getDataBase() {
if (db == null) {
db = new Database(“localhost”, “sicla”, “root”, “4991rs97”);
}
return db;
}

public Connection retConn(){
return conn;
}

public void finalize(){
try {
conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,e.toString());
System.exit(1);
}

}
}[/code]
Oque vcs acham esta no caminho certo ???
Essa classe faz parte do pacote da minha aplicação sicla de modo que esta acessivel a toda minha aplicação, eu intscio ela em neu e depois nas minhas janelas e instancio novamente,pq ela so cria uma instacia dela, isso ta legal ou eu devo retirar o esquema de uma instancia só, e deixar ela uma classe totalmente publica e acessivel.

Se puderem me ajudar obrigado !!!

Depende o que voce entende por “uma classe totalmente publica e acessivel”, veja bem se você retirar o padrão singleton você terá diversas conexões abertas (uma para cada objeto DataBase criado, ou seja, a idéia vai por água abaixo).

Acho que seria melhor se sua classe DataBase tive-se um getStatement() ao invés de um getConnection() por exemplo, que retorna-se um statement, pois imagina uma linha como esta:

Connection c = db.getConnection();
c.close(); // !!!!!!

Qualquer um poderá dar um close() na conexão e acabar com a brincadeira!

Mais por exemplo depois de eu instaciar a classe uma vez e depois chamar um getStatement ou um getPrepareStatement, daria algun erro de conexão com BD ???

:?:

Valew t+

A princípio não, por exemplo:

public Statement getStatement() {
   return conn.createStatement();
}

logo o código que chama este método ficaria responsável por chamar o método close() no statement criado e em qualquer eventual ResultSet criado a partir daquele Statement por exemplo.

Apenas lembre-se que voce pode ter apenas um ResultSet por Statement! Logo se voce quiser criar vários ResultSets, deverá criar vários Statements!