Olá pessoal!!!Fiz um metodo para acessar o rs.getInt,pois vou usar um classe para controlar todos as minhas query!!
o problema é que esse metodo pode retornar String,Int Qualqer coisa certo? Qual retorno eu devo usar nesse caso?
Se fiz errado como devo fazer??
Desde já agradeço!!
public int getIntRs(int column ){
-----------------try {
--------------------- return rs.getInt(column);
------------------} catch (SQLException e) {
---------------------JOptionPane.showMessageDialog(null,“Arquivo não Achado”);
-------------}
-----}
}
Não entendi sua duvida, mas se você quer retornar vários tipos de informações diferentes, estude sobre Generic. Certamente você vai encontrar o que precisa.
Outra forma é retornar um Object, mas acho a solução de Generic mais limpa, pois assim não irá precisar fazer cast no seu código
Cleber, por favor, leia o link a seguir antes de postar seus códigos. Fica mais fácil de ler e vc não precisa fazer essa “gambiarra” p/ identar seu código.
Quanto a sua dúvida, seu método é redundante! Pq vc precisa de um método para fazer algo que outro método já faz?
Como o Jair falou, talvez falte explicar melhor o que você quer. Talvez tipos Genéricos resolvam seu problema.
public Object getFieldValue(int column ){
try {
ResultSetMetaData rsmd = rs.getMetaData();
switch (rsmd.getColumnType(column)){
case Types.VARCHAR:
String str = rs.getString(column);
return str;
case Types.INTEGER:
Integer inteiro = rs.getInt(column);
return inteiro;
case Types.DATE:
Date data = rs.getDate(column);
return data
case Types.TIME:
Time hora = rs.getTime(column);
return hora;
case Types.DOUBLE:
Double valorduplo = rs.getDouble(column);
return valorduplo;
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,"Arquivo não Achado");
}
}
Agora recuperando o valor de getFieldValue;
Object valor = Query.getFieldValue(7);
if (valor instanceof String){
String strvalor = (String)valor;
} else if (valor instanceof Integer){
Integer intvalor = (Integer)valor;
} else if (valor instanceof Date){
Date valordata = (Date)valor;
} else if (valor instanceof Time){
Time horavalor = (Time)valor;
} else if (valor instanceof Double){
Double valorduplo = (Double)valor;
}
Como disse o nosso amigo Leandroleo, realmente fica não só meio como muito trabalhoso, apenas fiz para mostrar a voce que dá pra fazer, porém o melhor é voce recuperar essa dado direto do ResultSet mesmo, ou seja, quando voce já souber de ante mão o tipo de dado que se recupera de cada coluna.
A solução do discorpio me parece no caminho certo, mas me parece também meio redundante não?
Digo isso pois é feita uma verificação no tipo do retorno da coluna, depois é feito um cast para se obter o tipo de objeto desejado (STring, int, date, etc) e daí se joga ele para cima como um Object. E do outro lado se pega esse Object verifica qual a o tipo (instanceof) e se realiza o cast novamente.
Não seria mais simples algo como:
public Object getFieldValue(int column) {
return rs.getObject(column);
}
// recuperando o valor do getFieldValue (em outro método/classe)
Object valor = Query.getFieldValue(7);
if (valor instanceof String){
String strvalor = (String)valor;
} else if (valor instanceof Integer){
Integer intvalor = (Integer)valor;
} else if (valor instanceof Date){
Date valordata = (Date)valor;
} else if (valor instanceof Time){
Time horavalor = (Time)valor;
} else if (valor instanceof Double){
Double valorduplo = (Double)valor;
}
Eu tenho que usar get por que eu estou usando a classe Query para fazer todas as consultas,alias se eu fizesse direto nao seria uma linguagem a objeto certo,ou não?
Se eu usar gets e sets e talz melhorarei meu programa para fazer manuntenção e talz!
Eu preciso usar um get,mas não quero usar todo esse procedimnto.
Arrumei o programa agora conseguimos ver melhor!!
public ______ getIntRs(int column ){
try {
return rs.getInt(column);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,"Arquivo não Achado");
}
}
}
Algumas ideias pode até dar certo mas são muito longas!!Não tem como melhorar?
Particularmente eu não tenho nada contra e até uso-o bastante. :roll:
Contudo, permita-me perguntar, Viny:
O que voce tem contra criar uma classe genérica DAO que sirva para todas as tabelas e que encapsule todos os campos :?:
Se existe uma maneira que possa criar esse DAO usando os Gets diretamente (Detalhe, se é que voce se refere aos Gets da classe ResultSet), por favor então nos diga como. :idea:
Pelo menos foi o que entendi o que o nosso amigo CleberJoseRossi quer fazer. Inclusive estou tentando criar um DAO Factory que faz exatamente isto, por que já estou cansado de ficar criando tanto DAO quanto o número de tabelas do banco :x
Valeu Brunoskrebs, realmente não sabia que a classe ResultSet tinha um método que retorna Object, e isto, confesso, é preguiça minha de pesquisar.
VOU EXPLICAR DE NOVO!
Tenho um formulario que chama FrmFuncionarios!!Pois bem preciso fazer um aconsulta no formulario para alguns finz que nao convem citar,continuando…primeiramente criei uma classe que chama Query,nela coloquei todos os metodos que eu preciso para fazer desde uma inserção até uma consulta,criei essa classe para nao precisar ficar escrevedo toda vez a mesma coisa no meu formulario e tambem para ficar mais organizado meu aplicativo.
Indo ao oque interessa quando eu fiz o metodo getIntRs eu queria usa-lo para obter o resulatado do campo e talz.
Mas os campos são de varios tipos então ai que entra a minah duvida!!
public [Que Cammpo eu uso???] getIntRs(int column ){
try {
return rs.getInt(column);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,"Arquivo não Achado");
}
}
}
Então, vou responder as perguntas que você fez para o Vinícius com uma pergunta
Pq não usar um framework ORM como o Hibernate?
Hoje em dia, com as facilidades fornecidas seja do Hibernate puro, ou usando a implementação JPA, ou mesmo qualquer outra implementação como o EclipseLink ou o Topliink, a criação de DAOs “genéricos” é quase que totalmente desnecessária.
Eu vejo o pessoal tentando reinventar a roda e não entendo o pq. Pelo que me parece, isso é gostar de sofrer.
[quote=CleberJoseRossi]VOU EXPLICAR DE NOVO!
Tenho um formulario que chama FrmFuncionarios!!Pois bem preciso fazer um aconsulta no formulario para alguns finz que nao convem citar,continuando…primeiramente criei uma classe que chama Query,nela coloquei todos os metodos que eu preciso para fazer desde uma inserção até uma consulta,criei essa classe para nao precisar ficar escrevedo toda vez a mesma coisa no meu formulario e tambem para ficar mais organizado meu aplicativo.
Indo ao oque interessa quando eu fiz o metodo getIntRs eu queria usa-lo para obter o resulatado do campo e talz.
Mas os campos são de varios tipos então ai que entra a minah duvida!!
public [Que Cammpo eu uso???] getIntRs(int column ){
try {
return rs.getInt(column);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,"Arquivo não Achado");
}
}
}
[/quote]
Cleber! Olhe o nome do seu método! getInt. O que ele retorna? Um int, o mesmo que vem do ResultSet! O que não estamos entendendo é pq vc quer um método p/ servir de “casca” para um outro método. Se o seu método vai ser genérico, pq ele chama getInt??? Quer continuar com isso? O exemplo do discorpio usando o ResultSetMetadata é uma alternativa ao seu get genérico, mas sinceramente, tudo isso é perda de tempo. Vc está tentando complicar demais o que não precisa ser complicado.
[quote=davidbuzatto][quote=CleberJoseRossi]VOU EXPLICAR DE NOVO!
Tenho um formulario que chama FrmFuncionarios!!Pois bem preciso fazer um aconsulta no formulario para alguns finz que nao convem citar,continuando…primeiramente criei uma classe que chama Query,nela coloquei todos os metodos que eu preciso para fazer desde uma inserção até uma consulta,criei essa classe para nao precisar ficar escrevedo toda vez a mesma coisa no meu formulario e tambem para ficar mais organizado meu aplicativo.
Indo ao oque interessa quando eu fiz o metodo getIntRs eu queria usa-lo para obter o resulatado do campo e talz.
Mas os campos são de varios tipos então ai que entra a minah duvida!!
public [Que Cammpo eu uso???] getIntRs(int column ){
try {
return rs.getInt(column);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,"Arquivo não Achado");
}
}
}
[/quote]
Cleber! Olhe o nome do seu método! getInt. O que ele retorna? Um int, o mesmo que vem do ResultSet! O que não estamos entendendo é pq vc quer um método p/ servir de “casca” para um outro método. Se o seu método vai ser genérico, pq ele chama getInt??? Quer continuar com isso? O exemplo do discorpio usando o ResultSetMetadata é uma alternativa ao seu get genérico, mas sinceramente, tudo isso é perda de tempo. Vc está tentando complicar demais o que não precisa ser complicado.[/quote]
o metodo chama getIntRs por que existe uma metodo no rs que chama getInt o qual voce coloca o numero da coluna e ele retorna o valor dela!!
só que o rs é privado então tenho que fazer um metodo para acessa-lo certo???Mas eu nao sei oque ele retorna !!eu vou ter mesmo que fazer oque o discorpio disse?
Cleber, poe sua classe Query de lado e pesquisa sobre o design pattern DAO (data access object). Tem um mundo de coisa na Web.
Se não quiser ficar reinventando a roda, use um framework ORM como o Hibernate.
Se quiser continuar com o get genérico, siga o exemplo do discorpio, dê uma melhorada e boa sorte
Então, vou responder as perguntas que você fez para o Vinícius com uma pergunta
Pq não usar um framework ORM como o Hibernate?
Hoje em dia, com as facilidades fornecidas seja do Hibernate puro, ou usando a implementação JPA, ou mesmo qualquer outra implementação como o EclipseLink ou o Topliink, a criação de DAOs “genéricos” é quase que totalmente desnecessária.
Eu vejo o pessoal tentando reinventar a roda e não entendo o pq. Pelo que me parece, isso é gostar de sofrer.
[]´s
[/quote]
Olha David, não gosto muito de usar Frameworks já prontos, isto porque engessa muito a minha criatividade, para lhe ser sincero, eu prefiro criar meu próprio framework. Contudo, vou aceitar a sua sugestão e dar uma olhada no Hibernate, isto porque já andei pesquisando sobre JPA e confesso que gostei um pouco.
Depois de re-ler tudo eu consegui entender o que o Cleber deseja e posso dizer que a solução está com problema.
Como o David já disse, você está chamando getInt do ResultSet e esse cara vai te retornar um Int, assim como existe o getString, getLong e por ai vai. Claro que na pratica existe um cara chamado getObject que é mais genérico, entretanto a sua solução não me cheira bem. Vamos alguns pontos:
Esse método simplesmente pega uma row do seu ResultSet e retorna um valor, porém onde está a construção do ResultSet? onde está o Iterator do ResultSet? É algo assim que você está fazendo?
Query query = //constroi a query
query.rodaAMihaQueryMagica();
query.getInt(2); //retorna o que eu quero
Se estiver assim, porque não encapsula tudo em um método e retorna o objeto do dominio já populado? O mesmo serve para a inclusão, porque pelo que eu entendi, você está fazendo setXXX, setYYY de cada atributo e depois roda o método da query p/ fazer a inclusão. O correto é popular o objeto e o Query, ops, o DAO possui o código para inclusão.
Na solução atual, o seu getInt simplesmente está fazendo uma “casquinha” para o getInt do ResulSet, sem nenhuma regra de negócio ou algo do tipo. De fato não faz sentido. Agora se você ainda quer, na sua classe de serviço, pegar campo por campo, retorna o ResultSet para a classe de serviço e lá você pode fazer um rs.getInt, rs.getString e por ai vai. (ps: não aconselho porque você vai estar misturando a responsabilidade de persistência/consulta em classes distintas).
Como david já disse: Estude melhor sobre o padrão DAO. Se ainda tiver tempo de mudar os frameworks da sua aplicação, aconselho estudar o Hibernate ou mesmo JPA.
Não sei se fui claro, porém aconselho fortemente rever esse lado de persistência das suas classes.
Respeito a sua opinião contra frameworks prontos, porém aconselho você estudar o Hibernate e ver o poder dos frameworks ORM e como eles facilitam a nossa vida.
Certamente é muito mais fácil persistir um objeto já populado usando simplesmente o método session().save(objeto); do que montar a linguiça de um INSERT INTO…
Na grande maioria dos casos, uma simples classe de DAO genérica (o hibernate tem um exemplo: http://community.jboss.org/wiki/GenericDataAccessObjects) já é o suficiente para toda a aplicação. (existem casos que você precisa fazer um extend dela, mas geralmente isso ocorre quando você precisa de uma query dinamica e complexa).
Agora o mais importante para quem vem do mundo relacional (banco de dados tradicionais e JDBC) é a mudança de paradigma. Com Hibernate ou outro framework ORM, você não pensa mais em TABELAS, CAMPOS, INSERT, DELETE, UPDATE. Você pensa em OBJETOS. Ora, se estamos trabalhando com OO, porque não pensar em objetos na hora de persistir os dados?
Junto com essa quebra de paradigma, conceitos como objetos gerenciados, detached, new, etc é importante de entender. Mas certamente o Hibernate de trás uma produtividade enorme, seja em pequenos software ou até mesmo softwares grandes.
ps: Um caso onde o Hibernate não é total aconselhado é no caso de queries de alto desempenho, nesse quesito o JDBC é melhor. Entretanto nada de impede de criar uma query nativa mesmo usando o Hibernate. Porém na minha experiência prática de alguns anos, quando precisamos de uma query de alto desempenho, nada como montar uma storedprocedure no banco de dados e deixar ele fazer o trabalho pesado. Claro que existe o contra de ficar dependente do banco de dados, por isso tem que avaliar se essa query de alto desempenho realmente é importante ou não.
Primeiramente, reitero TUDO que o Jair falou.
Da mesma forma que o Jair respeita sua opinião de criar seus próprios frameworks, eu tbm respeito, mas não concordo em alguns casos.
É legal criar um DAO quando vc está aprendendo, separar as responsabilidades das classes, etc, mas chega um ponto que você vê que implementar sua solução para um determinado problema recorrente, que no caso que estamos discutindo é a persistência, só leva a perda de tempo e de produtividade. Na informática como um todo, se a gente parar no tempo, ficamos fadados ao fracasso. Por isso digo novamente. Estude o Hibernate, aprenda o que ele faz, você vai se surpreender, isso eu garanto p/ vc.