Java 为什么这段代码要在数据库中插入多行?
我有一段代码将产品添加到数据库中的Products表中,但它添加了多行 代码如下: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
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
?似乎不需要那个部分。这不是只允许你插入一个已经存在于表中的供应商的记录吗?那是为了检查它是否相同,我认为你是对的。