Sugestões para essa classe que eu estou desenvolvendo!

20 respostas
anjomal

Galera estou desenvolvendo uma classe que não e nehum framework(não pro enquanto) e simplismente uma classe para contornar o problema que o MySQL possui em relacionamentos e etc ... e de quebra botar minha aplciação OO, mais estou com umas duvidas em ums pontos ... to postando o codigo fonte aqui desculpe-me a porqueira(Codigo feito as pressas) ele e GPL então podem copiar :D, ele tem o intuito de fazwer o seguinte, Criar chaves primarias e estrangeiras para a tabela e fazer atualizações em cascatta nas tabelas relacionadas a ela. a classe e bem simples olhem deem suas opiniões no final vamos ter uma classe muito boa !!!!

ESPIRITO GPL PESSOAL !!!!!

Segue a baixo a classe Database:
package sicla.sgbd;

import javax.swing.JOptionPane;
import java.sql.*;


/**
 * @author William Jammes de Oliveira
 * @version 1.0
 *
 * Modulo: Gerenciador do Banco de Dados
 * Data: 20/11/2002
 * Alteração:
 */

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, Pass); 
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
		}
	}		

    // Retorna a conexão atual
   public Connection getConn() {
       return conn;
   }
   
   //Retorna uma instancia de DB 
   public static Database getDataBase() { 
      if (db == null) { 
          db = new Database("localhost", "sicla", "root", "4991rs97");
      } 
      return db;
   } 
   
   public Statement getStatement() throws SQLException {

	return conn.createStatement();
 	
   }
   
   public PreparedStatement getPreparedStatement(String SQL) throws SQLException {
   	
   	return conn.prepareStatement(SQL);
   	
   }

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

Esta e a classse Tabela:

package sicla.sgbd;

/*
 *
 * Modulo: TbUsuarios
 * Descrição: Tabela de controle dos usuarios
 *
 * Created on 7 de Janeiro de 2003, 14:35
 */


/**
 * @author  William Jammes de Oliveira
 */

import java.sql.*;
import java.math.*;

class PrimaryKey {
    private int PKey = 0;
    private Object Tabela = null;    

    public PrimaryKey(int FKey) {
        this.PKey=PKey;        
    }

    public void setKey(int PKey) {
        this.PKey=PKey;
    }   

    public int getKey() {
        return this.PKey;
    }   
    
}

class ForeingKey {    
    private int FKey = 0;
    private PrimaryKey[] PKey;
    private Object Tabela = null;    
    
    public ForeingKey(int FKey, Tabela Relacionamento) {
        this.FKey=FKey;
        this.Tabela=Tabela;
        this.PKey=Relacionamento.getPrimaryKey();
    }

    public void setPrimaryKey(PrimaryKey[] PKey) {
        this.PKey = PKey;
    }
    
    public void setKey(int FKey) {
        this.FKey=FKey;
    }
    
    public void setTabela(Object Tabela) {
        this.Tabela=Tabela;
    }
}

public class Tabela {
    
    public static final int INT     =0;
    public static final int LONG    =1;
    public static final int STRING  =2;
    
    private Connection conn = null;
    private ResultSet rs = null;
    private PreparedStatement ps = null;
    private String NomeTabela = "";
    private String[] SQL;
    
    private PrimaryKey[] PKey; 
    private ForeingKey[] FKey; 
    
    /** Creates a new instance of TbUsuarios */
    
    public Tabela(Connection conn, String NomeTabela ,String[] SQLs) {
        this.conn = conn;
        this.SQL = SQLs;
        this.NomeTabela = NomeTabela;
        
        try {
          this.getRegistros();
        }catch(SQLException e){javax.swing.JOptionPane.showMessageDialog(null,e.toString());} 
    }
    
    public boolean next() {
        try {
            rs.next();
        }catch(SQLException e){return false;}
        
        return true;
        
    }
    
    public boolean previous() {
        try {
            rs.previous();
        }catch(SQLException e){return false;}
        
        return true;
        
    }
    
    public boolean first() {
        try {
            rs.first();
        }catch(SQLException e){return false;}
        
        return true;
        
    }
    
