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
我想向数据库中插入一个空值,而不是插入默认的原始值。
我有一个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