Czy zdajesz sobie sprawę z tego, że faktycznie uzyskujesz dostęp do backendu z poziomu swojego GUI? Przekazujesz parametry z pól tekstowych bezpośrednio do swojej bazy danych. To jest źródło poważnych wpadek. Przynajmniej zweryfikuj swoje dane wejściowe lub Małe stoliki Bobby przedwcześnie zakończy umowę o pracę.
Co do twojego błędu:Przepraszamy, ale ten kod wymaga poważnej refaktoryzacji. Sam na liczniku linii ten kod robi za dużo. Pierwsza złota zasada:używaj krótkich metod. Druga złota zasada:skróć je.
Fakt, że sam nie rozumiesz, co się dzieje, jest dla Ciebie dużym czerwonym światłem i pokazuje, że musisz ponownie przemyśleć swój projekt.
- Uczyń metody, które piszą rzeczy za pomocą JDBC.putData() jako samodzielne.
- Zrób to samo z JDBC.getData().
- Zobacz pojawiający się wzór.
Myślę, że jest to przedwczesne wywołanie connection.close() w JDBC. Dzieląc swoje operacje na bardziej niepodzielne, możesz lepiej wnioskować o swoim kodzie, a tym samym zrozumieć występujący błąd.
Przepraszam, że nie dostarczasz rozwiązania, ale na dłuższą metę lepiej będzie, jeśli będziesz przestrzegać pewnych zasad kodu. Naucz się ich! Im szybciej tym lepiej i ponieważ potrzebuję więcej karmy:Przeczytaj „Clean-Code” Roberta C. Martina.http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882
Będziesz wtedy na ścieżce oświecenia, a tym samym użyjesz DAOFactory (podpowiedź) i wzorca projektowego DAO (również podpowiedzi) i zostaniesz bogiem kodera. Gratulacje!
Cóż, oto mały przewodnik po tym, jak może wyglądać refaktoryzacja. Nie skończone i nieprzetestowane, i chyba zepsułem sekwencję wstawiania SQL (nie wiem, który identyfikator transakcji jest używany gdzie). Ale mam nadzieję, że wpadniesz na pomysł. Miłego dnia i witaj na Jamajce!
package mysqlfix;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextField;
public class JDBC {
static Connection con = null;
static boolean b;
static PreparedStatement state;
public static void setCon() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/lottery", "root", "123");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static Connection getCon() throws Exception {
if (con == null) {
setCon();
}
return con;
}
public static boolean putData(String sql) {
try {
getCon().setAutoCommit(false);
state = getCon().prepareStatement(sql);
state.executeUpdate();
getCon().commit();
b = true;
} catch (Exception e) {
e.printStackTrace();
b = false;
}
return b;
}
// connection commit
public static void commit() {
try {
con.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
// rollback data
public static void rollback() {
if (con != null) {
try {
con.rollback();
} catch (SQLException ex) {
Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
// close statement
public static void putClose() {
try {
state.close();
} catch (SQLException ex) {
Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
}
}
// close connection
public static void conClose() {
try {
con.setAutoCommit(true);
con.close();
} catch (SQLException ex) {
Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
}
}
// clear prepared statement
public static void putClear() {
try {
if (state != null && !state.isClosed()) {
state.close();
}
} catch (SQLException ex) {
Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
}
}
// clear the connection
public static void conClear() {
try {
if (con != null && !con.isClosed()) {
con.setAutoCommit(true);
con.close();
}
} catch (SQLException ex) {
Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static ResultSet getData(String sql) throws Exception {
Statement state = getCon().createStatement();
ResultSet rs = state.executeQuery(sql);
return rs;
}
public void saveTotal(JTextField txtGtotal, JTextField txtPTotal) {
SuperDAO superDAO = new SuperDAO();
if (superDAO.getMaxIdFromOrder() > 0) {
Date date1;
date1 = new Date();
String txtGTotalFromTextField = txtGtotal.getText();
String txtPTotalFromTextField = txtPTotal.getText();
boolean b1 = false;
//regarding the transaction id...
//this changes whilst updating the table transaction.
int transactionId = -1;
if (txtGTotalFromTextField.matches("[a-zA-Z]")) {
transactionId = superDAO.insertOrderIntoTransaction(date1, txtGTotalFromTextField);
//b1 = JDBC.putData("insert into transaction(tr_date, amount, tr_type) values ('" + date1 + "' , '" + txtGTotalFromTextField + "' , 'order')");
}
if (transactionId > 0) {
try {
} catch (Exception ex) {
Logger.getLogger(JDBC.class.getName()).log(Level.SEVERE, null, ex);
}
if (txtPTotalFromTextField.matches("[a-zA-Z]")) {
transactionId = superDAO.insertProfitIntoTransaction(date1, txtGTotalFromTextField);
}
JDBC.putData("insert into o_de(or_id, tr_id, oday, gtotal) values ('" + superDAO.getMaxIdFromOrder() + "' , '" + transactionId + "','" + date1 + "','" + txtGtotal.getText() + "' )");
JDBC.putData("insert into order_profit(or_id, tr_id, ptotal) values ('" + superDAO.getMaxIdFromOrder() + "' , '" + transactionId + "','" + txtPTotal.getText() + "' )");
//JDBC.commit();
//JOptionPane.showMessageDialog(null, "Order Saved Sucessfully..");
JDBC.putClose();
JDBC.conClose();
}
}
}
}
package mysqlfix;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author edm
*/
public class SuperDAO {
Connection conn;
public SuperDAO() {
try {
this.conn = JDBC.getCon();
} catch (Exception ex) {
Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
}
}
public int getMaxIdFromOrder() {
try {
ResultSet rs = JDBC.getData("select MAX(or_id) as or_id from `order`");
if (rs.first()) {
return rs.getInt("or_id");
}
} catch (SQLException ex) {
Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return -1;
}
public int getMaxIdFromTransaction() {
ResultSet rs;
try {
rs = JDBC.getData("select MAX(tr_id) as tr_id from transaction");
if (rs.first()) {
return rs.getInt("tr_id");
}
} catch (Exception ex) {
Logger.getLogger(SuperDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return -1;
}
public int insertOrderIntoTransaction(Date date, String text) {
JDBC.putData("insert into transaction(tr_date, amount, tr_type) values ('" + date + "' , '" + text + "' , 'order')");
return getMaxIdFromTransaction();
}
public int insertProfitIntoTransaction(Date date, String text) {
JDBC.putData("insert into transaction(tr_date, amount, tr_type) values ('" + date + "' , '" + text + "' , 'profit')");
return getMaxIdFromTransaction();
}
}
Oczywiście na tym podróż się nie kończy. Nie ukończyłem JDBC saveTotal(). Dopiero zacząłem, resztę zrobisz.
Proszę zauważyć, że nie testowałem tego kodu w bazie danych (brakowało niektórych plików sql ddl). Nie korzystałem też z mechanizmu wycofywania. Ponadto saveTotal() znajduje się w JDBC, gdzie nie należy. Użyj saveTotal w swoim GUI (jeśli to konieczne) i pozwól, aby wszystkie dostępy do bazy danych przepływały przez SuperDAO. To nie jest najlepszy projekt, ale nie jest zbyt abstrakcyjny i możesz łatwo zobaczyć, jak oddzielenie troski sprawia, że twój kod jest trochę bardziej czytelny i łatwiejszy w utrzymaniu.