Galera,Estou com problema na hora de selecionar do banco a data , ele vem com formato : yyyy-mm-dd , faço a inserção normal dd-mm-yyyy.
teria alguma forma de buscar do banco com formato brasileiro, eu pesquisei alguns posts mas não consegui achar o que eu precisava.
Aqui esta meu select
public List<Cliente> getLista (String nome) throws SQLException {
String sql ="select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE cliente.nome like ? ";
List<Cliente> minhaLista;
try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
stmt.setString(1, nome);
try (ResultSet rs = stmt.executeQuery()) {
minhaLista = new ArrayList<Cliente>();
while (rs.next()) {
Cliente c1 = new Cliente();
c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
c1.setNome(rs.getString("nome"));
c1.setTelefone(rs.getString("telefone"));
c1.setCpf(rs.getString("cpf"));
c1.setEmail(rs.getString("email"));
c1.setDatanascimento(rs.getDate("datanascimento"));
c1.setObservacao(rs.getString("observacao"));
Endereco e = new Endereco();
e.setEndereco(rs.getString("endereco"));
e.setCidade(rs.getString("cidade"));
c1.setEndereco(e);
minhaLista.add(c1);
}
rs.close();
stmt.close();
return minhaLista;
}
}
}
Se alguém pode me ajudar com dicas etc…Agradecerei muito.
Cara possível até é, mas é trabalhoso, pois você teria de ter configurado isso (formato da data) quando se cria a estrutura do banco (base, tabelas, etc) e sinceramente não compensa.
Vi que você traz do banco um objeto do tipo Date (dataNascimento) e seta direto no seu objeto pelo método setDataNascimento correto?
se o que você precisa é somente exibir a data formatada, crie um método a mais na sua classe para retornar um String com a data no formato que deseja e utilizando a classe SimpleDateFormat, ex:
public String getDataNascimento(String formato) {
return new SimpleDateFormat(formato).format(dataNascimento); // desde que dataNascimento seja java.util.Date
}
Depois para usar basta:
cliente.getDataNascimento("dd/MM/yyyy");
Dessa forma você não precisa mexer em nada no banco nem na conexão com ele, somente na classe Cliente para exibir a data no formato que quiser já que é um parâmetro e você não está preso ao formato nacional.
Espero ter ajudado.
Aqui esta minha classe CLiente.
public class Cliente {
int codcliente;
String nome;
String cpf;
String telefone;
Date datanascimento;
String email;
String observacao;
Endereco endereco;
public Cliente(){
datanascimento = new Date();
}
public String getDataFormatada() {
SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");
String dataFormat = formatado.format(datanascimento);
return dataFormat;
}
public Date getDatanascimento() {
return datanascimento;
}
public void setDatanascimento(Date datanascimento) {
this.datanascimento = datanascimento;
}
}
Com ela na hora de inserir e de boa.inseri no formato nacional.mas no banco ele só puxa o padrão americano
So se na minha classe estiver algo errado,pq ela já esta formatada né?
Obrigado por esta me ajudando.
Como assim formato nacional no banco, aparece a data no formato dd/MM/yyyy na coluna/campo do banco, só se for access não?
Agora o que eu sei é a classe Date possui recursos para entender o formato que você declara, e na hora de inserir na base via PreparedStatement ele converte para o formato universal (e não americano, pois o padrão americano é MM/dd/yyyy).
No banco ele aparece universal igual vc falo.pois ele inseri formato brasileiro ,mas só que quando eu pesquiso ele não vem no formato brasileiro.
Tem uma ideia do que posso fazer ? estou pesquisando em outros fórum tmb mas ate agora nada.
[quote=junio103]No banco ele aparece universal igual vc falo.pois ele inseri formato brasileiro ,mas só que quando eu pesquiso ele não vem no formato brasileiro.
Tem uma ideia do que posso fazer ? estou pesquisando em outros fórum tmb mas ate agora nada.[/quote]
Então como te falei no post anterior, agora que você me confirmou que o banco está da mesma forma, na verdade a classe Date engana você, pois como disse, ela tem recursos para entender uma data dd/MM/yyyy e convertê-la para yyyy-mm-dd pois as classes de conexão do Java sabem na hora da conexão qual formato o banco trabalha daí ele converte pro banco entender, pescou?
E na boa, se você já tem o banco pronto não vale a pena ficar esquentando a cabeça por uma coisa dessas, o trabalho que você terá de fazer na estrutura do banco vai te desanimar.
E outra os SGBD’s já trabalham com datas nesse formato justamente por questões de compatibilidade e performance, não vale a pena mexer com isso não véi.
Sim entendi .
Mas como eu vou fazer para mostrar a data corretamente para o usuário ,dd-mm-yyyy , eu não posso mostrar yyyy-mm-dd,
Certamente deve ter alguma forma.
Preciso de ajuda em como fazer isso.
[quote=junio103]Sim entendi .
Mas como eu vou fazer para mostrar a data corretamente para o usuário ,dd-mm-yyyy , eu não posso mostrar yyyy-mm-dd,
Certamente deve ter alguma forma.
Preciso de ajuda em como fazer isso.[/quote]
Você não testou seu próprio método não é?
public String getDataFormatada() {
SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");
String dataFormat = formatado.format(datanascimento);
return dataFormat;
}
Eu ainda tinha lhe mostrado uma forma menos amarrada quanto ao formato lembra?
public String getDataNascimento(String formato) {
return new SimpleDateFormat(formato).format(dataNascimento);
}
Dessa forma você pode passar qualquer formato para exibir a data de nascimento do clientte:
Cliente cliente = new Cliente();
System.out.println("Formato nacional com barras: " + cliente.getDataNascimento("dd/MM/yyyy"));
System.out.println("Formato nacional com hifens: " + cliente.getDataNascimento("dd-MM-yyyy"));
System.out.println("Hora completa: " + cliente.getDataNascimento("HH:mm:ss"));
Você pode ficar na dúvida e perguntar “Mas eu já tenho um método getDataNascimento() que me retorna um Date, como posso ter outro que retorna uma String?”
A resposta: Polimorfismo com sobrecarga de métodos.
Faça alguns testes e veja o resultado.
Eu fiz do seu jeito para tentar mostrar a pesquisa no formato certo , mas não consegui.
Minha pesquisa sai desse formato
1 Flavio (12)3123-1231 123.123.123-12 Flavio@ (2012-12-15) Quadra 1b / não esta saindo formato brasileiro
Aqui esta a classe
public class Cliente {
int codcliente;
String nome;
String cpf;
String telefone;
Date datanascimento;
String email;
String observacao;
Endereco endereco;
public Cliente(){
datanascimento = new Date();
}
public String getDataFormatada() {
SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");
String dataFormat = formatado.format(datanascimento);
return dataFormat;
}
public String getDataNascimento(String formatado) {
return new SimpleDateFormat(formatado).format(datanascimento);
}
public Date getDatanascimento() {
return datanascimento;
}
public void setDatanascimento(Date datanascimento) {
this.datanascimento = datanascimento;
}
Aqui esta a a Lista que pesquisa os Cliente
public class Cliente {
public List<Cliente> getLista (String nome) throws SQLException {
String sql ="select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE cliente.nome like ? ";
List<Cliente> minhaLista;
try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
stmt.setString(1, nome);
try (ResultSet rs = stmt.executeQuery()) {
minhaLista = new ArrayList<Cliente>();
while (rs.next()) {
Cliente c1 = new Cliente();
c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
c1.setNome(rs.getString("nome"));
c1.setTelefone(rs.getString("telefone"));
c1.setCpf(rs.getString("cpf"));
c1.setEmail(rs.getString("email"));
c1.setDatanascimento(rs.getDate("datanascimento"));
c1.setObservacao(rs.getString("observacao"));
Endereco e = new Endereco();
e.setEndereco(rs.getString("endereco"));
e.setCidade(rs.getString("cidade"));
c1.setEndereco(e);
minhaLista.add(c1);
}
rs.close();
stmt.close();
return minhaLista;
}
}
}
Outro jeito que fiz para eu buscar o cliente na data formatada e não funcionou tmb
public String getDataNascimento(String formatado) {
Cliente cliente = new Cliente();
cliente.getDataNascimento("dd/MM/yyyy");
return new SimpleDateFormat(formatado).format(datanascimento);
}
Preciso que alguém me ajude , já estou ficando loco com isso :/.Obg
[quote=junio103]Eu fiz do seu jeito para tentar mostrar a pesquisa no formato certo , mas não consegui.
Minha pesquisa sai desse formato
1 Flavio (12)3123-1231 123.123.123-12 Flavio@ (2012-12-15) Quadra 1b / não esta saindo formato brasileiro
[/quote]
Tá mas como você está exibindo essa lista? Poste apenas esse trecho pra gente ver.
Aqui esta como eu mostro a pesquisa.
private void mostraPesquisa(){
while(tmCliente.getRowCount()>0){
tmCliente.removeRow(0);
}
if(contatos.size() == 0){
JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");
}else{
String[] linha = new String[]{null,null};
for (int i = 0; i <contatos.size(); i++) {
tmCliente.addRow(linha);
tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
tmCliente.setValueAt(contatos.get(i).getDatanascimento(), i, 5);
tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);
tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);
}
}
}
}
e aqui como lista
public void listarContatos() throws SQLException{
ClienteDAO dao = new ClienteDAO();
contatos = dao.getLista("%"+jTPesquisa.getText()+"%");
}
Obrigado por estar me ajudando. :]
Beleza, agora já tentou trocar essa linha:
tmCliente.setValueAt(contatos.get(i).getDatanascimento(), i, 5);
Por essa:
tmCliente.setValueAt(contatos.get(i).getDatanascimento("dd/MM/yyyy"), i, 5);
O que acontece é o seguinte, quando se chama algo que retorne um Date, por padrão o toString() dele é configurado para mostrar a data completa com hora e tudo mais.
kkk Resolvido vc me fez ir la na classe de pesquisa e mudei o datanascimento pelo q tem formato e deu cert
Para Possíveis Pesquisas.
private void mostraPesquisa(){
while(tmCliente.getRowCount()>0){
tmCliente.removeRow(0);
}
if(contatos.size() == 0){
JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");
}else{
String[] linha = new String[]{null,null};
for (int i = 0; i <contatos.size(); i++) {
tmCliente.addRow(linha);
tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
tmCliente.setValueAt(contatos.get(i).getDatanascimento("dd/MM/yyyy"), i, 5);
tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);
tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);
}
}
}
}
Muito obrigado solidsnake , e a quem me ajudou tmb
RESOLVIDO
Beleza brother, agora posso fazer uma sugestão para melhorar um pouco seu código e deixá-lo mais performático?
essa variável tmCliente é uma JTable? se sim poderia fazer o código do mostaPesquisa() dessa forma:
private void mostraPesquisa(){
int totalLinhas = tmCliente.getRowCount() - 1;
tmCliente.removeRowSelectionInterval(0, totalLinhas);
if(contatos.size() == 0){
JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");
return; // em métodos void costuma ser muito usado, tendo um comportamento de um break
}
String[] linha = new String[]{null,null};
for (int i = 0; i <contatos.size(); i++) {
tmCliente.addRow(linha);
tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
tmCliente.setValueAt(contatos.get(i).getDatanascimento("dd/MM/yyyy"), i, 5);
tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);
tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);
}
}
Se quiser testar comente seu método original e cole esse pra ver.
Observer que aquele while é desnecessário, tendo em vista que você quer limpar a tabela para reinserir novas linhas, sempre escolha usar os métodos que api te fornece.
Segue api da classe JTable
Ae man , deu errado nessa parte aqui .
tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).
[quote=junio103]Ae man , deu errado nessa parte aqui .
tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).[/quote]
Qual exceção ele soltou?
[quote=solidsnake][quote=junio103]Ae man , deu errado nessa parte aqui .
tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).[/quote]
Qual exceção ele soltou?[/quote]
Essa aqui .
cannot find symbol
symbol: method removeRowSelectionInterval(int,int);
location>variable tm Cliente of type DefaultTableModel
[quote=junio103][quote=solidsnake][quote=junio103]Ae man , deu errado nessa parte aqui .
tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).[/quote]
Qual exceção ele soltou?[/quote]
Essa aqui .
cannot find symbol
symbol: method removeRowSelectionInterval(int,int);
location>variable tm Cliente of type DefaultTableModel
[/quote]
Foi mal cara, acabei te passando um método que remove seleção das linhas e não a linha em si, de qualquer forma seu tmCliente não é JTable correto?
Seria melhor voltar o jeito que estava. Foi mal ae.