Java Update PreparedStatement

时间:2016-07-11 07:05:13

标签: java mysql prepared-statement

我正在尝试提出一个מ更新查询,我可以在我的所有应用程序中使用它来更新表(库存)。这是我到目前为止所做的:

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值,则不会使用现有值进行更新。

2 个答案:

答案 0 :(得分:1)

您没有任何实际将值设置为所提供参数的内容。

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, ?), ...

等。这意味着您必须复制每个参数。

答案 1 :(得分:1)

我假设您的java端值(inventory)可能为null,并且您希望为每个可能的值组合都有一段代码。

SQL看起来很好,但要获取IFNULL(NULL,...),假设你的getter返回一个Object包装器,如:

Float getQuantity()

然后你需要打电话

ps.setObject(1, inventory.getQuantity());

顺便说一句,java端的BigDecimal和SQL架构端的DECIMAL是更好的选择。对于浮点的舍入误差。这将启用:

ps.setBigDecimal(1, inventory.getQuantity());

对于非null getter,使用IF():

SET quantity = IF(? = 0.0, quantity, ?),

ps.setDouble(1, inventory.getQuantity());
ps.setDouble(2, inventory.getQuantity());