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());