Busca Milagrosa, utilizando DAO, e talvez uma maneira melhor de fazer?

8 respostas
extreme_z3r0

Bom galera, eu fiz um sistema onde eu tinha um tipo de busca milagrosa heheh Por exemplo: vc escrvia "João" e o sistema buscava na tabela de Contatos, por "%Jo%o%" nos campos NOME, CONTATO,RAZAO SOCIAL, ENDERECO, e tralalalala.....

Agora estou refazendo o sistema e queria manter essa "busca", só que estou usando o patter DAO (sou (MUIIIITO)iniciante ) e queria saber se existe alguma maneira de fazer algo assim:

SELECT * FROM tbContatos WHERE * = parametro

para que fique mais "enxuto" e leve ja que a busca é refeita a cada tecla pressionada. Pois eu fiz testando praticamente campo a campo, o que torna MUITO dificil, cançativo, problematico (e na minha opnião um tipo de gambiarra).

Existe algum problema de eu usar um metodo assim ou pelo menos com essa assinatura que retorne esse array de string usando pattern DAO?

Segue minha criança =)

public static Contato[] buscarContato(String paramConteudo, boolean nome, boolean endereco, boolean documentos, boolean telefones, boolean cliente, boolean fornecedor, boolean funcionario, boolean vip, boolean excluido, int ordem) {
		
		// Cria builder para a string de pesquisa ja para buscar todos.
		StringBuilder strComandoSQL = new StringBuilder("SELECT * FROM tbContatos ");
		boolean temWhere = false;
		// Verifica se a string recebida não é nula.
		if (paramConteudo != null) {
			
			// Verifica se é para realização de busca através do ID.
			if (paramConteudo.indexOf(VariaveisDeSistema.BUSCA_POR_ID) == 0) {
				// Busca usuario especifico
				strComandoSQL.append(" WHERE idContato = ");
				temWhere = true;
				// Adiciona o id do contato.
				strComandoSQL.append(paramConteudo.substring(VariaveisDeSistema.BUSCA_POR_ID.length(), paramConteudo.length() - 1));
			}// Fim da verificação de buscar por id.
			else {// Busca pelo conjunto de filtros passados como parametro.
			
				// Realiza a limpeza da string para ralizar a busca
				String conteudoLimpo = Funcoes.limparString(paramConteudo, 1);
				
				// Verifica se vai utilizar algum filtro
				if (nome || endereco || documentos || telefones) {
					
					// Verifica se o "conteudo" recebido para filtragem não é
					// nulo.
					if (paramConteudo != null && !paramConteudo.equals("")) {
						if (!temWhere) {
							// Adiciona o WHERE para as buscas
							strComandoSQL.append(" WHERE ");
							temWhere = true;
						}
						strComandoSQL.append(" ( ");
						
						if (nome) { // filtra por nome
							strComandoSQL.append("nomeCompleto LIKE '" + conteudoLimpo + "' OR");
						}// Fim do nome
						
						strComandoSQL.append(" obs LIKE '" + conteudoLimpo + "' OR ");
						
						if (endereco) { // filtra por endereço
							// Logradouro
							strComandoSQL.append(" logradouro LIKE '" + conteudoLimpo + "' OR");
							// Bairro
							strComandoSQL.append(" bairro LIKE '" + conteudoLimpo + "' OR");
							// Cidade
							strComandoSQL.append(" cidade LIKE '" + conteudoLimpo + "' OR");
							// UF
							strComandoSQL.append(" uf LIKE '" + conteudoLimpo + "' OR");
							// Cep
							strComandoSQL.append(" cep LIKE '" + conteudoLimpo + "' OR");
							// Localização
							strComandoSQL.append(" localizacao LIKE '" + conteudoLimpo + "' OR");
							// Complemento
							strComandoSQL.append(" complemento LIKE '" + conteudoLimpo + "' OR");
						}// Fim do endereço
						if (documentos) {// filtra por documentos.
						
							// CPF
							strComandoSQL.append(" cpf LIKE '%" + conteudoLimpo + "' OR");
							// RG
							strComandoSQL.append(" rg LIKE '" + conteudoLimpo + "' OR");
							// CNPJ
							strComandoSQL.append(" cnpj LIKE '" + conteudoLimpo + "' OR");
							// INSCRICAO
							strComandoSQL.append(" inscricao LIKE '" + conteudoLimpo + "' OR");
							// CTPS
							strComandoSQL.append(" ctps LIKE '" + conteudoLimpo + "' OR");
							// CTPS SERIE
							strComandoSQL.append(" ctpsSerie LIKE '" + conteudoLimpo + "' OR");
							
						}// Fim do documentos.
						
						if (telefones) { // Filtra por telefones.
						
							// Telefone 1
							strComandoSQL.append(" telefone LIKE '%" + conteudoLimpo + "' OR");
							// Telefone 2
							strComandoSQL.append(" telefone2 LIKE '%" + conteudoLimpo + "' OR");
							// Celular
							strComandoSQL.append(" celular LIKE '%" + conteudoLimpo + "' OR");
							// Fax
							strComandoSQL.append(" fax LIKE '%" + conteudoLimpo + "'");
						}// Fim do telefone
						
						strComandoSQL.append(")");
						
					}// Fim da Verificacao do conteudo
				}// Fim dos filtros
				// Filtros excluisivos acomulativos.
				if (fornecedor || cliente || vip || funcionario) {
					if (!temWhere) {
						strComandoSQL.append(" WHERE ");
						temWhere = true;
					} else {
						strComandoSQL.append(" AND ");
					}
					strComandoSQL.append(" ( ");
					if (fornecedor) {
						strComandoSQL.append(" fornecedor = 1 AND ");
					}
					
					if (cliente) {
						strComandoSQL.append(" cliente = 1 AND ");
					}
					
					if (vip) {
						strComandoSQL.append(" vip = 1 AND ");
					}
					
					if (funcionario) {
						strComandoSQL.append(" funcionario = 1 ");
					}
					
					// Verifica se sobrou " AND " no final da string.
					if (strComandoSQL.lastIndexOf("AND ") > strComandoSQL.length() - 5) {
						
						strComandoSQL.delete(strComandoSQL.length() - 5, strComandoSQL.length() - 1);
					}
					strComandoSQL.append(") ");
					
				}// Final dos filtros de tipos
				
			}// Else busca por id
			
			if (temWhere) {
				strComandoSQL.append(excluido ? " AND excluido = 1" : " AND excluido = 0");
			} else {
				strComandoSQL.append(" WHERE ");
				temWhere = true;
				strComandoSQL.append(excluido ? " excluido = 1" : " excluido = 0");
			}
			// Ordena
			strComandoSQL.append(Funcoes.getOrdenador(0, ordem));
			
			try {
				// // system.out.println(strComandoSQL.toString());
				// Cria o statement
				Statement stmBuscaSQL = (Statement) conConexaoComBanco.createStatement();
				// Cira o resultSet que vai armazenar os registros
				// encontrados.
				ResultSet rsContatosEncontrados = stmBuscaSQL.executeQuery(strComandoSQL.toString());
				// Envia o resultset para a classe Funcoes montar os
				// Contatos e retornar um array de Contato.
				return Funcoes.montarContato(rsContatosEncontrados);
				
			} catch (SQLException e) {
				
				JOptionPane.showMessageDialog(null, "ERRO DESCONHECIDO: " + e.getMessage(), VariaveisDeSistema.SISTEMA_NOME, JOptionPane.ERROR_MESSAGE);
				
			}
		}
		return null;
		
	}

