Java 更新 PreparedStatement
Java Update PreparedStatement
我正在尝试提出一个更新查询,我可以在我的所有应用程序中使用它来更新 table(库存)。这就是我目前所拥有的:
public void updateInventory(Inventory inventory){
PreparedStatement ps=null;
try {
String query =
"UPDATE "+TableName.INVENTORY +" "+
"SET quantity=IFNULL(?, quantity), full_stock=IFNULL(?, full_stock), reorder_level=IFNULL(?, reorder_level), selling_price=IFNULL(?, selling_price), delete_status=IFNULL(?, delete_status), product_id=IFNULL(?, product_id) "+
"WHERE id = ? OR product_id=IFNULL(?, product_id) ";
connection = hikariDS.getConnection();
ps = connection.prepareStatement(query);
ps.setFloat(1,inventory.getQuantity());
ps.setFloat(2,inventory.getFullStock());
ps.setFloat(3,inventory.getReorderLevel());
ps.setFloat(4,inventory.getPrice());
ps.setInt(5, inventory.getDeleteStatus());
ps.setInt(6, inventory.getProdId());
ps.setInt(7, inventory.getId());
ps.setInt(8, inventory.getProdId());
ps.executeUpdate();
} catch(SQLException e){ e.printStackTrace();}
finally{
if( connection != null ){
try {connection.close();}
catch (SQLException ex) {logger.log(Level.SEVERE, null, ex);}
}
if( ps != null){
try { ps.close();}
catch (SQLException ex) { logger.log(Level.SEVERE, null, ex);}
}
}
}
上面的查询应该只有在对象中设置了新值时才用新值更新列,但如果没有设置,则只需将列中的现有值提供给它。
问题是:如果从 Inventory 对象中检索到的值为 null 或 0,则它不会更新现有值。
您没有任何东西可以实际将值设置为提供的参数。
SET quantity=IFNULL(?, quantity), full_stock=IFNULL(?, full_stock), reorder_level=IFNULL(?, reorder_level), selling_price=IFNULL(?, selling_price), delete_status=IFNULL(?, delete_status), product_id=IFNULL(?, product_id) "+
"WHERE id = ? OR product_id=IFNULL(?, product_id)
应该是
SET quantity=IFNULL(?, quantity, ?), ...
等当然,这意味着您必须复制每个参数。
我假设您的 java 侧值(inventory
)可能为空,并且您想为每种可能的值组合使用一段代码。
SQL 看起来不错,但要获取 IFNULL(NULL, ...),假设您的 getter return 是一个对象包装器,例如:
Float getQuantity()
那你需要打电话
ps.setObject(1, inventory.getQuantity());
顺便说一下,java 端的 BigDecimal
和 SQL 端的 DECIMAL
是更好的选择。对于浮点数的舍入误差。这将启用:
ps.setBigDecimal(1, inventory.getQuantity());
对于非空 getter 使用 IF():
SET quantity = IF(? = 0.0, quantity, ?),
ps.setDouble(1, inventory.getQuantity());
ps.setDouble(2, inventory.getQuantity());
我正在尝试提出一个更新查询,我可以在我的所有应用程序中使用它来更新 table(库存)。这就是我目前所拥有的:
public void updateInventory(Inventory inventory){
PreparedStatement ps=null;
try {
String query =
"UPDATE "+TableName.INVENTORY +" "+
"SET quantity=IFNULL(?, quantity), full_stock=IFNULL(?, full_stock), reorder_level=IFNULL(?, reorder_level), selling_price=IFNULL(?, selling_price), delete_status=IFNULL(?, delete_status), product_id=IFNULL(?, product_id) "+
"WHERE id = ? OR product_id=IFNULL(?, product_id) ";
connection = hikariDS.getConnection();
ps = connection.prepareStatement(query);
ps.setFloat(1,inventory.getQuantity());
ps.setFloat(2,inventory.getFullStock());
ps.setFloat(3,inventory.getReorderLevel());
ps.setFloat(4,inventory.getPrice());
ps.setInt(5, inventory.getDeleteStatus());
ps.setInt(6, inventory.getProdId());
ps.setInt(7, inventory.getId());
ps.setInt(8, inventory.getProdId());
ps.executeUpdate();
} catch(SQLException e){ e.printStackTrace();}
finally{
if( connection != null ){
try {connection.close();}
catch (SQLException ex) {logger.log(Level.SEVERE, null, ex);}
}
if( ps != null){
try { ps.close();}
catch (SQLException ex) { logger.log(Level.SEVERE, null, ex);}
}
}
}
上面的查询应该只有在对象中设置了新值时才用新值更新列,但如果没有设置,则只需将列中的现有值提供给它。
问题是:如果从 Inventory 对象中检索到的值为 null 或 0,则它不会更新现有值。
您没有任何东西可以实际将值设置为提供的参数。
SET quantity=IFNULL(?, quantity), full_stock=IFNULL(?, full_stock), reorder_level=IFNULL(?, reorder_level), selling_price=IFNULL(?, selling_price), delete_status=IFNULL(?, delete_status), product_id=IFNULL(?, product_id) "+
"WHERE id = ? OR product_id=IFNULL(?, product_id)
应该是
SET quantity=IFNULL(?, quantity, ?), ...
等当然,这意味着您必须复制每个参数。
我假设您的 java 侧值(inventory
)可能为空,并且您想为每种可能的值组合使用一段代码。
SQL 看起来不错,但要获取 IFNULL(NULL, ...),假设您的 getter return 是一个对象包装器,例如:
Float getQuantity()
那你需要打电话
ps.setObject(1, inventory.getQuantity());
顺便说一下,java 端的 BigDecimal
和 SQL 端的 DECIMAL
是更好的选择。对于浮点数的舍入误差。这将启用:
ps.setBigDecimal(1, inventory.getQuantity());
对于非空 getter 使用 IF():
SET quantity = IF(? = 0.0, quantity, ?),
ps.setDouble(1, inventory.getQuantity());
ps.setDouble(2, inventory.getQuantity());