Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

CRUD Reflection

Gostaria de saber se consigo gerar os parâmetros para sql, no caso do CRUD , por reflection, como o : Create table , inserto , update, etc.

7 respostas

Fala aí Marcos, blz?

Cara não entendi muito bem sua dúvida. Em que momento você quer gerar os comandos sql via reflection?

Eu preciso fazer isso, mas estou um pouco confuso ainda de como fazer . Conjunto de classes que permita anotar POJOs, interpretar as anotações, persistir e buscar os dados em um banco Postgres com instruções SQL totalmente dinâmicas, ou seja, todo o SQL necessário, inclusive o de criação e drop das tabelas, deve ser criado com reflection a partir das anotações.

Então mas ainda não entendi direito em que momento.

Consegue me dar um exemplo do como você quer usar?

Eu irei criar um gerenciador, por exemplo eu tenho um painel feito em Java Swing, nesta painel tem que ter, adicionar,listar e excluir, porém isto deve ser dinâmico, tanto é que os campos do meu painel são gerados por reflection conforme a classe, Exemplo: Pessoa(Nome, idade e sexo), porém se eu trocar e testar com a Classe cachorro( Nome, raça e porte) os campos e as sqls de create table, insert, etc devem ser criadas dinâmicamente com reflection e annotation, a dúvida que estou é como criar isso, e passar no meu CRUD.

solução!

Se você estiver usando o hibernate/JPA, pode utilizar Criteria para te ajudar nisso e nem precisa de reflection.

Mas se quiser fazer via reflection, aqui é um exemplo do que você pode fazer para gerar insert a partir de uma classe:


int numberOfQuestionMark = 0;

        StringBuilder builder = new StringBuilder("INSERT INTO ");

        builder.append(classe.getSimpleName());


        Field[] fields = classe.getDeclaredFields();


        builder.append("(");
        for (int i = 0; i < fields.length; i++) {

            Field field = fields[i];
            field.setAccessible(true);

            if (field.getAnnotation(Id.class) == null){
                numberOfQuestionMark++;

                builder.append(field.getName());
                builder.append( field.equals( fields[fields.length-1] )? ")": "," );
            }

        }
        builder.append("values(");


        int finalNumberOfQuestionMark = numberOfQuestionMark;
        IntStream.rangeClosed(1, numberOfQuestionMark)
                .forEach(iteration -> {
                    builder.append("?");
                    builder.append(iteration == finalNumberOfQuestionMark ? ")": ",");
                });


        System.out.println(builder.toString());

Baseado nesse exemplo você pode adapta-lo para as outras operações.

Espero ter ajudado e bons estudos.

package br.univel.dao;

import java.lang.reflect.Field;

public class UtilSQl {

    public String getSql(Object o) {

        Class<?> c = o.getClass();

        StringBuilder sb = new StringBuilder();

        sb.append("INSERT INTO ");
        sb.append(c.getSimpleName().toUpperCase());
        sb.append("(");

        Field[] f  = c.getDeclaredFields();

        for (int i = 0 ; i < f.length ; i++) {

            Field att = f[i];

            if(i > 0){

                sb.append(",");
            }

            sb.append(att.getName().toUpperCase());
        }
        sb.append(")");

        //Valores !

        sb.append(" VALUES(");

        for(int i = 0 ; i< f.length ; i++){


            if(i > 0){

                sb.append(",");
            }
            sb.append("?");
        }
        sb.append(");");

        //fim insert !
        return sb.toString();
    }

}

Eu fiz assim, abstrai um pouco do seu e terminei o do insert, o que acha ?

Acho que está bom.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software