java使用更新查询在mysql中插入空日期

java使用更新查询在mysql中插入空日期,java,mysql,jdbc,windowbuilder,Java,Mysql,Jdbc,Windowbuilder,我正在开发java应用程序(GUI、JDBC、MySQL),我遇到了无法解决的问题 当我将数据插入MySQL数据库时(有这个数据类型String,INT,Date),如果一些字段是空的,就没有问题了。空字段在数据库中为Null。但是,当我想更新某行时,必须填写所有日期字段,否则会出错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'rociste_datu

我正在开发java应用程序(GUI、JDBC、MySQL),我遇到了无法解决的问题

当我将数据插入MySQL数据库时(有这个数据类型String,INT,Date),如果一些字段是空的,就没有问题了。空字段在数据库中为Null。但是,当我想更新某行时,必须填写所有日期字段,否则会出错:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'rociste_datum' at row 1
rociste\u datum
是数据库中的第一个日期列

该守则分为以下几部分:

插入法代码

    public void insertPredmetDB(String prezime, String ime, int nasBroj, Date datumRocista) {
        if (datumRocista == null || datumRocista.equals("")) {
            datumRocistaDB = null;
        } else {
            String datumRocistaSt = new SimpleDateFormat("yyyy-MM-dd").format(datumRocista);
            datumRocistaDB = java.sql.Date.valueOf(datumRocistaSt);
        }
更新方法的代码

public void updatePredmetDB(int idNovo, String novoPrezime, String novoIme, int noviNasBroj, Date noviRocisteDatum) {
    if (noviRocisteDatum == null || noviRocisteDatum.equals("")) {
        noviRocisteDatumDB = null;
    } else {
        String datumRocistaSt = new SimpleDateFormat("yyyy-MM-dd").format(noviRocisteDatum);
        noviRocisteDatumDB = java.sql.Date.valueOf(datumRocistaSt);
    }
    String izmena = "UPDATE predmeti SET prezime='" + novoPrezime + "', ime='" + novoIme + "', nas_broj='" + noviNasBroj + "', rociste_datum='" + noviRocisteDatumDB + "'where id='" + idNovo + "'";

    try {

        PreparedStatement ps = con.prepareStatement(izmena);

        ps.execute();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
对于所有这些日期,都有if-else语句,并且这些对象以单例模式通过控制器。我认为没有必要把代码放在这里,因为没有错误,除了这个日期之外,一切都正常


我认为日期转换有问题。你能给我一些帮助吗?

当你像

rociste_datum='" + noviRocisteDatumDB + "'
然后你就有了

rociste_datum='null'
而不是

rociste_datum=null
这次没有报价。db需要日期或null,而不是字符串“null”

因此,在创建准备好的语句之前使用占位符,然后设置参数

"UPDATE predmeti SET prezime=?, ime=?, nas_broj=?, rociste_datum=? where id=?";

当您执行字符串连接时,如

rociste_datum='" + noviRocisteDatumDB + "'
然后你就有了

rociste_datum='null'
而不是

rociste_datum=null
这次没有报价。db需要日期或null,而不是字符串“null”

因此,在创建准备好的语句之前使用占位符,然后设置参数

"UPDATE predmeti SET prezime=?, ime=?, nas_broj=?, rociste_datum=? where id=?";

不要试图将变量粘合到SQL中。改用。特别是因为您已经使用了<代码> PraveRealds< /C>,考虑使用它的代码> < /Cord>占位符系统。实际上,您正在尝试使用值
'null'
更新日期列,该值显然不是日期的有效字符串表示形式。进一步跳过
date
SimpleDateFormat
,这些类早已过时。假设您可以使用Java8或更高版本和JDBC4.2或更高版本,请使用
Java.time.LocalDate
ps.setObject(4,您的LocalDate)
。如果
yourLocalDate
也是
null
,我希望它能工作。作为一个副词,
datumRocista.equals(“”
将永远不会为真,
Date
不能等于字符串。不要尝试将变量粘附到SQL中。改用。特别是因为您已经使用了<代码> PraveRealds< /C>,考虑使用它的代码> < /Cord>占位符系统。实际上,您正在尝试使用值
'null'
更新日期列,该值显然不是日期的有效字符串表示形式。进一步跳过
date
SimpleDateFormat
,这些类早已过时。假设您可以使用Java8或更高版本和JDBC4.2或更高版本,请使用
Java.time.LocalDate
ps.setObject(4,您的LocalDate)
。如果
yourLocalDate
也是
null
,我希望它能工作。另一方面,
datumRocista.equals(“”
将永远不会为真,
Date
不能等于字符串。我更新了代码,但仍然是相同的错误com.mysql.jdbc.MysqlDataTruncation:数据截断:不正确的日期值:第1行字符串izmena的列“rociste_datum”的“null”=“更新predmeti SET prezime=?,ime=?,nas_broj=?,rociste_datum=?”?其中id=?“try{PreparedStatement ps=con.preparest陈述(izmena);ps.setString(1,novoPrezime);ps.setString(2,novoIme);ps.setInt(3,noviNasBroj);ps.setDate(4,noviRocisteDatumDB);ps.setInt(5,idNovo);ps.execute();我更新了代码,但仍然是相同的错误com.mysql.jdbc.MysqlDataTruncation:数据截断:不正确的日期值:第1行字符串izmena=“UPDATE predmeti SET prezime=?,ime=?,nas_broj=?,rociste_datum=?where id=?”,尝试{PreparedStatement ps=con.preparestatestatement(izmena);ps.setString(1,novoPrezime);ps.setString(2,novoIme);ps.setInt(3,noviNasBroj);ps.setDate(4,noviRocisteDatumDB);ps.setInt(5,idNovo);ps.execute();