Lembrete de Aniversariantes em Java + Mysql

Fala Pessoal blz, então, estou fazendo um programa em Java que cadastra pessoas no banco de dados, até ai tranquilo consegui fazer com sucesso, porém me foi solicitado fazer uma nova funcionalidade no meu programa, que é fazer um lembrete dos aniversariantes do mês, ai já começa meus problemas porque minha data no banco está em String eu salvei com a mascara do campo txt do Java, e pelo que andei pesquisando vou ter que usar o Date e o Calendar, e eu nem sei pra onde vai kkkk então eu estou com esses seguintes problemas:

  • Buscar as datas no banco e converter pra Date em java para poder fazer cálculos
  • fazer o cálculo
  • exibir os aniversariantes na jTable

O código que eu fiz na verdade está longe de funcionar eu sei que está errado mas eu tentei aplicar as ideias quem poder me dar sugestões

package view;

import dal.ConexaoBancoDeDados;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JOptionPane;
import net.proteanit.sql.DbUtils;

/**
 * @author Omega
 */
public class Aniversario extends javax.swing.JFrame {
  
  Connection conn = null;
  PreparedStatement pst = null;
  ResultSet rs = null;
  
  /**
   * Creates new form visitante
   */
  public Aniversario() {
    initComponents();
    conn = ConexaoBancoDeDados.conector();
    pesquisar();
  }
  
  private void pesquisar() {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Calendar cal = Calendar.getInstance();
    String sql = "select nascimento from membroecolaborador";
    
    try {
      pst = conn.prepareStatement(sql);
      rs = pst.executeQuery(sql);
      
      Date dataFormatada = sdf.parse(rs.getString(4));
      cal.setTime(dataFormatada);
      int ano = cal.get(Calendar.YEAR);
      Date atualData = new Date();
      cal.setTime(atualData);
      int anoAtual = cal.get(Calendar.YEAR);
      int age = anoAtual - ano;
      
      if (Calendar.MONTH == atualData.getTime()) {
        tblMembros.setModel(DbUtils.resultSetToTableModel(rs));
      }
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, e);
    }
  }
}

Mais ou menos isso, quando fazer os cálculos aparece na jTable as pessoas que fazem aniversário no mês

@Renan_Ramos1
Você até vai conseguir fazer porque em programação tudo é possível.
Porém se fizer do jeito correto você terá um trabalho muito menor e uma aplicação com desempenho superior uma vez que poderá passar todo o “trabalho” da pesquisa para o banco e você não precisará tratar nada.
Fiz um exemplo muito simples para ilustrar:

        DROP TABLE IF EXISTS `aniversariantes`; 
        --cria uma tabela de testes
        CREATE TABLE `aniversariantes` (
          `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
          `nome` VARCHAR(32) NOT NULL,
           `aniversario` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (`id`)
         ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
          --popula uma tabela de testes
     insert into aniversariantes (id,nome,aniversario) values (1,"juca",'2021-01-01 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (2,"pedro",'2021-01-01 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (3,"amilton",'2021-01-01 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (4,"emirval",'2021-04-04 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (5,"alonsio",'2021-01-05 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (6,"juvncio",'2021-01-04 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (7,"candido",'2021-01-05 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (8,"ernesto",'2021-01-06 00:00:00');
     insert into aniversariantes (id,nome,aniversario) values (9,"ariosvaldo",'2021-04-01 00:00:00');
 
 --seleção só dos aniversariantes de abril
 Select * from aniversariantes where aniversario between '2021-04-01 00:00:00' and '2021-04-30 23:59:59';
 
 
 saída no console
 
id	nome	         aniversario
4	emirval	         2021-04-04 00:00:00
9	ariosvaldo	     2021-04-01 00:00:00

Veja que no select você já consegue passar o intervalo que precisa na busca.

Da maneira que você comenta no enunciado você terá sempre que trazer toda a sua base de dados para a memoria do programa e depois tratar para filtrar seus dados. Vai funcionar enquanto você trabalhar com poucas linhas mas se sua base crescer muito você terá problemas.

Não conheço o contexto da sua necessidade mas pressupondo que você criou algo do zero e apenas precisa adicionar uma feature acredito que seja mais fácil fazer certo do zero do que ajustar para funcionar de uma maneira menos correta.

1 curtida