    public boolean last() {
        try {
            rs.last();
        }catch(SQLException e){System.out.println(e.toString());}
        
        return true;
        
    }

    public void setPrimaryKey(PrimaryKey[] PKey) {
        this.PKey = PKey;
    }
    
    public void setForeingKey(ForeingKey[] FKey) {
        this.FKey = FKey;
    }

    public PrimaryKey[] getPrimaryKey() {
        return this.PKey;
    }

    public ForeingKey[] getForeingKey() {
        return this.FKey;
    }


    public ResultSet getRegistros() throws SQLException {
        //Statement stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);        
        Statement stm = conn.createStatement();                
        rs = stm.executeQuery(SQL[0]);
        
        return rs;
    }
    
    public ResultSet getRegistros(String SQL) throws SQLException {
        Statement stm = conn.createStatement();
        rs = stm.executeQuery(SQL);
        
        return rs;
    }
    
    public long getGenerator(int coluna, int tipo) {
        long retorno=0;
        
        try {             
            rs.last();
        }catch(SQLException e){
           javax.swing.JOptionPane.showMessageDialog(null,"1:" + e.toString());
           return (retorno+1);
        }        
            
        try{    
            switch(tipo) {
                case 0:                    
                    retorno=(long)rs.getInt(coluna);
                    break;
                case 1:
                    retorno=rs.getLong(coluna);
                    break;
            }         
                        
        }catch(SQLException e){
           javax.swing.JOptionPane.showMessageDialog(null,"2:" + e.toString());
           return (retorno+1);
        }        
        
        return (retorno+1);

    }
    
    public boolean insert() {
        try {        
            ps = conn.prepareStatement(SQL[1]);
        }catch(SQLException e){return false;}
        
        return true;
    }
    
    public boolean edit() {
        try {
            ps = conn.prepareStatement(SQL[2]);
        }catch(SQLException e){return false;}
        
        return true;
    }
    
    public boolean remove() {
        try {

            for(int i=0;i<this.PKey.length;i++) {
                this.set(this.PKey[i].getKey(),rs.getInt(this.PKey[i].getKey()));
            }
            
            ps = conn.prepareStatement(SQL[3]);
        }catch(SQLException e){return false;}
        
        return true;
    }
    
    public boolean update() {
        try {
            ps.execute();
        }catch(SQLException e){return false;}
        
        return true;
    }
    
    public boolean cancel() {
        try {
            ps = null;
        }catch(NullPointerException e){return false;}
        
        return true;
    }
    
    public boolean set( int coluna , Object valor ){
        try {
            ps.setObject(coluna,valor);
        }catch(SQLException e){return false;}
        
        return true;        
    }
    
     public boolean setNull(int coluna, int Tipo) {
        try {
            ps.setNull(coluna, Tipo);
        }catch(SQLException e){return false;}
        
        return true;                        
        
    }

    public boolean set( int coluna , int valor ){
        try {
            ps.setInt(coluna, valor);            
        }catch(SQLException e){return false;}
        
        return true;                
    }    
    
    public boolean set( int coluna , double valor ){
        try {
            ps.setDouble(coluna, valor);
        }catch(SQLException e){return false;}
        
        return true;                        
    }
    
    public boolean set( int coluna , long valor ){
        try {
            ps.setLong( coluna, valor);
        }catch(SQLException e){return false;}
        
        return true;                                
    }

   public boolean set( int coluna , String valor ){
        try {
            ps.setString( coluna, valor);
        }catch(SQLException e){return false;}
        
        return true;                                
    }

    public boolean set( int coluna , float valor ){
        try {
            ps.setFloat( coluna, valor);
        }catch(SQLException e){return false;}
        
        return true;                                  
    }    

    public boolean set( int coluna , BigDecimal valor ){
        try {
            ps.setBigDecimal(coluna, valor);
        }catch(SQLException e){return false;}
        
        return true;                                  
    }    

    public Object getObject(int coluna) throws SQLException {
         return rs.getObject(coluna);
    }

    public int getInt(int coluna) throws SQLException {
         return rs.getInt(coluna);
    }  
    
    public double getDouble(int coluna) throws SQLException {
         return rs.getDouble(coluna);
    }      

    public long getLong(int coluna) throws SQLException {
         return rs.getLong(coluna);
    }      

    public String getString(int coluna) throws SQLException {
         return rs.getString(coluna);
    }      

    public float getFloat(int coluna) throws SQLException {
         return rs.getFloat(coluna);
    }      

    public BigDecimal getBigDecimal(int coluna) throws SQLException {
         return rs.getBigDecimal(coluna);
    }      

}
As classes que herdam tabela implementao seus campos assim:
package sicla.sgbd;

/*
 * 
 * Modulo: TbUsuarios
 * Descrição: Tabela de controle dos usuarios 
 *
 * Created on 7 de Janeiro de 2003, 14:35
 */


/**
 * @author  William Jammes de Oliveira
 */

import java.sql.*;
import java.security.*;

public class TbUsuarios extends Tabela {    
       
    public int CODIGO         = 0;          
    public int NOME           = 1;    
    public int PASSWD         = 2;    
    public int MODULO         = 3;    
    public int ACESSO         = 4;
    
    private static final String[] SQLs={"SELECT * FROM TBUSUARIOS","INSERT INTO TBUSUARIOS (CODIGO, NOME, PASSWD, MODULO, ACESSO) VALUES (?,?,?,?,?)","UPDATE TBUSUARIOS SET CODIGO=?, SET NOME=?, PASSWD=?, MODULO=?, ACESSO=? WHERE CODIGO=?","DELETE FROM TBUSUARIOS WHERE CODIGO=?"};
    private static final String TABELA = "TBUSUARIOS";
   
    /** Creates a new instance of TbUsuarios */    
    
    
    public TbUsuarios() {
        super(Database.getDataBase().getConn(),TABELA , SQLs);        
        
        PrimaryKey[] pKey = {new PrimaryKey(this.CODIGO)};        
        this.setPrimaryKey(pKey);
    }   

}

Parte desse codigo tirei da ideia de um amigo aqui do GUJ o resto foi doideira minha mesmo :d esqueci seu nick, mais ele sabe quem é !!!!

falow

20 Respostas

fsamir

Olá,

é uma idéia legal mas, se eu estivesse com um problema como este, usaria outro Banco. Postgree, por exemplo.

anjomal

Mais postgree não e 100% free pois a versão para windows e paga, essa e uma solução para quem quer usar um BD free que tenha nas duas plataformas

falow
t+

Elvis.The.Pelvis

Lembre-se apenas que para aplicações “pesadas”, esta abordagem pode se tornar problemática se desempenho for um requisito importante. Tirar do banco a responsabilidade da integridade já tem um impacto significativo. Com Java e OO o impacto é maior ainda.

C

Grande anjomal!

Captei sua idéia :slight_smile: Mas a pergunta é… ela é realmente interessante para o seu caso??? Algo parecido poderia ser utilizado quando você quer manter o código o mais independente possível de uma base de dados… mas se este não for o caso… acredito que muito disto poderia ser feito diretamente na base de dados… inclusive se estiver considerando performance ;)))

O MySQL é bem rápido! Mas o preço a ser pago eh bem alto: não suporta transações, não tem lock de linhas etc. Isto poderia ser ajustado com utilização de um banco como PostgreSQL (GPL) :))))

Hah detalhe, o postgre eh free sim! mesmo pra windows!!!
Aquela versão da dbexperts não é, mas a versão oficial do www.postgresql.org roda em windows com a ajuda de um emulador lá (não sei ao certo) :wink:

anjomal

Eu sei ,mais isso e para aplicações de pequeno e medio porte, mesmo pq aplicações pesadas com MySQL, pelo menos ao meu ver não da pé elvis !!!, eu estou num projeto que pretende fazer um BD com base no Codigo fonte do FIREBIRD mais estou achando bobagem, estava pensando em um BD escrito totalmente em JAVA mais sei lá acho que tb não da pé, a BORLAND ja tentou e acho que desistiu, mais mesmo assim valew !!!, e com questão a rodar o postgree com emulador e leeeeeeeeeento que da dó :cry:

t+

guariba

Minha opinião já está em suas mãos… :lol:

R

