Aplicação Java com Derby(JavaDB), Criando aplicações e Finalizando para distribuição

Galera a algumas semanas venho desenvolvendo um programa em java com banco de dados Derby, com muitos problemas, erros, e buscas no google, e aqui no guj… rs rs Fiz essa compilação que pode ajudar muito quem for tentar fazer algo parecido.

Primeiro de tudo e mais importante( Acredite!) Configuração do Ambiente e Instalação do Derby(JavaDb ou Apache)

Instalação do Derby fora de IDES

Para poder instalar o Derby, primeiro é necessário baixar o arquivo zip ou tar do Derby do site do Derby na Web.

Acesse a página http://db.apache.org/derby/derby_downloads.html utilizando o navegador Web. Esta página contém várias distribuições do Derby, incluindo pacotes instantâneos e distribuições binárias de versões estáveis. Também são encontradas informações sobre como acessar a distribuição do código ativo do Derby. As distribuições se encontram em pacotes bin, lib e src. Este guia assume que foi baixado o pacote de distribuição bin.
Extraia o pacote baixado. A instalação extraída contém vários subdiretórios:
• O subdiretório demo contém programas de demonstração.
• O subdiretório frameworks contém scripts para a execução de utilitários e configuração do ambiente.
• O subdiretório javadoc contém a documentação da api gerada a partir dos comentários do código fonte.
• O subdiretório doc contém a documentação do Derby.
• O subdiretório lib contém os arquivos jar do Derby.

Configuração do ambiente Java

É necessário configurar a variável de ambiente PATH para que a JVM e os aplicativos Java executem corretamente. Isto é extremamente importante para o sucesso da instalação, porque a variável PATH permite que o sistema operacional encontre os programas apropriados a partir de qualquer diretório.
Se houver mais de uma JVM instalada, a JVM que se deseja utilizar deve estar antes de qualquer outra na variável PATH.
Para verificar a variável de ambiente PATH:

  1. Em uma janela de comando, digite: java -version
    Se o caminho estiver definido corretamente, será exibida uma informação indicando a versão da JVM.
  2. Se o comando não retornar a versão correta da JVM, a variável PATH deve ser configurada adicionando o subdiretório bin do diretório da JVM ao começo do caminho.
    Por exemplo, se o diretório for C:\JDK1.4 , deve ser adicionado C:\JDK1.4\bin ao começo do caminho.
  3. O passo 1 deve ser repetido para haver certeza que a variável de ambiente PATH está configurada corretamente.

Instalação do Derby no Netbeans(Se o seu Netbeans não veio com o Glassfish embutido)

