java 插入 null 但不是原始默认值

java insert null but not primitive default value

我想向数据库中插入一个空值,而不是插入默认的原始值。

我有一个class

class Test
(
    private int first;
    private int second;
    public Test() {}  
    public void setFirst(int val) {first = val;}
    public void setSecond(int val) {second = val;}
    public int getFirst() {return first;}
    public int getSecond() {return second;}
)

我有一些初始化测试的代码class:

测试我的=新测试(); my.setFirst(100);

所以我们现在有: 第一个 = 100; 第二 = 0; -- 因为我没有初始化它并且它默认为零“0” for int.

现在我将数据插入数据库table测试...

Create table Test
(
  first number,
  second number
)

Java 打电话...

Test my = new Test();
my.setFirst(100);
String sql = "INSERT INTO TEST VALUES(?,?)";
PrepareStatement ps = connection.prepareStatement(sql);
ps.setInt(1, my.getFirst());    // will insert 100
ps.setInt(2, my.getSecond());   // will insert 0

我想将 NULL 插入 "second" 字段,因为我的代码中未设置 Test.second。我使用以下技巧:

class Test
(
    private int first = -999;
    private int second = -999;
    public Test() {}  
    public void setFirst(int val) {first = val;}
    public void setSecond(int val) {second = val;}
    public int getFirst() {return first;}
    public int getSecond() {return second;}
)


Test my = new Test();
my.setFirst(100);
String sql = "INSERT INTO TEST VALUES(?,?)";
PrepareStatement ps = connection.prepareStatement(sql);

if (my.getFirst() == -999)
   ps.setNull(1, java.sql.Types.INTEGER) // will insert NULL
else
   ps.setInt(1, my.getFirst());    // will insert 100


if (my.getSecond() == -999)
   ps.setNull(2, java.sql.Types.INTEGER) // will insert NULL
else
   ps.setInt(2, my.getSecond());    // will insert 0

有人有 best/nice 解决方案来实现吗?

我在使用 Integer 时得到 NullPointerException,这是正确的,因为 var 没有初始化或者我在这里遗漏了一些东西:

java.lang.NullPointerException
at UserQuiz.getFrom_flags_challenge_nid(UserQuiz:113)

UserQuiz. java
...
private Integer from_flags_challenge_nid;
public int getFrom_flags_challenge_nid() {
    return from_flags_challenge_nid;
}

public void setFrom_flags_challenge_nid(int from_flags_challenge_nid) {
    this.from_flags_challenge_nid = from_flags_challenge_nid;
}
... 

如果您想添加这种行为,为什么不扩展 PreparedStatement 并提供您自己的实现?

class MyPreparedStatement extends PreparedStatement {

    public void setNullableInt(int parameterIndex, int x)
        throws SQLException
        if (x == 0) {
            setNull(parameterIndex, java.sql.Types.INTEGER)
        }
        else {
            setInt(parameterIndex, x);
        }
    }
}

现在,问题在于 0 在逻辑上不等同于 null,确实不应该这样对待。一般来说,如果您要处理正整数,一个常用的方法是使用 -1 之类的东西来表示 'non-value'。

将您的 int 更改为 Integer(无处不在 - setter 的字段、参数和 getter 的 return 类型)然后您就可以试试这个:

ps.setObject(1, my.getFirst()/*may return null*/, java.sql.Types.INTEGER);
ps.setObject(2, my.getSecond()/*may return null*/, java.sql.Types.INTEGER);

注意像这样的代码:

private Integer from_flags_challenge_nid;
public int getFrom_flags_challenge_nid() {
   return from_flags_challenge_nid;
}
如果 from_flags_challenge_nid 包含 null.

将抛出 NullPointerException