[任何人都可以告诉我,当sPhoneExt
为null
时,使用以下代码可以获得什么好处?
if (sPhoneExt == null || sPhoneExt.trim().equals("")) {
stmt.setNull(9, java.sql.Types.INTEGER);
} else {
stmt.setString(9, sPhoneExt);
}
而不是stmt.setString(9, sPhoneExt);
因为如果值是SQL iPhoneType = rset.getInt("phone_type");
,则0
将返回NULL
;我不要
只是好奇地执行了stmt.setString(9, null)
,将返回rset.getInt("phone_type")
是什么?
getInt()
在DB中为空时将返回零。您必须使用以下代码来了解DB NULL
。
if (rs.wasNull()) {
// handle NULL field value
}
在此String情况下,使用setNull
没有任何好处。它仅用于检查空字符串“”,并在DB中插入null。但是为此,我们也可以像stmt.setString(9, null);
但是当sPhoneExt为Integer并保持null时,我们将无法执行由于stmt.setInt(9, sPhoneExt);
API会执行setInt(int, int)
;将(取消装箱)sPhoneExt(整数)转换为原始形式(整数),因此您将获得NullPointerException。因此,您需要stmt.setNull(9, java.sql.Types.INTEGER);
最后,如果您在NUMBER(SQL类型)列的DB中插入了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();
}
}
}
}
[stmt.setNull(9, java.sql.Types.INTEGER)
Esto me fue muyútil。
Puesrequeríainsertar un valor nulo en un integer y de esta forma lo pude agregar a la base de datos。 Utilizando un更新或插入。
public synchronized String agregarHorario(Horarios h) {
System.out.println("clases.Datos.agregarHorario()");
try {
String sql = "update or insert into T_HORARIOS (IDHORARIO, DESCRIPCION, "
+ "INGRESO, ALMUERZO, REINGRESO, SALIDA, TOLERANCIA, ESTADO) "
+ "values (?, ?, ?, ?, ?, ?, ?, ?) "
+ "matching(IDHORARIO)";
try (PreparedStatement st = getConn().prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT)) {
if(h.getIdHorario() != null){
st.setInt(1, h.getIdHorario());
}else{
st.setNull(1, java.sql.Types.INTEGER);
}
st.setString(2, h.getDescripcion());
st.setTime(3, h.getIngreso());
st.setTime(4, h.getAlmuerzo());
st.setTime(5, h.getReingreso());
st.setTime(6, h.getSalida());
st.setInt(7, h.getTolerancia());
st.setBoolean(8, h.isEstado());
st.executeUpdate();
st.close();
}
return "Horario agregado correctamente!";
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
LOGGER.getLogger(Datos.class.getName()).log(Level.SEVERE, null, ex);
return "Error al agregar horario, intente de nuevo!";
}
}