Ferramentas > Servidores : O GlassFish Server deve aparecer. Se não estiver aparecendo tera de instalar; Va em Adicionar Servidor… > GlassFish e siga os passos!
Trabalhando com o banco de dados
Nesse link temos algumas instruções para se trabalhar com o banco de dados na ide(https://netbeans.org/kb/docs/ide/java-db_pt_BR.html)
• Configurando o Banco de Dados
• Registrando o Banco de Dados no NetBeans IDE
• Iniciando o Servidor e Criando um Banco de Dados
• Estabelecendo Conexão com o Banco de Dados

Classes Bean e DAO:

package model.bean;
/**
 *
 * @author Marcos
 */
public class Funcionario {
    
    private String nome;
    private String email;
    private String nascimento;
    private String cpf;
    private String rg;
    private String telefone1;
    private String telefone2;
    private String cargo;
    private String formação;
    private String atributos;
    private String cargahoraria;
    private String salario;

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the nascimento
     */
    public String getNascimento() {
        return nascimento;
    }

    /**
     * @param nascimento the nascimento to set
     */
    public void setNascimento(String nascimento) {
        this.nascimento = nascimento;
    }

    /**
     * @return the cpf
     */
    public String getCpf() {
        return cpf;
    }

    /**
     * @param cpf the cpf to set
     */
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    /**
     * @return the rg
     */
    public String getRg() {
        return rg;
    }

    /**
     * @param rg the rg to set
     */
    public void setRg(String rg) {
        this.rg = rg;
    }

    /**
     * @return the telefone1
     */
    public String getTelefone1() {
        return telefone1;
    }

    /**
     * @param telefone1 the telefone1 to set
     */
    public void setTelefone1(String telefone1) {
        this.telefone1 = telefone1;
    }

    /**
     * @return the telefone2
     */
    public String getTelefone2() {
        return telefone2;
    }

    /**
     * @param telefone2 the telefone2 to set
     */
    public void setTelefone2(String telefone2) {
        this.telefone2 = telefone2;
    }

    /**
     * @return the cargo
     */
    public String getCargo() {
        return cargo;
    }

    /**
     * @param cargo the cargo to set
     */
    public void setCargo(String cargo) {
        this.cargo = cargo;
    }

    /**
     * @return the formação
     */
    public String getFormação() {
        return formação;
    }

    /**
     * @param formação the formação to set
     */
    public void setFormação(String formação) {
        this.formação = formação;
    }

    /**
     * @return the atributos
     */
    public String getAtributos() {
        return atributos;
    }

    /**
     * @param atributos the atributos to set
     */
    public void setAtributos(String atributos) {
        this.atributos = atributos;
    }

    /**
     * @return the cargahoraria
     */
    public String getCargahoraria() {
        return cargahoraria;
    }

    /**
     * @param cargahoraria the cargahoraria to set
     */
    public void setCargahoraria(String cargahoraria) {
        this.cargahoraria = cargahoraria;
    }

    /**
     * @return the salario
     */
    public String getSalario() {
        return salario;
    }

    /**
     * @param salario the salario to set
     */
    public void setSalario(String salario) {
        this.salario = salario;
    }
    
    
}
package model.dao;

import Connection.Connector;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import model.bean.Funcionario;

/**
 *
 * @author MarcosIY
 */
public class FuncionarioDAO {
    
    public void creat(Funcionario f){
    
    Connection con = Connector.getConnection();
    PreparedStatement stmt = null;
    
    
        try {
            stmt = con.prepareStatement("INSERT INTO app.bancofuncionario (nome,email,nascimento,cpf,rg,telefone1,telefone2,cargo,cargahoraria,formação,atributos,salario) VaLUES(?,?,?,?,?,?,?,?,?,?,?,?)");
            stmt.setString(1,f.getNome());
            stmt.setString(2,f.getEmail());
            stmt.setString(3,f.getNascimento());
            stmt.setString(4,f.getCpf());
            stmt.setString(5,f.getRg());
            stmt.setString(6,f.getTelefone1());
            stmt.setString(7,f.getTelefone2());
            stmt.setString(8,f.getCargo());
            stmt.setString(9,f.getCargahoraria());
            stmt.setString(10,f.getFormação());
            stmt.setString(11,f.getAtributos());
            stmt.setString(12,f.getSalario());
            
            
            stmt.executeUpdate();
            
            JOptionPane.showMessageDialog(null, "Salvo com sucesso");
                    } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro "+ex);
        } finally{
        
        Connector.closeConnection(con, stmt);
        }
    
    }
    
    public List<Funcionario> read(){
    
        Connection con = Connector.getConnection();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Funcionario> funcionarios = new ArrayList<>();
        
        try {
            stmt = con.prepareStatement("SELECT * FROM app.bancofuncionario");
            rs = stmt.executeQuery();
            
            while(rs.next()){
            
                Funcionario funcionario = new Funcionario();
                
                funcionario.setNome(rs.getString("nome"));
                funcionario.setEmail(rs.getString("email"));
                funcionario.setNascimento(rs.getString("nascimento"));
                funcionario.setCpf(rs.getString("cpf"));
                funcionario.setRg(rs.getString("rg"));
                funcionario.setTelefone1(rs.getString("telefone1"));
                funcionario.setTelefone2(rs.getString("telefone2"));
                funcionario.setCargo(rs.getString("cargo"));
                funcionario.setFormação(rs.getString("formação"));
                funcionario.setAtributos(rs.getString("atributos"));
                funcionario.setCargahoraria(rs.getString("cargahoraria"));
                funcionario.setSalario(rs.getString("salario"));
                
                funcionarios.add(funcionario);
            }
            
            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro: "+ex);
        }finally{
            Connector.closeConnection(con, stmt, rs);        
            
        }
        
        return funcionarios;
        
    
    }
    
    public void update(Funcionario f){
    
    Connection con = Connector.getConnection();
    PreparedStatement stmt = null;
    
    
        try {
            stmt = con.prepareStatement("UPDATE app.bancofuncionario SET email = ?, nascimento = ?, cpf = ?, rg = ?, "
                    + "telefone1 = ?, telefone2 = ?, cargo = ?, cargahoraria = ?, formação = ?, atributos = ?, salario = ?  WHERE nome = ? or cpf = ? or rg = ?");
            
            stmt.setString(1,f.getEmail());
            stmt.setString(2,f.getNascimento());
            stmt.setString(3,f.getCpf());
            stmt.setString(4,f.getRg());
            stmt.setString(5,f.getTelefone1());
            stmt.setString(6,f.getTelefone2());
            stmt.setString(7,f.getCargo());
            stmt.setString(8,f.getCargahoraria());
            stmt.setString(9,f.getFormação());
            stmt.setString(10,f.getAtributos());
            stmt.setString(11,f.getSalario());
            stmt.setString(12,f.getNome());
            stmt.setString(13,f.getCpf());
            stmt.setString(14,f.getRg());
            
            stmt.executeUpdate();
            
            JOptionPane.showMessageDialog(null, "Atualizado com sucesso!");
                    } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao atalizar: "+ex);
        } finally{
        
        Connector.closeConnection(con, stmt);
        }
    
    }
    
    public void delete(Funcionario f){
    
    Connection con = Connector.getConnection();
    PreparedStatement stmt = null;
    
    
        try {
            stmt = con.prepareStatement("DELETE FROM app.bancofuncionario WHERE nome = ? or cpf = ? or rg = ?");
            stmt.setString(1,f.getNome());
            stmt.setString(2,f.getCpf());
            stmt.setString(3,f.getRg());
            
            stmt.executeUpdate();
            
            JOptionPane.showMessageDialog(null, "Deletado com sucesso!");
                    } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Deletar: "+ex);
        } finally{
        
        Connector.closeConnection(con, stmt);
        }
    
    }
    
    
    
    
    
}