8 Respostas

abreumania

Cara o que você precisa é uma pesquisa por termos!

Estude o Apache Lucene.

extreme_z3r0

abreumania, pelo vi rapidinho aqui o Apache Lucene é um “google desktop search” para java vamos assim dizer. Isso não seria locura? Pois eu teria que indexar tudo a cada novo registro. Não daria mais trabalho?

G

Hummm… loucura seria indexar ou a consulta que você esta planejando? hehe!
Brincadeira

abreumania

Parece que da mais trabalho, porém o benefício não é somente pesquisar mais facilmente, você está dando uma funcionalidade de pesquisa por termo. Você pode aplicar analizadores nos termos que serão pesquisados e achar termos chaves.

Ex: Você pesquisa programando e ele vai trazer tudo que tenha programar, programa, programado, programas.

Enfim é muito comum aplicações utilizarem essa estratégia de indexação.

Entendeu?

extreme_z3r0

Entendi, mais e o fato de eu ter de “indexar” o banco de dados, como fica? será que tem como ele acessar diretamente o banco? Acho que não pois la tava escrito que a fonte tem que ser texto :frowning:
e quanto ao "SELECT * FROM tbContatos WHERE * = parametro ". alguem sabe alguma coisa?

mario.fts

hum… se vc estivesse utilizando hibernate, vc poderia utilizar uma busca comum objeto de exemplo => http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html#findByExample(java.lang.Object)

extreme_z3r0

:smiley: :smiley: :smiley: :smiley: :smiley: Hehehe Divinha o que eu vou usar para banco de dados? Começa com “Hiber” e acaba com “nate” :smiley:

vlw mario.fts

abreumania

Já que você vai utilizar o hibernate, se precisar realizar pesquisas por termos, estude o hibernate search!!

Criado 27 de janeiro de 2010
Ultima resposta 1 de fev. de 2010
Respostas 8
Participantes 4