Home

(Versão Velha - leia a introdução da versão 2.0) [Introdução] ParallaxDB 1.6 - Framework de Persistencia

  • Imprimir
  • E-mail
Avaliação do Usuário: / 12
PiorMelhor 

Sistema Operacional Android

SQLApache DerbySQLite

FireBird SQLPostGreSqlMySQL

Introdução

Informações

  1. 100% JDBC
  2. Não utiliza nenhuma biblioteca externa, somente o que vem no JDK
  3. Funciona tanto no SO Android (Somente o SQLite foi testado no Android) como em computadores domesticos e empresariais (Todos os bancos informados aqui) que tenham a JDK instalado.
  4. Pré-Requisito: Java 6+.
  5. Suporta os seguintes bancos de dados: MySQL, SQLite, Firebird 1.5+, Apache Derby, PostGreeSQL
  6. É obrigatorio ter na lib o driver JDBC de um dos bancos de dados disponiveis acima!
  7. O framework só trabalha com chave primaria simples (Ele não trabalha com chave primaria composta).
  8. Versão atual 1.6

Instalando

1°) Baixe o arquivo parallaxdb.jar

2°) copie para sua pasta lib e adicione o parallaxdb.jar ao seu projeto.

3°) Baixe o driver jdbc do seu banco de dados, ponha também na pasta lib e adiciona o jar do driver jdbc no projeto.

4°) Adicione o arquivo parallax.properties ao projeto (Veja mais na seção "Preparando o Ambiente").

Obs.: Existe o projeto ParallaxDBSecurityProperties, este projeto tem a função de criar o properties acima aplicando criptografia na senha, isso garante que não vão saber a senha do seu banco de dados.

== ATENÇÃO ==

 Se for usar o Android: adicione o SQLDroid dentro da pasta libs do projeto Android (Arquivos: sqldroid-1.0.0RC1.jar e sqldroidsecompat-1.0.0RC1.jar) e não coloque o driver jdbc do SQLite (O SQLDroid subistitui o driver jdbc padrão, sendo feito exclusivamente Android) e no arquivo parallax.properties ponha o valor do "type.database=sqldroid".

== Agora é só utilizar ==

Como utilizar

Vídeo (Ver. 1.0): [Parallax 3.0] ParallaxDB - Framework de persistencia Android.& Desktop

Vídeo (ver. 1.5): [ParallaxDB - Ver. 1.5] - Framework de persisntecia - Tutorial Android e Desktop

Apresentação (SlideShare): ParallaDB - Framework de Persistência Android e Desktop

1°) Crie seu DTO (Data Transfer Object) e seu DAO (Data Acess Object).

Resumo DTO: É uma classe que representa uma tabela do banco de dados, assim como seus atributos representam as colunas da tabela.

Resumo DAO: É responsavel em gerenciar as ações que envolvem so dados do banco de dados e seus DTOs, por exemplo a inserção, atualização e deleção de registros do banco de dados, assim como a consulta do mesmo é de responsabilidade do DAO, entre outras tarefas ligadas ao banco.

Exemplo de um DTO aplicando as anotações do framework.

@Table(name="cliente")

public class Cliente implements BaseDTO {

@Column(name="cliente_codigo", isId=true)

private int codigo;

@Column(name="cliente_ativo", isActive=true)

private int ativo;

@Column

private String nome;

}


Entendendo o exemplo acima


@Table: Informações da Tabela . Abaixo veja a função dos parametros.

  • name: Informa o nome da tabela. Se o parametro name não for passado, o framework considera que o nome da classe tem o mesmo nome da tabela!