Classes Connection enquanto netbeans

/**
 *
 * @author MarcosIY
 */
public class Connector {
    
     
    
    private static final String DRIVER = "org.apache.derby.jdbc.ClientDriver";
    private static final String URL = "jdbc:derby://localhost:1527/BancoGerenciador";
    private static final String USER = "Usuario";
    private static final String PASS = "Senha";
    
    public static Connection getConnection(){
        
       //Servidor do banco iniciado pelo NetBeans
       //Util enquanto cria e configura o banco e as tabelas pelo NetBeans
        
        try {
            Class.forName(DRIVER);
            return java.sql.DriverManager.getConnection(URL, USER, PASS);
            
        } catch (ClassNotFoundException | SQLException ex) {
            throw new RuntimeException("Erro na conecção: ",ex);
        }}

   /*...*/
  //Resto do codigo e imports na versão definitiva abaixo:

Classes Connection fora do netbeans para distribuição

package Connection;

import java.io.PrintWriter;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.apache.derby.impl.drda.NetworkServerControlImpl;

/**
 *
 * @author MarcosIY
 */
public class Connector {
    
    
    
    private static final String DRIVER = "org.apache.derby.jdbc.ClientDriver";
    private static final String URL = "jdbc:derby://localhost:1527/Banco"; //porta padrão
    private static final String USER = "Usiario";
    private static final String PASS = "Senha ";
    
