编写需要直接访问JDBCprepared statement的setNull方法:
var stmt = handle
.createUpdate("REPLACE INTO products(id, name, price) VALUES (:id, :name, :price)")
.bind("id", deal.getId());
bindValueOrNull(stmt, "name", product.getName());
bindValueOrNull(stmt, "price", product.getPrice());
stmt.execute();
/**
Bind a non-null value to the named query parameter, or else SQL Types.NULL value
@param stmt being prepared
@param key to bind
@param value or null
*/
private void bindValueOrNull(Update stmt, String key, @Nullable Object value) {
if (Objects.nonNull(value))
stmt.bind(key, value);
else
stmt.bindNull(key, Types.NULL);
}
为了阅读,需要使用getObject 方法进行空值检查:
return Product.newBuilder()
.setId(rs.getString("id"))
.setName(rs.getString("name"))
.setPrice(getDoubleOrNull(rs, "price"))
.build();
/**
Get Double value, or null, from a result set
@param rs result set
@param key of column
@return Double or null
*/
@Nullable
private static Double getDoubleOrNull(ResultSet rs, String key) throws SQLException {
return Objects.nonNull(rs.getObject(key)) ? rs.getDouble(key) : null;
}