Não é um emulador é o Cygwin http://cygwin.com/, um software da GUN que portou sua libc para windows e assim todas as aplicações com as libs da GNU como por exemplo o PostgreSQL podem ser compilados com o gcc la no Cygwin. Com isso vc terá o Postgres compilado para windos só que rodando com as libs da GNU que o Cygwin portou junto, tudo nativo.
Não sou um entendido de Cygwin mais acredito que é por aí.

C

É este mesmo peregrino!!

Anjomal, você disse que o banco ficava muito lento no windows, você chegou a fazer algum teste comparativo?? Agora é curiosidade minha mesmo… seria interessante ter um comparativo de performance no postgre entre windows/linux ;))) PRincipalmente rodando a mesma aplicação java!!!

Elvis.The.Pelvis

Recompila o PostgreSQL para windows. Você não precisa pagar nada e tbm não precisa emular.

anjomal

Eu conheço o Cygwin e ate mesmo ja testei usar postgree com ele, ja desenvolvi com postgree no LINUX/UNIXs e concordo plenamente que seu potencial e fora de serio !!! mais com Cygwin a performace do postgree fica lamentavel :cry:, e todos nos ja sabemos de cor que JAVA não e das mais rapidas linguagems, então fica uma JACA não gostei !!! mais mesmo assim velew galera !!!

t+

R

Então o problema é o Windows, usa Linux :idea: e fica tudo resolvido!

Brincadeira!!!

anjomal

E ai Richardsom firmão !!!

Rapaz se eu pudesse trocar os servidores e maquinas de meus usuarios para LINUX eu iria adorar, mais as coisas não são bem assim, tenho clientes que possuem redes WinNT, e vc pode falar … falar … não adianta !!! vc acaba perdendo cliente !!! por isso estou nessa peleja procurando por um BD estavel nas duas plataformas, pois simplismente não da pra ignorar o mercado, possui clientes com redes Win2k,winNT,Linux e Unixs. então meu BD tem de ser executado em todas.

Sentiu meu drama !!! :cry:

mais falow !!!

Rafael_Steil

Posso estar errado, mas vc nao esta reinventando a roda? isso nao seria a mesma cosia que fazer o que os frameworks de persistencia com Castor e OJB ja fazem?

Rafael

R

Amigo anjomal, eu entendo seu problema e como falei era brincadeira, e ainda mais é por isso que gostamos de Java por ser independente de SO. Mais acho que o Rafael Steil esta certo, o JDO ou então EJB com os Entity Beans fazem abstração de banco. De qualquer maneira acho legal sua iniciativa!

richardpeder

cara, que codigo complicado…na verdade, o primeiro faz a conexao com a DB em si certo? o segundo vc manipula a tabela, certo? Será que não é ruim jogar tudo nas costas do java? isso não tira a integridade do banco??? desculpa se falei besteira;;;;

Ate mais…

anjomal

Na realidade o codigo esta meio complicado sim, mais e pq não documentei ele :lol: mais irei faze-lo, na realidade isso não tira integridade do BANCO DED DADOS na reladide coloqca integridade nele… pois o mysql não possui, gente o JAVA e uma linguagem poderosa, poderiamos se quisessimos fazer um SGBD completo, na realidade os Frameworks são pesados e chieos de gordura desnecessaria, essas classe que estou fazendo, são objetivas, blz !!!

mais no mais

falow !!!

Lich_King

vc qer um banco free e multiplataforma???

jah tentou o firebird ?:idea:

Rubem_Azenha

prefiro HSQLDB

Lucas_Teixeira

anjomal:
Mais postgree não e 100% free pois a versão para windows e paga, essa e uma solução para quem quer usar um BD free que tenha nas duas plataformas

falow
t+

Opa opa opa…

(:

kuchma

anjomal:
Mais postgree não e 100% free pois a versão para windows e paga, essa e uma solução para quem quer usar um BD free que tenha nas duas plataformas

falow
t+

Se estamos falando do PostgreSQL ele nao eh “pago” para Windows. Mais informacoes: http://www.postgresql.org

Marcio Kuchma

Criado 24 de janeiro de 2003
Ultima resposta 17 de jan. de 2005
Respostas 20
Participantes 12