    public static Connection getConnection(){
        //Iniciar o banco sem precisar o fazer manualmente toda vez que executar e sem usar o netbeans
        try {
System.setProperty("derby.system.home", "\\MyDB\\.netbeans-derby"); 
// Crie uma pasta onde você quiser que fique o seu banco e set aqui
//pode ser qualquer diretorio incluindo a pasta onde estara o executavel(.jar)
//nesse Caso: C:\\MyDB\\.netbeans-derby
NetworkServerControlImpl networkServer = new NetworkServerControlImpl();
networkServer.start(new PrintWriter(System.out));
System.out.println("Banco Iniciado");
} catch (Exception ex) {
System.out.println("Não conseguiu iniciar banco de dados.");

}
       
        
        try {
            Class.forName(DRIVER);
            return java.sql.DriverManager.getConnection(URL, USER, PASS);
            
        } catch (ClassNotFoundException | SQLException ex) {
            throw new RuntimeException("Erro na conecção: ",ex);
        }}

public static void closeConnection(Connection con){

     try {
        if(con!=null){
            con.close();
        } 
     }catch (SQLException ex) {
            //menssagem
     }
    
}

public static void closeConnection(Connection con, PreparedStatement stmt){

    closeConnection(con);
    
    
        try {
            if(stmt!=null){
            stmt.close();
            }   
        }catch (SQLException ex) {
            //menssagem
        }
    
}

public static void closeConnection(Connection con, PreparedStatement stmt, ResultSet rs){

    closeConnection(con, stmt);
    
    
        try {
            if(rs!=null){
            rs.close();
            }   
        }catch (SQLException ex) {
            //menssagem
        }


}

public static void Fazbackup(Connection con){

        
        try {
            
            String backupdirectory = "\\MyDB\\.netbeans-derby";
            CallableStatement cs = con.prepareCall ("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE (?)");
            cs.setString (1, backupdirectory);
            cs.execute ();
            cs.close ();
          JOptionPane.showMessageDialog(null, "Backup feito com sucesso");
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro no backup"+ ex);
        }


}

public static void LerBackup(String diretorio){

    String a = diretorio;
    
    try {
         Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
            DriverManager.getConnection("jdbc:derby:BancoGerenciador;restoreFrom="+a);
           JOptionPane.showMessageDialog(null, "Backing Up Realizado com sucesso!");
        } catch (InstantiationException ex) {
            JOptionPane.showMessageDialog(null, "Erro no backing Up"+ ex);
        } catch (IllegalAccessException ex) {
           JOptionPane.showMessageDialog(null, "Erro no backing Up"+ ex);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro no backing Up"+ ex);
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "Erro no backing Up"+ ex);
        } 




}

}

Não esqueça de adicionar os arquivos .jar, bibliotecas, docs, etc no classpath do projeto

Pode (E é muito provável que tenha) mais coisa, mas eu só sei isso, e se tem eu não achei e essa é uma oportunidade pra agregar e compartilhar o conhecimento (Eu sei como é difícil ter acesso a todo o conteúdo quando se estuda por conta).

http://db.apache.org/derby/ https://db.apache.org/derby/docs/10.2/pt_BR/getstart/getstartderby.pdf
http://db.apache.org/derby/derby_downloads.html#Latest+Official+Release

Paz…

Fala Marcos, como vai? Encontrei essa sua publicação na internet e seguindo o manual do último link q vc passou consegui criar um banco de dados teste e fazer a conexão das minhas aplicações com ele sem problemas. Mas não consigo iniciar o servidor de banco de dados sozinho. Se eu inicializar o banco manualmente, a aplicação conecta, se eu não fizer isso, o código de inicialização não funciona. Eu copiei a parte do seu código que você faz a inicialização do servidor, e acredito que o erro seja com relação ao caminho que eu coloquei, porém eu não sei como resolver. Coloquei o mesmo caminho que aparece em JavaBD - Propriedades - Localização do Banco de Dados e não funciona. Poderia ver se consegue me ajudar?

Veja a mensagem de erro:

java.sql.SQLNonTransientConnectionException: DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ040, SQLERRMC: Falha ao iniciar o banco de dados ‘contato’, consulte a próxima exceção para obter detalhes.::SQLSTATE:XSLAN

Abaixo a minha classe de conexão do banco de dados, na qual eu chamo o conecta(); nas aplicações e funciona:

package Utilitarios;
import java.sql.;
import javax.swing.
;
import org.apache.derby.impl.drda.NetworkServerControlImpl;
import java.io.PrintWriter;

