terça-feira, 30 de setembro de 2014

JBC 2.0 com Hibernate 4

Prezados colegas,

É com imensa satisfação em venho através deste atualizar o framework JBC para a versão 2.0, no qual a principal mudança faz referência a versão 4 do framework de persistência Hibernate, no qual corrigi alguns bugs, e melhoras de performance e utilização (não iremos discutir as mudanças do Hibernate 3 para o 4).

Principal alteração é a forma que é inicializado a configuração do Hibernate, na classe HibernateUtil, que foi trocado a classe org.hibernate.cfgAnnotationConfiguration depreciada na versão 4 por org.hibernate.cfg.Configuration e juntamente veio a necessidade de utilização do org.hibernate.service.ServiceRegistry, que é uma nova forma implementada pelo Hibernate para gerenciar seus serviços.


Outra mudança, foi a adição do método para pegar um objeto através de um HQL com passagem de paramêtros, o qual não existia na versão 1.1. O método contém a seguinte assinatura:

 public Object getValueByHQLCondition(String condition, List paramList,   
  String paramListName) throws Exception  

O método acima pode ser utilizado para buscar a quantidade de registros de uma entidade, com exceção de alguns deles:

 List<Long> ids = new ArrayList<Long>();  
 ids.add(1);  
 String hql = "select count(u) From Usuario u where u.id not in (:paramIds)";
 Integer count = (Integer) this.getValueByHQLCondition(hql, ids, "paramIds");  

O código fonte pode ser baixado no repositório github https://github.com/marconato/jbc-framework

Desde já agradeço a sua atenção. Estou aberto a perguntas e sugestões.

segunda-feira, 1 de setembro de 2014

Empresas utilizam JBC

Temos o prazer de anunciar algumas empresas que tem projetos em fase de desenvolvimento ou já concluídos utilizando o JBC:

LARC - Laboratório de Arquitetura e Redes de Computadores é um laboratório do Departamento de Engenharia de Computação e Sistemas Digitais da Escola Politécnica da Universidade de São Paulo (PCS-EPUSP).

Kiwano Tecnologia - Empresa com sede na cidade de Londrina - PR

B3 Informática - Empresa com sede no Parque Tecnológico de Itaipu, na cidade de Foz do Iguaçu - PR

sábado, 8 de junho de 2013

Conteúdo mini-curso Seminário Científico

Apresentação do conteúdo do mini-curso proferido nos dias 05-06/06 no Seminário Científico das faculdades Anglo Americano e UDC.
Conforme combinado, os interessado em dar continuidade nos exercícios, estarei dispostos a auxiliar nas dúvidas.
Entrem em contato através do e-mail marconato10@gmail.com


quinta-feira, 23 de maio de 2013

Mini curso JBC



Mini curso JBC será ministrado no IV Seminário Científico Organizações Tecnologia e Relações Internacionais nos dias 05 e 06/06 de 2013, na Faculdade Anglo Americano

Facebook do evento


quinta-feira, 18 de abril de 2013

Case de sucesso

Projetos desenvolvidos em Java na B3 Informática estão utilizando o framework JBC.
Até o momento dois projeto foram concluídos com os benefícios do framework, no qual otimizou o processo de regra de negócio das aplicações

quinta-feira, 14 de fevereiro de 2013

Suporte para leitura de arquivo de propriedade hibernate


Pensando em melhorar a manutenção dos projetos, surgiu a necessidade de  ler um arquivo de propriedade com as credenciais do banco de dado, dispensando a necessidade da recompilação do projeto com essas informações toda vez que o banco de dados ou credenciais foram alteradas.

Ao levantar um projeto que use o framework JBC, o hibernate se conecta ao banco de dados através do arquivo hibernate.cfg.xml  na raíz do projeto. Na versão 1.1, o JBC verifica se existe um arquivo hibernate.properties na raiz do projeto. Este arquivo segue as especificações hibernate, como abaixo as credenciais para conexão  com o MySql:

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://server:port/database
hibernate.connection.username=user
hibernate.connection.password=pass
hibernate.hbm2ddl.auto=update


O arquivo hibernate.cfg.xml na raiz do projeto não é dispensado, pois é neste que o mapeamento das entidades são descritos para o hibernate:

<hibernate-configuration>

  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>    
    <property name="hibernate.connection.url">jdbc:mysql://server:port/database</property>    
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.hbm2ddl.auto">update</property>

    <mapping class="br.com.Entidade1"/>
    <mapping class="br.com.Entidade2"/>
    <mapping class="br.com.Entidade3"/>

  </session-factory>
</hibernate-configuration>


Caso o arquivo hibernate.properties for encontrado na raiz do projeto, suas credenciais são carregadas, caso contrário, as credenciais do arquivo hibernate.cfg.xml prevalecem. Com isso aumenta a flexibilidade do projeto, sendo possível alterar o banco de dados e seus credencias a qualquer momento que o cliente necessitar, sem a necessidade de recompilar o projeto, e sem ter conhecimentos de programação.