@Column: Informa o nome do campo, se é chave primaria e se é uma coluna "ativo/inativo". Abaixo veja a função dos parametros.

  • name: Indica o nome da coluna da tabela, acossiada ao atributo da classe. Se o parametro name não for passado, o framework considera que o atributo tem o mesmo nome da coluna!
  • isId: Recebe True(Verdadeiro) ou false(Falso), se verdadeiro o framework vai considerar que este campo é a chave primaria da tabela.
  • isActiveField: Recebe True(Verdadeiro) ou false(Falso), se verdadeiro o framework vai considerar que este campo representa os registros Inativo(Excluido = 1) ou Ativo(Não Excluido = 0). Existem alguns casos em que uma tabela não pode ter seus registros excluidos fisicamente, para resolver este problema criam um campo que representa o estado Inativo(Excluido = 1) ou Ativo(Não Excluido = 0), neste caso ao passar true para este parametro, o framework entende que se este campo tiver valor 0, não deve ser considerado nas consultas (Exceto pela consulta de chave primaria), se tiver valor 1 passa a ser considerado.

BaseDTO: É uma interface que força a implementação de dois outros metodos, os metodos são getId() e setId(int id), Base DTO é uma interface e não uma classe abstrata, pois uma classe ia gerar um acoplamento forte. Abaixo um exemplo de implementação baseado no 1° exemplo:

@Override

public int getId(){

return this.codigo;

}

@Override

public void setId(int id){

this.codigo = id;

}

Perceba que estes dois metedos recebem e retornam o valor do atributo que representa a chave primaria. Isso é um facilitador e um agilizador para o BaseDAO, sem isso esses metodos seriam chamados por Reflection, em N situações, requisitando um processamento extra e performance é um dos pontos chaves, já que a função primaria deste framework é trabalhar harmoniosamente e corretamente no Sistema Operacional Android. Lembrando que o "@Override" é uma anotação nativa do Java para indicar sobrescrita de metodo.


Uma boa pratica no DTO é sobreescrever os metodos hasCode(), equals() e toString(). Abaixo alguns modelos:

/**
    * Metodo para a comparação entre dois objetos
    *
    * @param obj - Objeto para a comparação
    * @return boolean - True=Objetos iguais | false=Objetos diferentes
    *
    */
    @Override
    public boolean equals(Object obj) {
        if ( this == obj ){
            return true;
        } else if ( this == null ){
            return false;
        } else if ( !(obj.getClass() == this.getClass()) ){
            return false;
        } else if ( ((BaseDTO)obj).getId() == this.getId()){
            return true;
        }
        return false;
    }

    /**
    * Metodo que ordena através de código hash
    *
    * @return int - Código hash
    */
    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 31 + this.getId();
        return hash;
    }

    /**
    * Metodo que retorna um texto, quando chamam o objeto
    * diretamente "new objeto()" ou "new objeto().toString()"
    *
    * @return String - Texto personalizado
    */
    @Override
    public String toString() {
        return "id: " + this.getId();
    }

Existe um classe abstrata no framework opcional chamada AbstractBaseDTO, ela já implementa os metodos hasCode(), equals() e toString(), além de já ter o "implements" para BaseDTO. Porém não aconselho a utilizar esta classe, pois gera o que chamamos de acoplamento forte, isso é uma pratica que devemos evitar, utilizar a interface é  a melhor opção (Porém se ao analizar ver que ter as implementações dos três metodos acima compensa mais, então é só utilizar a mesma).

Atenção: Se herdader esta classe (extends AbstractBaseDTO), não é necessario implementar BaseDTO ("implements BaseDTO")


Exemplos de uso do BaseDAO.


1°) Como faço para instanciar um objeto BaseDAO  e chamar um metodo qualquer dele?

BaseDAO dao = new BaseDAO(){};

dao.getList();

Observação: Repare na {}, ao fazer isso, se cria uma classe anonima que herda BaseDAO e ira utilizar o tipo generico Cliente indicado no código acima. Mas porque sou obrigado a fazer isso? Por que, o BaseDAO trabalha com reflection e ele utiliza o tipo generico para saber qual classe DTO ele esta trabalhando, então se passar o construtor normal "new BaseDAO();" ele vai gerar um erro.


2°) Se quiser herdar BaseDAO e adicionar um metodo extra, como faço?

