Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码要在数据库中插入多行?_Java_Mysql_Jdbc_Prepared Statement_Resultset - Fatal编程技术网

Java 为什么这段代码要在数据库中插入多行?

Java 为什么这段代码要在数据库中插入多行?,java,mysql,jdbc,prepared-statement,resultset,Java,Mysql,Jdbc,Prepared Statement,Resultset,我有一段代码将产品添加到数据库中的Products表中,但它添加了多行 代码如下: public int addProduct(Products product, String supplierName) { //find a product String checkAllProducts = "SELECT * FROM products WHERE product_name = ?"; //Insert product and supplier id where

我有一段代码将产品添加到数据库中的Products表中,但它添加了多行

代码如下:

public int addProduct(Products product, String supplierName) {

    //find a product
    String checkAllProducts = "SELECT * FROM products WHERE product_name = ?";

    //Insert product and supplier id where supplier exist in suppliers table sql statement
    String insertSql = "INSERT INTO products (product_name, product_type, supplier_id, number_of_stocks, price_per_unit, packaging_type) SELECT ?,?,suppliers.supplier_id,?,?,? FROM  suppliers WHERE suppliers.supplier_name = ?";

    //Get connection
    Connection conn = DbUtil.getConnection();

    //Resultset for checking existing products
    ResultSet resultSet = null;

    int inserted = 0;

    try {

        //Prepare check all products statement
        allProducts = conn.prepareStatement(checkAllProducts);
        allProducts.setString(1, product.getProductName());
        resultSet = allProducts.executeQuery();

        //If doesn't exist in products table
        if (!resultSet.next()) {
            //Prepare insert statement
            addProduct = conn.prepareStatement(insertSql);
            //Get product parameter's data
            addProduct.setString(1, product.getProductName());
            addProduct.setString(2, product.getProductType());
            addProduct.setInt(3, product.getNumberOfStocks());
            addProduct.setBigDecimal(4, product.getPricePerUnit());
            addProduct.setString(5, product.getPackagingType());
            addProduct.setString(6, supplierName);

            //Confirm insert
            int confirmation = JOptionPane.showConfirmDialog(null, "Are you sure you want to insert this product?", "Insert Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
            if (confirmation == JOptionPane.YES_OPTION) {
                //execute insert
                inserted = addProduct.executeUpdate();
            }

        }//Else don't insert and show error messages.
        else {
            JOptionPane.showMessageDialog(null, "Product already exists.", "Invalid insert.", JOptionPane.ERROR_MESSAGE);
        }

    } catch (SQLException ex) {
        Logger.getLogger(ProductDAO.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        DbUtil.close(conn, allProducts, resultSet);
        DbUtil.close(conn, addProduct, resultSet);
    }

    return inserted;
}
正如您在上面的代码中看到的,我正在检查表中是否不存在产品,然后插入并确认。已成功添加,但添加了多行。例如,假设我已经初始化了productDao对象,并通过以下方式对其进行测试:
productDao.addProduct(新产品(“热狗”、“完整”、55、新的BigDecimal(0.30)、“盒子”)、“Wing Yip”)。这样做之后,它插入了其中的14个,如下图链接所示


有人知道为什么会这样吗?请让我知道,谢谢。

谢谢@trustrywombat和@4castle的帮助。我现在做的是创建一个单独的语句,并添加更多代码,如下所示

//find supplier
String checkSupplierQuery = "SELECT products.supplier_id FROM products, suppliers WHERE products.supplier_id = suppliers.supplier_id AND suppliers.supplier_name = ? ";

//Prepare check supplier statement
PreparedStatement checkSupplier = conn.prepareStatement(checkSupplierQuery);
checkSupplier.setString(1, supplierName);
resultSet = checkSupplier.executeQuery();

String supplier = "";
while (resultSet.next()) {
  supplier = resultSet.getString("products.supplier_id");
}

这解决了我的问题,但我正在尝试使用
INSERT-INTO-SELECT
语句,它并没有像我预期的那样工作。再次感谢那些帮助我的人。:-)

insert语句的第二部分是select语句:

SELECT
    ?, ?,
    suppliers.supplier_id,
    ?, ?, ? 
FROM products, suppliers
WHERE 
    products.supplier_id = suppliers.supplier_id 
    AND suppliers.supplier_name = ?
这可以选择具有该供应商名称且出现在两个表中的所有记录。很明显,供应商有14种产品,因此插入了多少新记录

要解决此问题,请删除隐式的
连接。
supplier\u id
查找不需要它

INSERT INTO products (
    product_name, 
    product_type,
    supplier_id,
    number_of_stocks,
    price_per_unit, 
    packaging_type
) SELECT 
    ?, ?,
    suppliers.supplier_id,
    ?, ?, ?
FROM suppliers
WHERE suppliers.supplier_name = ?

您的insert正在插入
select
语句的结果-可能您不是有意这样做的?这个
select
与您的
select
不同checking@Scary是袋熊吗?好的,我想插入
供应商id
,你所说的并不是我的本意。我的陈述是否有误?请尝试运行
SELECT?,suppliers.supplier_id,?,?,?来自产品、供应商,其中product.supplier\u id=suppliers.supplier\u id和suppliers.supplier\u name=?";并查看作为单独字符串变量得到的结果?如果是这样,我将尝试…您应该删除INSERT语句中的初始测试SELECT和use ON DUPLICATE IGNORE。您的方式存在计时窗口问题。因此,我的陈述是正确的,但添加了
限制1
。正确。另一种解决方法是添加
不同的供应商。供应商id
,但这会使查询做更多的工作。我喜欢你的答案。非常感谢你。我真的在尝试将INSERT插入SELECT语句以最小化代码。再次感谢您。为什么您有
产品。供应商id=供应商。供应商id
?似乎不需要那个部分。这不是只允许你插入一个已经存在于表中的供应商的记录吗?那是为了检查它是否相同,我认为你是对的。