publicStringgetSQL(Stringfuncao)throwsFileNotFoundException,IOException{FileInputStreamfis=null;Filearquivo=newFile("sql.properties");Propertiesqueries=newProperties();try{fis=newFileInputStream(arquivo);queries.load(fis);fis.close();sql=queries.getProperty(funcao);returnsql;}catch(IOExceptione){System.out.println(e.getMessage());returnsql="Erro ao ler o arquivo";}}
Arquivo sql.properties :
#Teste
#Criado em Abril
getSUsuario=Select * from tb_login where usuario = ?
Rafael, mas fazendo getClass().getResouceAsStream() não vai partir do diretório onde o .class se localiza?
Rafael_Steil
Ele procura no classpath.
Rafael
_fs
Saquei, valeu
Luiz_Henrique_Coura
A forma como vc está pegando os dados de seu properties não está muito legal, vendo q vc está abrindo seu arquivo toda vez q vc quer ler uma SQL nova.
tRuNkSnEt:
Metodo:
publicStringgetSQL(Stringfuncao)throwsFileNotFoundException,IOException{FileInputStreamfis=null;Filearquivo=newFile("sql.properties");Propertiesqueries=newProperties();try{fis=newFileInputStream(arquivo);queries.load(fis);fis.close();sql=queries.getProperty(funcao);returnsql;}catch(IOExceptione){System.out.println(e.getMessage());returnsql="Erro ao ler o arquivo";}}
…
Uma dica seria vc ler esse artigo (Retirando a SQL do seu código java) aqui do guj onde é usado o padrão singleton para manipular esse .properties.
É bem prático e fácil de entender.
tRuNkSnEt
Corrigindo …
java.io.FileNotFoundException: \sql.properties (O sistema não pode encontrar o arquivo especificado)
Realmente o erro estava na localização do arquivo. Mas eu estava com a mesma duvida do LIPE ai fui procurar no livro ele realmente dissse que ele procura no classpath.
Ahram percebi os erros lendo o tutorial, mas chega em uma hora que ele diz assim …
Você não precisa saber o que é um Singleton. É basicamente uma solução para você não fazer uma classe que tenha tudo static, desta maneira, você perderia a orientação a objetos.
Ta mas eu quero saber o que é singleton, entao, o que é singleton??
_fs
É uma pattern que garante que apenas uma instância (ou x instancias) de um objeto existe para a aplicação inteira.
Mas é altamente não recomendado para coisas além de um arquivo .properties. Nesse caso é interessante usar, pois se existirem mais instâncias não será um problema. Mas se sua aplicação depende disso, melhor procurar outras soluções.
Rafael_Steil
Eh um Pattern (ou anti-pattern, dependendo de quem analisar) que voce geralmente usa quando quer permitir / ter uma unica instancia da classe. Veja mais em http://c2.com/cgi/wiki?SingletonPattern, ou mesmo buscando por “singleton” no forum.
Rafael
Luiz_Henrique_Coura
O padrão singleton te assegura que irá existir somente uma única instância de determinada classe. Por exemplo:
Queries.java
publicclassQueries{privatestaticQueriesqueries;privatePropertiesmyQueries;//detalhe: o construtor default deve ser privado, assim vc assegura q ninguém vai instanciar sua classe com new Queries()privateQueries(){try{FileInputStreamfis=newFileInputStream(newFile("sql.properties"));myQueries=newProperties();//aqui eu carrego meu arquivo em meu PropertiesmyQueries.load(fis);fis.close();}catch(Exceptione){e.printStackTrace();}}//aqui vc pega a instância "única" de sua classe. Todos q entrarem aqui irão pegar a referência a instância static queries.publicstaticQueriesgetInstance(){if(queries=null){queries=newQueries();}returnqueries;}//esse método eu copiei do artigo q te passei. Repare q ele recebe a string e pega no Properties já setado.publicPreparedStatementgetPreparedStatement(Connectionconn,StringqueryName)throwsSQLException{Stringquery=this.queries.getProperty(queryname);returnconn.prepareStatement(query);}
...if(queries==null){queries=newQueries();}...//esse método eu copiei do artigo q te passei. Repare q ele recebe a string e pega no Properties já setado.publicPreparedStatementgetPreparedStatement(Connectionconn,StringqueryName)throwsSQLException{Stringquery=this.myQueries.getProperty(queryname);returnconn.prepareStatement(query);}
tRuNkSnEt
Sim Luiz Henrique fiz seguindo os ideiais do o tutorial, ja esta no padrao singleton, so que ainda nao fucniona, estou com problemas ao dar o load no arquivo … ele nao esta achando.
java.io.FileNotFoundException: \br\com\projeto\sql.properties (O sistema não pode encontrar o arquivo especificado)
Então tentei usar isso …Nao perguntei antes porque eu quiz pesquisar sobre mas nao achei muita indicação sobre esse comando. Sei que ele retorna um InputStream mas como eu uso isso dentro de FileInputStream, da tipos incompativeis.
query.load(newFileInputStream(file));
O que eu preciso não é de um File??
renatosilva
Você está numa aplicação web, não é? Será que não deveria fazer isso:
Note que voce tem que colocar na raiz do WEB-INF/clases, e nao no diretorio do .class
Rafael
Luiz_Henrique_Coura
e ae tRuNkSnEt, funcionou?
tRuNkSnEt
Sim perfeitamente, o que estava faltando era mais conhecimento … peguei alguns tutoriais de manipulação de arquivo, mas uns treco de singleton, mas algumas coisas adicionais e ficou 10 :). Já apliquei os conhecimentos no meu projeto de iniciação cientifica e por agora estou estudando novas tecnologias como JSF + Hibernate, o que vai melhorar ainda mais a aplicação uma vez que estamos dando enfase no modelo MVC.
Como esse anos estamos aprendendo IA + Sistemas multiagentes logo estaria postando minhas “infinitas” duvidas sobre JADE aqui no forum! UhAUhAUH