Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL如何使用prepareStatement update为int和double指定带IsNull的字段?_Java_Sql_Sql Server_Jdbc - Fatal编程技术网

Java SQL如何使用prepareStatement update为int和double指定带IsNull的字段?

Java SQL如何使用prepareStatement update为int和double指定带IsNull的字段?,java,sql,sql-server,jdbc,Java,Sql,Sql Server,Jdbc,我想使用prepareStatement更新表。但是输入可能是空值。通过使用IsNull,它只能应用于varchar,int和double如何 我将收到一个json对象(只需要更新字段),例如: 对于int和double,如果没有设置该值,当我得到该值时,它将返回0,当用户没有传递给我时,如何将其设置为null 我的班级: private String name; private int age; private double price; //public get & set meth

我想使用prepareStatement更新表。但是输入可能是空值。通过使用IsNull,它只能应用于varchar,int和double如何

我将收到一个json对象(只需要更新字段),例如:

对于int和double,如果没有设置该值,当我得到该值时,它将返回0,当用户没有传递给我时,如何将其设置为null

我的班级:

private String name;
private int age;
private double price;
//public get & set method
我的java:

strQuery = "UPDATE table SET name=IsNull(?, name), age=IsNull(?, age), price=IsNull(?, age) WHERE id= ?";
stmt = (PreparedStatement) conn.prepareStatement(strQuery);
stmt.setString(1, obj.getName()); //string
stmt.setString(2, obj.getAge()); //int
stmt.setString(3, obj.getPrice()); //double
stmt.setString(4, id);
我的问题:

如何捕获json输入,如果字段(int/double)不可用,则将其设置为null

我试着用Double代替Double,这很有效,但我不确定这是不是好方法。(我完全是个新手)


或者其他任何我想做的最好的方法?

您可以在设置参数时比较对象

stmt.setInt(2, obj.getAge() != 0 ? obj.getAge() : null);
stmt.setDouble(3, obj.getPrice() != 0 ? obj.getPrice() : null);

现在,正如您使用Double所述,它可以工作,因为类对象在初始化期间默认分配为null。但是,基本类型会被指定默认值。e、 g、int-0、double-0.0、bool-false等。您可以查看更多信息。这两种方法都可以在设置参数时使用包装类或比较。但是比较更好。

您可以在设置参数时比较对象

stmt.setInt(2, obj.getAge() != 0 ? obj.getAge() : null);
stmt.setDouble(3, obj.getPrice() != 0 ? obj.getPrice() : null);

现在,正如您使用Double所述,它可以工作,因为类对象在初始化期间默认分配为null。但是,基本类型会被指定默认值。e、 g、int-0、double-0.0、bool-false等。您可以查看更多信息。这两种方法都可以在设置参数时使用包装类或比较。但是比较更好。

你怎么知道值
0
应该表示
null
,而不是实际值
0
?这似乎是问题的核心。在这种情况下,开关使用Double和Integer,如果不指定,则设置为null。我们不能认为0是空的,但是您可以选择一些临时值(Doul .Max值和整数.Max值),如果您真的想使用原语,则设置为默认值。但最好是使用object(Double/Integer)。这就是我评论的重点:您的答案没有(现在仍然没有)真正解决问题。如果您有更好的解决方案。请邮寄。此解决方案解决了设置null的要求。我看不到任何缺陷。您如何知道值
0
应该表示
null
,而不是实际的
0
?这似乎是问题的核心。在这种情况下,开关使用Double和Integer,如果不指定,则设置为null。我们不能认为0是空的,但是您可以选择一些临时值(Doul .Max值和整数.Max值),如果您真的想使用原语,则设置为默认值。但最好是使用object(Double/Integer)。这就是我评论的重点:您的答案没有(现在仍然没有)真正解决问题。如果您有更好的解决方案。请邮寄。此解决方案解决了设置null的要求,我看不出任何缺陷。如果您想知道null值,应该使用
Integer
Double
。顺便说一句:这似乎不是一个SQL或JDBC的问题,而是一个如何映射JSON的问题。您可以共享类的代码吗?该类的实例是
obj
表示的?似乎您应该使用空对象模式表示和标识未初始化的字段。如果您想知道空值,应该使用
Integer
Double
。顺便说一句:这似乎不是一个SQL或JDBC的问题,而是一个如何映射JSON的问题。您可以共享类的代码吗?该类的实例是
obj
表示的?似乎应该使用null对象模式表示和标识未初始化的字段。