Como formatar um campo time em Java para um banco MySql

Tenho um sistema que ele é necessário dar uma entrada tipo time, só que no banco ele só está recebendo este valor caso seja digitado o formato completo hh:mm:ss eu gostaria de saber o que preciso fazer para digitar na interface apenas hh:mm sem dar erro no sistema ao executar, os segundos para meu código são insignificantes, caso exista alguma forma de preencher com 00 pode ser uma solução para meu desenvolvimento.

O meu insert no código é este.

public int salvarCadastroPerdas(ModelPerdas pModelPerdas) {

    try {
        this.conectar();
        return this.insertSQL(
                "INSERT INTO tbl_perdas ("
                + "per_produto,"
                + "per_etapa,"
                + "per_recurso,"
                + "per_data,"
                + "per_motivo,"
                + "per_peso,"
                + "per_operador,"
                + "per_time_perda"
                + ") VALUES ("
                + "'" + pModelPerdas.getDescProduto() + "',"
                + "'" + pModelPerdas.getDescEtapa() + "',"
                + "'" + pModelPerdas.getDescRecurso() + "',"
                + "'" + pModelPerdas.getDataPerda() + "',"
                + "'" + pModelPerdas.getMotivo() + "',"
                + "'" + pModelPerdas.getPesoPerda() + "',"
                + "'" + pModelPerdas.getOperador() + "',"
                + "'" + pModelPerdas.getHoraPerda()+ "'"
                + ");"
        );
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    } finally {
        this.fecharConexao();
    }

}

E tanto no java e no mysql os dois estão como Time

Eu pesquisei e vi sobre o date_format no mysql, porém, não consegui utilizar no meu código.

Você não deve concatenar valores na query.
Utilize um PreparedStatement que daí você não precisa se preocupar com formatações, basta usar o tipo de dado apropriado para cada campo.
Se sua coluna é do tipo TIME, então utilize um objeto do tipo java.sql.Time.

2 curtidas

Meu objeto também é Time, a linha de código da tela da View é a seguinte.

modelPerdas.setHoraPerda(Time.valueOf(horaPerdas.getText()));

Só que da forma que está o meu código ele só está executando quando eu preencho o valor completo (hh:mm;ss)

Quando digito (hh:mm) da o erro:
Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException

Você poderia me dar algum exemplo por gentileza, como eu iria corrigir este erro?

Você não poderia, via código, completar com “00” para os segundos?

1 curtida

Poderia, só não sei como realizar isso.

Se problema não está nessa linha.

Seu problema está aqui:

try {
    this.conectar();
    return this.insertSQL(
                        "INSERT INTO tbl_perdas ("
                        + "per_produto,"
                        + "per_etapa,"
                        + "per_recurso,"
                        + "per_data,"
                        + "per_motivo,"
                        + "per_peso,"
                        + "per_operador,"
                        + "per_time_perda"
                        + ") VALUES ("
                        + "'" + pModelPerdas.getDescProduto() + "',"
                        + "'" + pModelPerdas.getDescEtapa() + "',"
                        + "'" + pModelPerdas.getDescRecurso() + "',"
                        + "'" + pModelPerdas.getDataPerda() + "',"
                        + "'" + pModelPerdas.getMotivo() + "',"
                        + "'" + pModelPerdas.getPesoPerda() + "',"
                        + "'" + pModelPerdas.getOperador() + "',"
                        + "'" + pModelPerdas.getHoraPerda()+ "'"
                        + ");"
    );
} catch (Exception e) {
    e.printStackTrace();
    return 0;
} finally {
    this.fecharConexao();
}

Faça assim:

try {
    String query = "INSERT INTO tbl_perdas "
            + "(per_produto, per_etapa, per_recurso, per_data, per_motivo, per_peso, per_operador, per_time_perda) "
            + "VALUES "
            + "( ?, ?, ?, ?, ?, ?, ? )";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setTipoDeDado(1, pModelPerdas.getDescProduto());
    statement.setTipoDeDado(2, pModelPerdas.getDescEtapa());
    statement.setTipoDeDado(3, pModelPerdas.getDescRecurso());
    statement.setTipoDeDado(4, pModelPerdas.getDataPerda());
    statement.setTipoDeDado(5, pModelPerdas.getMotivo());
    statement.setTipoDeDado(6, pModelPerdas.getPesoPerda());
    statement.setTipoDeDado(7, pModelPerdas.getOperador());
    statement.setTipoDeDado(8, pModelPerdas.getHoraPerda());

    return statement.executeUpdate();
} catch (Exception e) {
    e.printStackTrace();
    return 0;
}
1 curtida

Executei ele e manteve o mesmo erro, fiz algo errado?

public int salvarCadastroPerdas(ModelPerdas pModelPerdas) {

try {
    String query = "INSERT INTO tbl_perdas "
            + "(per_produto, per_etapa, per_recurso, per_data, per_motivo, per_peso, per_operador, per_time_perda) "
            + "VALUES "
            + "( ?, ?, ?, ?, ?, ?, ? )";
    PreparedStatement statement = conectar().prepareStatement(query);
    statement.setString(1, pModelPerdas.getDescProduto());
    statement.setString(2, pModelPerdas.getDescEtapa());
    statement.setString(3, pModelPerdas.getDescRecurso());
    statement.setDate(4, pModelPerdas.getDataPerda());
    statement.setString(5, pModelPerdas.getMotivo());
    statement.setDouble(6, pModelPerdas.getPesoPerda());
    statement.setString(7, pModelPerdas.getOperador());
    statement.setTime(8, pModelPerdas.getHoraPerda());

    return statement.executeUpdate();
} catch (Exception e) {
    e.printStackTrace();
    return 0;
}

}

ERRO: Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException

Posta o stacktrace completo

1 curtida
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException
	at java.sql.Time.valueOf(Time.java:110)
	at view.ViewPerdas.salvar(ViewPerdas.java:484)
	at view.ViewPerdas.btnSalvarActionPerformed(ViewPerdas.java:558)
	at view.ViewPerdas.access$600(ViewPerdas.java:34)
	at view.ViewPerdas$5.actionPerformed(ViewPerdas.java:209)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
	at java.awt.Component.processMouseEvent(Component.java:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Sim, você fez algo errado. E o errado foi nesta linha.
Ou você segue o que o @staroski sugeriu ou faz a conversão do texto inserido para Date (java.util.Date), através do SimpleDateFormat e depois transforma em java.sql.Time.
Só não pode é tentar passar uma String como argumento para um método que espera um Time.

Você poderia por gentileza, me dar algum exemplo de como ficaria fazendo a conversão e utilizando o SimpleDateFormat?

Opa, claro.
Vê aí

Resolução do meu problema:

No View:
Criei um try catch e criei um objeto tipo time para receber a hora no model com o java.sql.time.

    try {
        SimpleDateFormat horaMinutos = new SimpleDateFormat("HH:mm");
        Date data = horaMinutos.parse(horaPerdas.getText());
        Time time = new Time(data.getTime());
        modelPerdas.setHoraPerda(time);
    } catch (ParseException ex) {
        Logger.getLogger(ViewPerdas.class.getName()).log(Level.SEVERE, null, ex);
    }

No Model:

private Time horaPerda;

    public Time getHoraPerda() {
        return horaPerda;
    }

    public void setHoraPerda(Time horaPerda) {
        this.horaPerda = horaPerda;
    }

E no DAO:

statement.setTime(8, (pModelPerdas.getHoraPerda()));
1 curtida