public class ClienteDAO  extends BaseDAO{

public ClienteDTO getMyMethod(int id){
        List listDTO=null;
        try {
            listDTO = this.getListCustomSQL("Select * from Cliente where"+this.getFieldId()+"=?", false, id);
            if (listDTO!=null && listDTO.isEmpty()==false){
                return listDTO.get(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}


Observação: Uma boa pratica neste caso é aplicar Singleton no herdeiro do BaseDAO, na classe herdeira (Se não quiser usar o RegistryDAO), um exemplo seria por o código abaixo dentro da classe acima.

private static ClienteDAO instance;

// Método público estático de acesso único ao objeto!

public static synchronized ClienteDAO getInstance() {
    if (instance == null) {
         instance = new ClienteDAO();
     }
     return instance;
}

3°) Quais são os metodos importantes do BaseDAO?

Primeiro lembre-se de ler o JavaDoc do projeto, todas as classes e metodos estão documentadas. Abaixo apenas um resumo dos metodos uteis pertencentes ao framework.

  • get(int id): Retorna um registro baseado na chave primaria.
  • getList(String): Retorna todos os registros.
  • getListPaginationON(String): Mesmo efeito do getList(), mas considera a paginação.
  • getListCustomSQL(String, boolean, Object...): Retorna uma lista de registros baseados em N criterios, podendo ter paginação ou não no resultado, passando 0 ou N parametros para o SQL.
  • insertOrUpdate(T obj):Insere ou atualiza o objeto no banco de dados. Se getId() >0 e getId() exitir no banco ele atualiza o objeto, caso o contrario ele insere.
  • insertOrUpdate(List): Insere ou atualiza uma lista de objetos no banco de dados.
  • update(T): Atualiza um registro no banco de dados.
  • update(List): Atualiza uma lista de objetos no banco de dados.
  • delete(T): Remove um registro do banco.
  • getConnection(): Recupera a conexão corrente.
  • getTable(): Retorna o nome da Tabela.
  • getFieldId(): Retorna o nome da Chave Primaria (PK).
  • getActiveField(): Retorna o nome do campo na tabela que representa o status (1=Ativo/0=Inativo)
  • getObjectClassT(): Retorna o class da classe indicada em
  • getOrderBy(SqlOrderBy, String...): Retorna a String SQL da instrução "Order By ", esse metodo é protegido.
  • getLastGeneratedID(): Retorna o valor do ultimo ID gerado banco de dados.
  • getListByValue(String, Object, SelectTypeConditional, boolean, String): Retorna uma lista de registros (Considerando ou não a paginação) baseado em uma pesquisa por "Like" ou "=" (campo like/= valor).
  • getUniqueObjectByValue(String, Object, String): Retorna somente um registro baseado em "Campo = Valor".
  • countTotalRecord(): Retorna o total de registros da tabela.


4°) Como utilizar a classe RegistryDAO e ela serve para que?

Essa classe utiliza um Designer Pattern chamado Registry, esse padrão de projeto é uma outra alternativa ao uso do padrão de projeto Singleton, porém me da a vantagem de adicionar e acessar de forma global os DAOs passados no seu metodo "add(...)" e recuperados no "get(...)", mantendo somente uma instancia de cada DAO vinculada a um DTO.

//Cria um objeto BaseDAO para tratar o DTO do tipo Cliente

RegistryDAO.add(new BaseDAO<Cliente>(){});

//Acessando o DAO responsavel em manipular os objetos do tipo Cliente, passando apenas o class do DTO

List<Cliente> list = RegistryDAO.get(Cliente.class).getList();

Observação: Note que o Cliente.class é a chave para recuperar o BaseDAO, lembrando que o metodo addDAO(...) não insere dois objetos DAO que manipulem o mesmo tipo generico. Por exemplo:

RegistryDAO.add(new BaseDAO(){});

//Ele NÃO vai adicionar este outro DAO, pois faz referencia a um DTO já existente (No exemplo o Cliente)

RegistryDAO.add(new BaseDAO(){});


Paginação dos Dados

Quando trabalhamos com tabelas ou listas é comum querer pagina-las em algum momento. Porém o algoritomo para fazer isso costuma ser custoso, trabalhoso,  dificil e ainda varia de base de dados para base de dados. Para resolver isso já foi implementado a paginação no proprio Framework. Abaixo alguns metodos de apoio.

1°) Movendo entre paginas.
  • goFirstPage(): Vai para a primeira pagina
  • goNextPage(): Vai para a proxima pagina
  • goPreviousPage(): Vai para a pagina anterior
  • goLastPage(): Vai para a ultima pagina
  • goSelectedPage(int):Informa o numero da pagin que deseja ir.

2°) Habilitando e desabilitando botões
  • set/is StateButtonLast(...): É atualizado automaticamente e pode ser usado para habilitar/desabilitar um componente (Ex.: Botão ">").
  • set/is StateButtonFirst(...): É atualizado automaticamente e pode ser usado para habilitar/desabilitar um componente (Ex.: Botão "<").
  • set/is StateButtonNext(...): É atualizado automaticamente e pode ser usado para habilitar/desabilitar um componente (Ex.: Botão ">>").
  • set/is StateButtonPrevious(...): É atualizado automaticamente e pode ser usado para habilitar/desabilitar um componente (Ex.: Botão "<<").

