问题描述
但是,以下是插入空字符串和零,而不是空值:
handle
.createUpdate("REPLACE INTO products(id,name,price) VALUES (:id,:name,:price)")
.bind("id",product.getId())
.bind("name",product.getName())
.bind("price",product.getPrice())
.execute();
此外,当我从同一个数据库中 SELECT
记录并使用以下行映射器时,这会导致零(对于 Double,虽然 String 似乎映射为 null OK):
return Product.newBuilder()
.setId(rs.getString("id"))
.setName(rs.getString("name"))
.setPrice(rs.getDouble("price"))
.build();
解决方法
为了写入,需要直接访问JDBC Prepared 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;
}