A alteração equivalente esta implementada na classe br.com.jbc.db.HibernateUtil, como apresentado abaixo:

public class HibernateUtil {

    private static SessionFactory factory;
    
    private static String HIBERNATE_PROPERTIES_FILE_NAME = "hibernate.properties";

    static{
        Properties hibernateProperties = new Properties();
        InputStream in;
        try {
            in = new FileInputStream(HibernateUtil.HIBERNATE_PROPERTIES_FILE_NAME);
            hibernateProperties.load(in);
            in.close();
            
            factory = new AnnotationConfiguration().configure().setProperties(hibernateProperties).buildSessionFactory();
            
        } catch (Exception ex) {

            try {
                factory = new AnnotationConfiguration().configure().buildSessionFactory();
            } catch (Throwable e) {
                // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + e);
                throw new ExceptionInInitializerError(ex);
            }
        }
    }

    /**
     * Abre e retorna a Sessão Hibernate
     * @return Session
     */
    public static Session getSession() {
        return factory.openSession();
    }
}

Para baixar o jar da versão 1.1, clique aqui;

terça-feira, 16 de outubro de 2012

Consulta HQL

Alguns métodos da API br.com.jbc.controller.Controller possibilitam a realização de consulta HQL, como podem ser vistos nos exemplos abaixo:

Instância da API Controller para realizar consultas usando a entidade Pessoa

Controller<Pessoa> service = new Controller<Pessoa>();

Busca simples com condição HQL. Será impresso na console a pessoa com id 11

List<Pessoa> lista = service.getListByHQLCondition("from Pessoa where id = 11");

for (Pessoa pessoa : lista) {
  System.out.println(pessoa.toString());
}
Assinatura do método:
java.util.List<T> getListByHQLCondition(java.lang.String condition)


Busca HQL com passagem de parâmetros. Será impresso na console as pessoas com id 11, 12 e 13

List<Long> ids = new ArrayList<Long>();
ids.add(new Long(11));
ids.add(new Long(12));
ids.add(new Long(13));
     
List<Pessoa> lista2 = 
       service.getListByHQLCondition("from Pessoa where id in (:paramIds)", ids, "paramIds");

for (Pessoa pessoa : lista2) {
    System.out.println(pessoa.toString());
}
Assinatura do método:
java.util.List<T> getListByHQLCondition(java.lang.String condition, java.util.List paramList, java.lang.String paramListName)



Busca HQL paginada. Será impresso as 4 pessoas com id maior que zero ordenado por id

List<Pessoa> lista3 = 
       service.getListByHQLCondition("from Pessoa where id > 0 order by id",0, 3);

for (Pessoa pessoa : lista3) {
    System.out.println(pessoa.toString());
}
Assinatura do método:
java.util.List<T> getListByHQLCondition(java.lang.String condition, int firstResult, int maxResult)


Busca HQL paginada com passagem de parâmetros. Será impresso as pessoas com id 11 e 12, pois nos parâmetros de paginação esta buscando os usuários da lista entre o valor 0 e 1.

List<Long> param = new ArrayList<Long>();
param.add(new Long(11));
param.add(new Long(12));
param.add(new Long(13));
List<Pessoa> lista4 = 
         service.getListByHQLCondition("from Pessoa where id in (:ids)", param, "ids", 0 , 1);

for (Pessoa pessoa : lista4) {
    System.out.println(pessoa.toString());
}
Assinatura do método:
java.util.List<T> getListByHQLCondition(java.lang.String condition, java.util.List paramList, java.lang.String paramListName, int firstResult, int maxResult)


Código que efetua uma busca HQL que retorna a entidade Pessoa. Será impresso o nome da pessoa

Pessoa p = service.getObjectByHQLCondition("from Pessoa where id = 11");
System.out.println(p.getNome());
Assinatura do método:
T getObjectByHQLCondition(java.lang.String condition)


Código retorna um valor qualquer relacionado a classe pessoa, neste caso irá imprimir o nome da cidade

Cidade c = (Cidade) 
          service.getValueByHQLCondition("select p.cidade from Pessoa p where p.id = 11");

System.out.println(c.getNmCidade());
Assinatura do método:
 java.lang.Object getValueByHQLCondition(java.lang.String condition)

 
Código imprime o email da pessoa.

String email = (String) 
            service.getValueByHQLCondition("select p.email from Pessoa p where p.id = 11");

       System.out.println(email);
Assinatura do método:
 java.lang.Object getValueByHQLCondition(java.lang.String condition)



Lembrando que estes são exemplos de como fazer consultas HQL com a API br.com.jbc.controller.Controller, mas para fazer uma consulta simples podemos utilizar o método find

Código que busca a pessoa com o id 1 e imprime o nome

Pessoa p = new Pessoa();
p.setId(1);

p = service.find(p);
System.out.println(p.getNome());
Assinatura do método:
T find(T filter)

Como também o findList que retorna uma lista e findPaginate que efetua uma pesquisa paginada

Para ver mais detalhes, acesse a documentação da API