5

问题 #1

谁能告诉我使用以下代码我将获得什么好处,什么sPhoneExt时候null

if (sPhoneExt == null || sPhoneExt.trim().equals("")) {
    stmt.setNull(9, java.sql.Types.INTEGER);
} else {
    stmt.setString(9, sPhoneExt);
}

代替stmt.setString(9, sPhoneExt);

因为如果值为 SQLiPhoneType = rset.getInt("phone_type");将返回;我不想要。0NULL


问题2

只是好奇stmt.setString(9, null)被执行的回报是rset.getInt("phone_type")什么?

答案#2

getInt()当它在 DB 中为空时将返回零。您必须使用下面的代码来了解 DB NULL

if (rs.wasNull()) {
    // handle NULL field value
}
4

1 回答 1

23

setNull在这种 String 案例中使用我没有看到任何好处。它仅用于检查空字符串“”并在数据库中插入空值。但为此,我们也可以这样做stmt.setString(9, null);

但是当 sPhoneExt 为 Integer 且为 null 时,我们无法执行 stmt.setInt(9, sPhoneExt); ,因为setInt(int, int)API 执行;将(拆箱)sPhoneExt(整数)转换为原始(整数),所以你会得到 NullPointerException。所以你需要stmt.setNull(9, java.sql.Types.INTEGER);

最后,如果您在数据库中为 NUMBER(sql 类型)列插入了 null;getInt() 将仅返回 0。

这与下面的空集机制无关。

stmt.setString(9, null);
stmt.setNull(9, java.sql.Types.INTEGER)

也有人告诉 DB NUMBER 列何时具有默认值;上述两行将以不同方式考虑该默认值。但事实并非如此。即使在那种情况下,上述两条线也以相同的方式执行。为设定NULL值;不是默认值。

create table t1 (id number default 1 );
insert into t1 (id) values (2);
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class TestDB {
    public static void main(String args[]) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Connection con = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@10.201.32.92:1521:psprd1", "username", "password");
            String query = null;
            String l = null;
            ResultSet rset = null;
            int paramIndex = 1;
            query = "UPDATE t1 " + " SET id = ?";

            stmt = con.prepareStatement(query);
            stmt.setInt(paramIndex++, null);
            // stmt.setNull(1, java.sql.Types.INTEGER);
            stmt.executeUpdate();
            stmt.close();

            query = "select id from t1 ";
            stmt = con.prepareStatement(query);
            rset = stmt.executeQuery();
            rset.next();
            System.out.println(rset.getString("id"));
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                rs.close();
                stmt.close();
                con.close();
            } catch (Exception e) {
                e.printStackTrace();

            }
        }
    }
}
于 2013-02-13T05:40:53.607 回答