繁体   English   中英

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

[英]java insert null but not primitive default value

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

我有一堂课

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;}
)

我有一些代码初始化Test类:

测试my = new Test(); my.setFirst(100);

所以我们现在有:first = 100; 秒= 0; -因为我没有初始化它,所以它对于int默认为零“ 0”。

现在,我将数据插入数据库表Test中。

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,因为我的代码中未设置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

有人有最好/最好的解决方案来实现吗?

使用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;
}
... 

int更改为Integer (无处不在-字段,setter参数和getter的返回类型),然后可以尝试以下操作:

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。

如果要添加这种行为,为什么不扩展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的值来表示“非值”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM