Agenda. Gravar compromissos repetidos em um determinado período no banco de dados

Olá pessoal,
Vou tentar explicar a situação.
Estou tentando criar uma agenda para a marcação de horários de alunos em uma academia e tenho um problema, antes de mais nada sou iniciante em java, então peço desculpas se estou cometendo erros primários.
Na minha agenda existe uma opção para repetir compromissos (por exemplo, caso o horário agendado seja na segunda-feira ele se repetirá por todas as segundas até uma data definida pelo usuário). O problema está em como eu gravo essa repetição de eventos no banco de dados.
Ex.: O aluno “X” está agendado para todas as segundas até dezembro de 2018.
As opções de repetição de eventos são, semanalmente, a cada 2 semanas, a cada 15 dias e mensalmente.
Alguém pode me dar uma luz de como fazer essa gravação no banco?

DAO:

public void create(AgendaAlunos horAlunos) {

    Connection con = ConnectionFactory.getConnection();
    PreparedStatement stmt = null;

    try {
        stmt = con.prepareStatement("INSERT INTO agendaAlunos (aluno, dataescolhida, periodo, repetirevento, profissional, horariochegada, "
                + "horariosaida, idcadalunos)"
                + "VALUES(?,?,?,?,?,?,?,?)");

        stmt.setString(1, horalunos.getAluno());
        stmt.setTimestamp(2, new Timestamp(horAlunos.getDataescolhida().getTime()));
        stmt.setTimestamp(3, new Timestamp(horAlunos.getPeriodo().getTime()));
        stmt.setString(4, horAlunos.getRepetirevento());
        stmt.setString(5, horAlunos.getProfissional());
        stmt.setString(6, horAlunos.getHorariochegada());
        stmt.setString(7, horAlunos.getHorariosaida());
        stmt.setInt(8, horAlunos.getIdalunos().getIdCadastroAlunos());

        stmt.executeUpdate();

        JOptionPane.showMessageDialog(null, "Salvo com sucesso");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao salvar:" + ex);
    } finally {
        ConnectionFactory.closeConnection(con, stmt);
    }
}

Método para calcular datas futuras:

public Date addDate(int field, int amount, Date origDate) {

    GregorianCalendar gcal = new GregorianCalendar();
    try {
        gcal.setTime(origDate);
        gcal.add(field, amount);
    } catch (Exception e) {
    }
    return (new Date(gcal.getTime().getTime()));
}

Onde faço a repetição dos compromissos (não sei se está no lugar certo também):

private void jDateChooserPeriodoPropertyChange(java.beans.PropertyChangeEvent evt) {

    try {

        double dataAtual = jCalendar2.getDate().getTime();
        double dataFinal = jDateChooserPeriodo.getDate().getTime();
        double periodoSemanas = (((dataFinal - dataAtual) + 3600000) / 86400000L) * 0.142857142857143;
        double periodoDias = ((dataFinal - dataAtual) + 3600000) / 86400000L;
        double periodoMeses = (((dataFinal - dataAtual) + 3600000) / 86400000L) * 0.0328767123287671;

        System.out.println("Periodo em semanas:" + periodoSemanas);
        System.out.println("Period em dias:" + periodoDias);
        System.out.println("Periodo em meses:" + periodoMeses);

        String strData = lbDataAlunos.getText();
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");

        switch (cbRepetirEvento.getSelectedIndex()) {

            case 0:
                break;
            case 1:
                //Repetir eventos semanalmente
                try {
                    java.sql.Date data2 = new java.sql.Date(format.parse(strData).getTime());
                    for (int i = 1; i < periodoSemanas; i++) {
                        System.out.println("-------------------------------");
                        String d = format.format(this.addDate(Calendar.WEEK_OF_MONTH, i, data2));
                        System.out.println("Data +1 semana: " + d);
                    }
                } catch (ParseException ex) {
                    Logger.getLogger(TelaAgenda.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 2:
                //Repetir eventos a cada 2 semanas                    
                try {
                    java.sql.Date data2 = new java.sql.Date(format.parse(strData).getTime());
                    for (int i = 2; i < periodoSemanas; i += 2) {
                        System.out.println("-------------------------------");
                        String d = format.format(this.addDate(Calendar.WEEK_OF_MONTH, i, data2));
                        System.out.println("Data +2 semanas: " + d);
                    }
                } catch (ParseException ex) {
                    Logger.getLogger(TelaAgenda.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 3:
                //Repetir eventos a cada 15 dias                    
                try {
                    java.sql.Date data2 = new java.sql.Date(format.parse(strData).getTime());
                    for (int i = 15; i < periodoDias; i += 15) {
                        System.out.println("-------------------------------");
                        String d = format.format(this.addDate(Calendar.DAY_OF_MONTH, i, data2));
                        System.out.println("Data +15 dias: " + d);
                    }
                } catch (ParseException ex) {
                    Logger.getLogger(TelaAgenda.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;

            case 4:
                //Repetir eventos mensalmente                  
                try {
                    java.sql.Date data2 = new java.sql.Date(format.parse(strData).getTime());
                    for (int i = 1; i < periodoMeses; i++) {
                        System.out.println("-------------------------------");
                        String d = format.format(this.addDate(Calendar.MONTH, i, data2));
                        System.out.println("Data +15 dias: " + d);
                    }
                } catch (ParseException ex) {
                    Logger.getLogger(TelaAgenda.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
        }
    } catch (Exception e) {
    }

Agradeço se puderem ajudar

Bem na verdade tem um jeito mais simples, crie um variável no banco que sirva para evento de frequência, nessa variável coloque os dias da semana, assim na hora de consultar, você pode optar por olhar primeiro nos dias da semana caso não seja um evento de frequência só pode ser um evento de data especifica, para ficar mais simples olha no exemplo a baixo.



id int
seg boolean
ter boolean
qua boolean
qui boolean
sex boolean
data_especifica Date

Depois quando voce fizer a consulta para saber se o evento esta ativo.
if(seg == true){
//função da segunda feira
}else if( ter == true){
//função da terça feira
} else if( qua == true){

}else if(Date == new Date()){

}

Essa estrutura pode ser montada tanto em SQL utilizando as funções de validação do SQL como pode também ser feita no java

Um jeito mais simples pode ser definir um inteiro de que represente os dias da semana tipo
0 = nenhum
1 = seg
2 = ter

7 = Dom

depois usar um switch(num){
case 0:
//Data Unica
if(Date = new Date()){
}
break;
case 1:
// Somente de Segunda feira
if( Date.IsMonday() ){
///
}
break;

//vai assim ate domingo que seria o case 7
}

Eu entendi mais ou menos, como falei tô iniciando. Vou tentar aplicar o que falasse e qualquer coisa volto aqui
Obrigado

Consegui, apenas coloquei as funções de calcular as datas futuras no botão salvar

Uma coisa que vc tem que tomar cuidado é:

se vc gravar na agenda eventos repetidos, vc vai gravar até onde?

o cara tem um contrato de um ano. vc va gravar até o ano que vem? quando vc vai agendar os novos?

pq eu falo isso: num dado sistema q eu trabalhei no passado havia um cadastro de feriados. ai galera gravou feriados pelos proximos 5 anos. adivinha o que deu problema no sexto ano?

foi um deus nos acuda.

Não sei se entendi os questionamentos, mas o evento se repete até uma data escolhida em um jDataChooser…seria onde terminaria o contrato. Em caso de renovação teria que refazer o agendamento, até a determinada data e assim por diante. Com relação aos feriados não havia me dado conta. Tem como prever os feriados e por exemplo não agendar no neste dia?