public class bd_java_seufinanceiro {

final/indica que é inalterável/ constante/ private /indica que é privada a esta classe/ String driver = “org.apache.derby.jdbc.ClientDriver”;
/caminho da fonte de dados/final private String url = “jdbc:derby://localhost:1527/contato”;
final private String usuario = “nbuser”;
final private String senha = “nbuser”;
private Connection conexao;
public Statement statement;
public ResultSet resultset;
public String sqlsalvo; // variável criada por mim para armazenar a última instrução sql (select) rodada. Para ser usada
//em outras classes caso necessário.
public int conseguiu_executar; //Variável criada para retornar se conseguiu executar ou não o código.

public boolean conecta()
{
boolean result = true;

try {
//Iniciar o banco sem precisar o fazer manualmente toda vez que executar e sem usar o netbeans
System.setProperty(“derby.system.home”, “C:\Users\anderson.carvalho\Google Drive\Pessoal\TI\Programas Java\- PROGRAMAS DE VERDADE\Projeto Financeiro Anderson\bd_java_seufinanceiro”);
// Crie uma pasta onde você quiser que fique o seu banco e set aqui
//pode ser qualquer diretorio incluindo a pasta onde estara o executavel(.jar)
//nesse Caso: C:\MyDB\.netbeans-derby
NetworkServerControlImpl networkServer = new NetworkServerControlImpl();
networkServer.start(new PrintWriter(System.out));
System.out.println(“Banco Iniciado”);
} catch (Exception ex) {
System.out.println(“Não conseguiu iniciar banco de dados.”);
result = false;
}

if (result) {

try
{
Class.forName(driver);
conexao = DriverManager.getConnection(url,usuario,senha);
//JOptionPane.showMessageDialog (null,“conectado”); Não quero que mostre mensagem se der certo.
}
catch(ClassNotFoundException Driver)
{
JOptionPane.showMessageDialog(null,"Driver não localizado: "+Driver);
result = false;
}
catch(SQLException Fonte)
{
JOptionPane.showMessageDialog(null, "Erro na conexão com a fonte de dados: "+Fonte);
result = false;
}
}
return result;
}

public void desconecta () {

boolean result = true;
try
{
conexao.close();
JOptionPane.showMessageDialog (null, “Desconectado”);
}

catch (SQLException erroSQL)
{
JOptionPane.showMessageDialog(null, “Não foi possível desconectar o banco de dados: “+erroSQL.getMessage());
result = false;
}
}
public void executeSQL(String sql)
{
sqlsalvo = sql; // salvando a instrução sql rodada
try
{
/armazena o código SQL/statement = conexao.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//Parâmetros de entrada necessários para permitir navegação no sql.
resultset = statement.executeQuery(sql); //Armazena os dados retornados pelo SQL.
}
catch(SQLException sqlex)
{JOptionPane.showMessageDialog(null,“Não foi possível executar o comando sql: “+sqlex+
”\n\n Instrução sql:”+
”\n\n”+ sql);
}

}

// Execução de inserts, deletes e updates criados por Anderson
public void executeUpdate(String sql)
{

try
{
/armazena o código SQL/statement = conexao.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//Parâmetros de entrada necessários para permitir navegação no sql.
conseguiu_executar = statement.executeUpdate(sql); //executa o insert/update/delete pelo SQL.
}
catch(SQLException sqlex)
{JOptionPane.showMessageDialog(null,“Não foi possível executar o comando sql: “+sqlex+
”\n\n Instrução sql:”+
"\n\n"+ sql);
}

}
}

Olá, tente isso(inicia o banco e conecta):

public static Connection getConnection(){
        
        try {
System.setProperty("derby.system.home", "\\MyDB\\.netbeans-derby");
NetworkServerControlImpl networkServer = new NetworkServerControlImpl();
networkServer.start(new PrintWriter(System.out));
System.out.println("Banco Iniciado");
} catch (Exception ex) {
System.out.println("Não conseguiu iniciar banco de dados.");

}
       
        
        try {
            Class.forName(DRIVER);
            return java.sql.DriverManager.getConnection(URL, USER, PASS);
            
        } catch (ClassNotFoundException | SQLException ex) {
            throw new RuntimeException("Erro na conecção: ",ex);
        }}