#java #sql #swing #jdbc
#java #sql #качать #jdbc
Вопрос:
Я создал систему заказа еды, в которой есть 5 разных JFrames, имеющих свои собственные категории, такие как еда, фаст-фуд, закуски, напитки. Каждая категория имеет всплывающие окна для каждого продукта, который является еще одним JFrame. Именно здесь, когда клиент выберет необходимое блюдо, оно будет добавлено в базу данных.
Я создал запрос к базе данных, в котором при выборе различных блюд из всплывающего меню эти элементы будут внесены в базу данных. Это работает отлично.
Однако я хочу обновить только количество, если описание продукта существует. Например, если сырный бургер доступен в базе данных, я хочу только увеличить количество. Как я могу это сделать?
public void InsertOrderDetails(){
String Insert;
String Update;
int i = Integer.parseInt(DBqty);
BigDecimal Totals=new BigDecimal(DBtotalPrice);
BigDecimal TotalValue=new BigDecimal(Total);
try
{
//Opening database for connection
conn = DriverManager.getConnection(connectionUrl, username, Pass);
Statement st=conn.createStatement();
String sql="SELECT * FROM SALESORDER WHERE ProductDescription ='" ProductDescription "'";
ResultSet rs=st.executeQuery(sql);
if(rs.next()){
int quan =i qty;
BigDecimal totaly = Totals.add(TotalValue);
Update="UPDATE SALESORDER SET Quantity=? ,TotalPrice=? WHERE ProductDescription ='" ProductDescription "'";
PreparedStatement pstmt = conn.prepareStatement(Update);
pstmt.setInt(1, quan);
pstmt.setBigDecimal(2, totaly);
pstmt.executeUpdate();
pstmt.close();
JOptionPane.showMessageDialog(null,"Sucessfully Added to plate");
}
else{
Insert="INSERT INTO SalesOrder (CustID,ProductDescription,Quantity,TotalPrice) VALUES (?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(Insert);
pstmt.setInt(1,CustID);
pstmt.setString(2, ProductDescription);
pstmt.setInt(3, qty);
pstmt.setBigDecimal(4, TotalValue);
pstmt.executeUpdate();
pstmt.close();
JOptionPane.showMessageDialog(null,"Sucessfully Added to plate");
}
}
catch(SQLException e){
JOptionPane.showMessageDialog(null,"Something went wrongn");
e.printStackTrace();
}
finally{
try {
conn.close();
} catch (SQLException ex) {
Logger.getLogger(POPUP_Message_FriedRice.class.getName()).log(Level.SEVERE, null, ex);
}}
}
Комментарии:
1.
statement.executeUpdate
возвращаетint
результат as, который представляет собой количество затронутых строк. Вы можете использовать его, чтобы узнать, обновлена ли какая-либо запись или нет.2. Кстати, если вы используете
PreparedStatement
не объединять описание продукта, используйте параметр?
for и свяжите его, таким образом, вы должны опустить одинарные кавычки. Таким образом, запрос будет:update SALESORDER set Quantity = ?, TotalPrice = ? where ProductDescription = ?
3. Кроме того, вы можете сделать что-то вроде
update SALESORDER set Quantity = Quantity ?, TotalPrice = TotalPrice ? where ProductDescription = ?
, так что вы просто увеличиваете числа, и вам не нужно извлекать его перед его увеличением.4. Итак, я делаю это ответом, и вы принимаете его.
Ответ №1:
Statement.executeUpdate
возвращает int
число затронутых строк, вы можете понять, существовали записи или нет, используя это поле.
Итак, ваш код становится чем-то вроде:
public static final String UPDATE_QUERY = "UPDATE SALESORDER SET Quantity = Quantity ?, TotalPrice = TotalPrice ? WHERE ProductDescription = ? and CustId = ?";
public static final String INSERT_STATEMENT = "INSERT INTO SalesOrder (CustID,ProductDescription,Quantity,TotalPrice) VALUES (?,?,?,?)";
public void InsertOrderDetails() {
try (Connection connection = DriverManager.getConnection(connectionUrl, username, password)) {
//Opening database for connection
int affectedRows;
try (PreparedStatement updateStatement = connection.prepareStatement(UPDATE_QUERY)) {
updateStatement.setInt(1, quantity);
updateStatement.setBigDecimal(2, itemPrice);
updateStatement.setString(3, productDescription);
updateStatement.setInt(4, customerId);
affectedRows = updateStatement.executeUpdate();
}
if (affectedRows > 0) {
JOptionPane.showMessageDialog(null, "Sucessfully Added to plate");
} else {
try (PreparedStatement insertStatement = connection.prepareStatement(INSERT_STATEMENT)) {
insertStatement.setInt(1, customerId);
insertStatement.setString(2, productDescription);
insertStatement.setInt(3, quantity);
insertStatement.setBigDecimal(4, itemPrice);
insertStatement.executeUpdate();
}
JOptionPane.showMessageDialog(null, "Sucessfully Added to plate");
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Something went wrongn");
e.printStackTrace();
}
}
Я использую Java 7, попробуйте использовать ресурс здесь, чтобы удалить дублирующийся код.
Комментарии:
1. Спасибо, все работает нормально, это помогло мне уменьшить объем кода ,
Ответ №2:
public void InsertOrderDetails(){
String Insert;
String Update;
BigDecimal TotalValue=new BigDecimal(Total);
try
{
//Opening database for connection
conn = DriverManager.getConnection(connectionUrl, username, Pass);
Statement st=conn.createStatement();
String sql="SELECT * FROM SALESORDER WHERE ProductDescription ='" ProductDescription "'";
ResultSet rs=st.executeQuery(sql);
if(rs.next()){
Update="update SALESORDER set Quantity = Quantity ?, TotalPrice = TotalPrice ? where ProductDescription = ?";
PreparedStatement pstmt = conn.prepareStatement(Update);
pstmt.setInt(1,qty);
pstmt.setBigDecimal(2,TotalValue);
pstmt.setString(3,ProductDescription);
pstmt.executeUpdate();
pstmt.close();
JOptionPane.showMessageDialog(null,"Sucessfully Added to plate");
}
else{
Insert="INSERT INTO SalesOrder (CustID,ProductDescription,Quantity,TotalPrice) VALUES (?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(Insert);
pstmt.setInt(1,CustID);
pstmt.setString(2, ProductDescription);
pstmt.setInt(3, qty);
pstmt.setBigDecimal(4, TotalValue);
pstmt.executeUpdate();
pstmt.close();
JOptionPane.showMessageDialog(null,"Sucessfully Added to plate");
}
}
catch(SQLException e){
JOptionPane.showMessageDialog(null,"Something went wrongn");
e.printStackTrace();
}
finally{
try {
conn.close();
} catch (SQLException ex) {
Logger.getLogger(POPUP_Message_FriedRice.class.getName()).log(Level.SEVERE, null, ex);
}}
}