【问题标题】:java insert null but not primitive default valuejava插入null但不是原始默认值
【发布时间】:2015-05-27 02:03:57
【问题描述】:

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

我有课

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

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

测试我的 = new Test(); 我的.setFirst(100);

所以我们现在有: 第一个 = 100; 秒 = 0; -- 因为我没有初始化它,它默认为零“0”代表 int。

现在我将数据插入数据库表 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;
}
... 

【问题讨论】:

  • 你可以使用 Integer 代替 int,可能。
  • 整数让我得到 NullPointerException
  • 使用 Integer 时 NullPointerException 在哪里,在这种情况下您可以复制/粘贴堆栈跟踪吗?
  • 它将在ps.setInt 上抛出异常。请参阅 stackoverflow.com/a/9542866/203117 了解类似问题的解释。

标签: java jdbc


【解决方案1】:

将您的 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。

【讨论】:

  • 知道了....所以如果将 getter 和 setter 中的 Integer 以及变量从 int 更改为 Integer,仍然会得到 NullPointerException。这对我来说很好:ps.setObject(2, my.getSecond()/*may return null*/, java.sql.Types.INTEGER);
  • 您是否更改了返回类型?异常必须有一个可以理解的原因......
  • 是的,公共整数 getFrom_flags_challenge_nid() { return from_flags_challenge_nid; }。所以现在的问题是为什么 ps.setInt(7,userquiz.getFrom_flags_challenge_nid());返回 NULL 和 setObject 工作时失败
  • ps.setInt(int, int) 将 int 作为值参数....通过将 Integer (null) 拆箱为 int,您会得到一个 NULLPOINTER
  • 是的,我想这是尝试将 Integer(null) 转换为 int +1 的原因
【解决方案2】:

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

【讨论】:

  • 不确定这是否有效,因为 int 不为 null,默认值为 0。所以我的 getSecond 将返回 0 而不是 null,根据它调用 setInt 而不是 setNull 的逻辑
  • 抱歉,我编辑了我的答案,因为它不应该检查空值。
  • hm ...看到零“0”可以是一个很好的int值,所以零不是NULL。
  • 我同意。但是您正在将 second 初始化为 0,然后尝试将其视为 null。真的,如果你想使用原始整数,没有 null 之类的东西
  • 我猜可以改变:public void setNullableInt(int parameterIndex, Integer x) 并检查 setNull 是否 (x == null)
猜你喜欢
  • 2016-08-30
  • 2011-07-20
  • 2020-10-12
  • 2016-06-24
  • 2014-11-19
  • 2011-03-24
  • 2014-12-12
  • 1970-01-01
相关资源
最近更新 更多