3°) Informativo
  • getCurrentPage(): Pagina atual
  • getQuantityPages(): Quantidade de paginas
  • set/get QuantityRecords(): Quantidade total de registros
  • PAGE_SIZE: Numero de registros por pagina

Preparando o Ambiente

1°) Antes de tudo informe no projeto principal o local onde se localiza o parallax.properties, abaixo um exemplo utilizando a LibGDX:

String filePath = Gdx.files.getLocalStoragePath() + "parallax.db";

InputStream fileProperties = Gdx.files.internal("data/parallax.properties").read();

Util.getInstance().loadGlobalProperties(fileProperties, filePath);

Onde "fileProperties" é onde localiza-se o arquivo properties, no exemplo acima ele esta em "assets/data/parallax.properties" (Seguindo o padrão da LibGDX). O "filePath" indica o local onde se localiza o banco de dados (Lembrando que este parametro é opcional, pois pode ser indicado no properties também, porém prevalece o valor indicado no properties caso ambos existam).

2°) Entendendo os parametros do parallax.properties.

- type.database (Obrigatorio): Indica qual banco de dados vai ser usado, abaixo os valores validos para o mesmo:

  • derby, sqlite, mysql, firebird, postgresql (Apenas para aplicações Desktop)
  • sqldroid (Apenas para aplicações Android, indica acesso ao banco de dados SQLite)

Atenção: Ao informar este atributo ele automaticamente carrega a url, urlPrefix e o classForName padrões para o tipo especificado.

 

- pagination.pagesize (Obrigatorio): Informa qual o numero de registros a serem exibidos por pagina.

 Ex.: pagination.pagesize=5

- connection.classForName (Opcional): Informa o driver jdbc a ser usado.

Ex.: connection.classForName=org.sqlite.JDBC


- connection.urlPrefix (Opcional): Informa o prefixo da URL.

Ex.: connection.urlPrefix=jdbc:sqlite:


- connection.url (Opcional): Informa a url do banco de dados (Seu caminho completo)

Ex.: connection.url=c:\\Teste\\banco.db


- connection.user (Opcional): Informa o login de acesso do banco de dados.

Ex.: connection.user=parallax

- connection.password (Opcional): Informa  a senha de acesso do banco de dados.

Ex.: connection.password=parallax123

- connection.password.crypt (Opcional): Informa se a senha informada no properties e criptografada, se for TRUE ele vai descriptografar a senha antes de checar a base de dados (Veja o modelo de criptografia aplicada no ConnectionFactory do projeto ParallaxDB).

Ex.: connection.password.crypt=false

 

Finalmente o DataBase Editor da versão 2.0 do Parallax esta ON

  • Imprimir
  • E-mail
Avaliação do Usuário: / 2
PiorMelhor 

DATA BASE EDITOR

Autor: Jeferson da Silva Januario

Vídeo: [Java Game Engine 2D] Parallax Project -Video 8: "Data Base Editor"

Curriculo Lattes: http://lattes.cnpq.br/1992863363156376

E-Mail: Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo.

Antigamente o Parallax usava XML como base de Dados, recentemente na versão 2.0.0 isso foi mudado, onde agora ele usa banco de dados embarcado da Apache (Derby), com isso ficamos pendentes de entregar um editor de dados para que os desenvolvedores possam trabalhar em cima. Neste contexto que Jeferson Januario, se dispos a fazer este editor, ao qual agradecemos muito.

Caracteristicas do Editor:

  • Linguagem Java com Swing.
  • Multiplataforma.
  • Simples.
  • Acesso a base de dados do parallax (Derby Apache).
  • Utiliza bibliotecas e algoritimos de animações e gerenciamento de imagens.

- Para baixar va em nossa seção Downloads -> Projetos.

Obs.: Todos os links de download foram atualizados para a versão 2.0.0, incluso o mini-tutorial de instalação dos binarios para teste.

 

[Parallax 2.0] VII Computação Amostra Cesupa

  • Imprimir
  • E-mail
Avaliação do Usuário: / 1
PiorMelhor 

Logo CESUPA

banner CAVI

Sobre o Cesupa

"Fala-se muito em processo de aprendizagem orientada para a autonomia intelectual do aluno, isto é, que proporcione estímulo à capacidade de raciocínio discente. Ora, isto exige a ampliação do espaço e do tempo destinados a provocar no estudante essa faculdade de pensar logicamente..." by CESUPA

Site Oficial: http://www.cesupa.br/

Hístoriahttp://www.cesupa.br/ConhecaCesupa/histcesupa/histcesupa.asp

Informações Institucionais: http://www.cesupa.br/saibamais/normasacad/normasacad.asp

Objetivos e Metodologias: http://www.cesupa.br/ConhecaCesupa/objetmet/objetmet.asp

VII Computação Amostra Cesupa

Site Oficial (Evento): http://www.acet.cesupa.br/compamostra/

Facebook (Evento): https://www.facebook.com/ViiCompAmostra

Palestra

Projeto Parallax

Engine 2D para criação de Jogos em Java

Veja como é fácil criar um RPG 2D em Java usando esta engine nacional.

Apresentação: http://www.slideshare.net/MichelMontenegro/palestra-cesupa

- O foco da palestra foi explicar o raciocinio por tras da engine, o que levou a sua criação, os recursos já disponiveis na engine, quais tecnologias foram utilizadas e mercado de trabalho.


Fotos

Cesupa 7AmostraComputacao A Cesupa 7AmostraComputacao B
Cesupa 7AmostraComputacao C Cesupa 7AmostraComputacao D

 

Pagina 4 de 15

Login/Cadastro

Você será notificado via e-mail sobre artigos saídos do forno! fazer downloads, participar do forum e terá acesso a outras áreas restritas.





Entrar
Registrar

Social - Autor

  • Facebook: profile.php?id=1132463886
  • Orkut: 7976573775469361262
  • Twitter: bacharelmichel
  • YouTube: arcanjobra
  • External Link: https://plus.google.com/106662473303087918422

Fique Atualizado

Digite seu email para receber notificações sobre novos artigos saídos do forno!

Apenas clique para recomendar no Google


Dica Relâmpago

pastarchives

Evite em uma iteração(For,While) alterar os dados da coleção em uso na iteração (Adicionar e Remover objetos). Isso pode gerar algum tipo de concorrencia, e nem tornando o metodo ou atributo sincronizado, vai resolver em alguns casos.

Enquete

Qual formato de jogo você gostaria de ver na engine?