【问题标题】:Insert JDateChoose into MySQL将 JDateChoose 插入 MySQL
【发布时间】:2017-10-23 21:43:44
【问题描述】:

我在尝试将一些数据插入 MySQL 数据库时遇到问题。我认为这是由于 JDateChooser 造成的。

这是我得到的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'May 24 21:06:17 CEST 2017, Fri May 26 00:00:00 CEST 2017, Desayuno, Adrian Poved' at line 1

这是插入数据的方法:

    public void nuevaReserva(ReservaVO reserva){
            try {
                Statement st = bd.getConexion().createStatement();
                st.executeUpdate("INSERT INTO reserva VALUES(null,"+reserva.getInicio()+", "+reserva.getFin()
                +", "+reserva.getRegimen()+", "+reserva.getCod_cliente()+", "+reserva.getCod_usuario()
                +", "+reserva.getCod_habitacion()+");");
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

我的控制器中也有这个方法来从 JDateChooser 和我的 ComboBoxes 中获取数据:

private void insertaReserva() {
        ReservaDAO modeloReserva = new ReservaDAO();
        String refEmpeladoS = String.valueOf(refEmpleado);
        ReservaVO reserva = new ReservaVO("",nrv.getDateChooserLlegada().getDate().toString(),
                nrv.getDateChooserSalida().getDate().toString(),
                nrv.getListaPension().getSelectedItem().toString(),
                nrv.getListaClientes().getSelectedItem().toString(),refEmpleadoS,
                nrv.getListaHabitaciones().getSelectedItem().toString());

        modeloReserva.nuevaReserva(reserva);
        }

感谢您的帮助。

【问题讨论】:

  • 你能修复它吗?
  • 是的,感谢您的帮助。
  • 在这种情况下,如果您支持和/或接受帮助您解决问题的答案,那就太好了 - 这样下次有人遇到您的问题时,他们会在这里找到解决方案。欢迎使用 Stackoverflow!

标签: java mysql insert jcalendar


【解决方案1】:

您需要使用 SimpleDateFormat.format() 方法将日期格式化为字符串。你不能只使用 nrv.getDateChooserSalida().getDate().toString(),它会给你一个数据对象。

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
String dateFormatted = sdf.format(nrv.getDateChooserSalida().getDate().toString());

在 ReservaVO 构造函数中使用 DateFormatted。

【讨论】:

  • 值没有正确地用引号括起来这一事实无济于事,不是吗?
  • 是的,应该像 st.executeUpdate("INSERT INTO reserva VALUES(null,'"+reserva.getInicio()+"', '"+reserva.getFin() +"',' "+reserva.getRegimen()+"', '"+reserva.getCod_cliente()+"','"+reserva.getCod_usuario() +"','"+reserva.getCod_habitacion()+"');") ;
  • 如果没有额外的 ' 这将破坏几乎所有的字符串 - 或更糟(认为 reserva.getInicio() 是 "); DROP DATABASE" ...
  • 它现在越来越倾向于 SQL 注入。缺少引号和字符串格式是这里的两个主要内容,执行 SP 或 SQL 的使用符合标准。
【解决方案2】:

您很可能在日期值周围缺少引号。

但这只会让你走这么远。

需要改进的地方:

a) 使用 PreparedStatement / 绑定变量

主要是这样可以防止将讨厌的 SQL 注入到您的数据库中 - 并使 SQL 更易于阅读

public void nuevaReserva(ReservaVO reserva){
        try {
            PreparedStatement st = bd.getConexion().prepareStatement(
   "INSERT INTO reserva VALUES(null, ?, ?, ?, ?, ?, ?)");
          st.setString(1, reserva.getInicio());
          st.setString(2, reserva.getFin());
          st.setString(3, reserva.getRegimen());
          st.setString(4, reserva.getCod_cliente());
          st.setString(5, reserva.getCod_usuario());
          st.setString(6, reserva.getCod_habitacion());
          st.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

记住:我不知道您的列定义。可能是一些 setInt() 或者可能更适合您的需求。

b) 使用 try-with-resource 进行改进

您的数据库连接 bd.getConnexion() 永远不会关闭。这可能是需要的(一个连接打开很长时间),但在大多数系统中,我看到你的 getConexion() 要么打开一个到数据库的连接(在这种情况下你需要关闭它!)或者从一个连接中获取一个池 - 在这种情况下,您希望在使用后将其退回。两者都可以通过使用 try-with-resource 轻松完成:

public void nuevaReserva(ReservaVO reserva){
        try (Connection con = bd.getConexion();
            PreparedStatement st = bd.getConexion().prepareStatement(
   "INSERT INTO reserva VALUES(null, ?, ?, ?, ?, ?, ?)")) {
          st.setString(1, reserva.getInicio());
          st.setString(2, reserva.getFin());
          st.setString(3, reserva.getRegimen());
          st.setString(4, reserva.getCod_cliente());
          st.setString(5, reserva.getCod_usuario());
          st.setString(6, reserva.getCod_habitacion());
          st.executeUpdate();
         //Both statement and connection will be closed and closing curly brace
         // even in case of an Exception!
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2012-04-25
    • 2014-02-26
    • 2011-01-11
    • 2020-07-15
    • 2016-10-10
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多