Java mySql + array ?

0

Cześć wszystkim

Mam problem z aplikacja, wszystko działa tak jak powinno tylko problem polega na tym, chciałbym aby można było zrobić update tylko po nazwie nie wpisując wszystkie pola, oraz jak nie wpisze nic w żadne pola to żeby pojawiła się informacja nie dokonano żadnego wpisu lub coś podobnego ale nie wiem jak. Czy zastosować array ?, był by może ktoś w stanie wyjaśnić jak albo wkleić kod przykładowy abym mógł się odnieść.

Dziękuję z góry.

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JTextField;
import net.proteanit.sql.DbUtils;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.awt.event.ActionEvent;

public class main extends javax.swing.JFrame {

	Connection con =null;
	ResultSet rs=null;
	PreparedStatement pts=null;
	
	private JFrame frame;
	private JTextField textField;
	private JTextField textField_1;
	private JTextField textField_2;
	private JTextField textField_3;
	private JTable DB;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					main window = new main();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

		/**
	 * Create the application.
	 */
	public main() {
		initialize();
		connection();
		fetch();
		
	}
/*Metoda łączenie */
public void connection(){
	
	Statement st = null;
	try{
	con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/bookshop","root","Password");
	st = con.createStatement();
	}catch(Exception ex){
		JOptionPane.showMessageDialog(null,ex.getMessage());
	}
}
	

/* Metoda to pobierania danych z sql*/	
public void fetch(){
	try{
		String q="select * from book";
		pts=con.prepareStatement(q);
		rs=pts.executeQuery();
		
		DB.setModel(DbUtils.resultSetToTableModel(rs));
	}catch(Exception e){
		JOptionPane.showMessageDialog(null, e);
	}
	
	}
	

/*Metoda używana do przycisków : Insert,Update,Delete */
public void theQuery(String query){

	Connection con = null;
	Statement st = null;
	try{
		con = DriverManager.getConnection("jdbc:mysql://localhost/bookshop","root","Password");
		st = con.createStatement();
		st.executeUpdate(query);
		}catch(Exception ex){
			JOptionPane.showMessageDialog(null,ex.getMessage());
		}
}
	
	/**
	 * Tworzenie ramy i całego layoutu
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 768, 522);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
/*Przycisk insert + metoda*/
		JButton btnNewButton = new JButton("Insert");
		btnNewButton.addActionListener(new ActionListener() {
			     public void actionPerformed(ActionEvent e) {
		         try(ResultSet rs = pts.executeQuery())
		         {
		             theQuery("insert into book (bookname,authorname,price) values('"+textField_1.getText()+"','"+textField_2.getText()+"',"+textField_3.getText()+")");
		             JOptionPane.showMessageDialog(null, "Book inserted successfully");
		         }
		         catch(Exception ex){}
		     	}
		});
		btnNewButton.setBounds(22, 160, 89, 23);
		frame.getContentPane().add(btnNewButton);
		
/*Przycisk usuń + metoda */ 
		JButton btnNewButton_1 = new JButton("Delete");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try{
			          
		             theQuery("delete from book where bookID = "+textField.getText());
		             JOptionPane.showMessageDialog(null, "Book deleted");
		         }
		         catch(Exception ex){}
			}
		});
		btnNewButton_1.setBounds(22, 228, 89, 23);
		frame.getContentPane().add(btnNewButton_1);
		
/* Przycisk update */
		JButton btnNewButton_2 = new JButton("Update");
		btnNewButton_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try{	         
			         theQuery("update book set bookName = '"+textField_1.getText()+"',authorName = '"+textField_2.getText()+"', price = "+textField_3.getText()+" where bookID      = "+textField.getText());
			         if(theQuery(paramString() != null) {
			        	 JOptionPane.showMessageDialog(null, "No data was entered");
			         }
			         else{	 
			         
			         JOptionPane.showMessageDialog(null, "Price update Successfully");
			         }
			         }
			         
			         catch(Exception ex){}
			         }
		});
		btnNewButton_2.setBounds(22, 194, 89, 23);
		frame.getContentPane().add(btnNewButton_2);
		
		textField = new JTextField();
		textField.setBounds(133, 35, 86, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		textField_1 = new JTextField();
		textField_1.setColumns(10);
		textField_1.setBounds(133, 64, 86, 20);
		frame.getContentPane().add(textField_1);
		
		textField_2 = new JTextField();
		textField_2.setColumns(10);
		textField_2.setBounds(133, 95, 86, 20);
		frame.getContentPane().add(textField_2);
		
		textField_3 = new JTextField();
		textField_3.setColumns(10);
		textField_3.setBounds(133, 126, 86, 20);
		frame.getContentPane().add(textField_3);
		
		JLabel lblNewLabel = new JLabel("Book ID");
		lblNewLabel.setBounds(22, 35, 73, 20);
		frame.getContentPane().add(lblNewLabel);
		
		JLabel lblBookName = new JLabel("Book Name");
		lblBookName.setBounds(22, 67, 73, 20);
		frame.getContentPane().add(lblBookName);
		
		JLabel lblBookAuthor = new JLabel("Book Author");
		lblBookAuthor.setBounds(22, 98, 73, 20);
		frame.getContentPane().add(lblBookAuthor);
		
		JLabel lblPrice = new JLabel("Price");
		lblPrice.setBounds(22, 129, 73, 20);
		frame.getContentPane().add(lblPrice);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(241, 38, 478, 405);
		frame.getContentPane().add(scrollPane);
		
		
                DB = new JTable();
		scrollPane.setViewportView(DB);
/*Przycisk Odswież*/
		JButton btnRefresh = new JButton("Refresh");
		btnRefresh.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				fetch();
			}
		});
		btnRefresh.setBounds(22, 262, 89, 23);
		frame.getContentPane().add(btnRefresh);
	}
}

0

Wrzuć najpierw tagi bo oczopląsu można dostać po czytaniu tego.

0

Troche lepiej powinno być teraz

0

Po kolei. Problemy masz 2:

Ic3m4n napisał(a):

chciałbym aby można było zrobić update tylko po nazwie nie wpisując wszystkie pola

  1. Ale co to znaczy że chciałbyś zrobić update po nazwie? Chcesz aktualizować tylko nazwę książki?
Ic3m4n napisał(a):

jak nie wpisze nic w żadne pola to żeby pojawiła się informacja nie dokonano żadnego wpisu lub coś podobnego

  1. Przed wysłaniem zapytania pobierz wszystkie wartości z pół tak jak to zresztą robisz, np.:
textField_2.getText()

i sprawdź czy pole jest wypełnione, np:

if (textField_2.getText() == null || textField_2.getText().isEmpty()){
                    showErrorMessage();

Twoich pól jest bodajże 4 więc nie pisz tego byle gdzie byleby wyglądała jak ta wyżej x4 bo będzie to strasznie nieczytelne. Dodaj jakąś metodę np:

 
private boolean strIsEmpty(String){
   return textField_2.getText() == null || textField_2.getText().isEmpty();
}

I obsłuż to podając wartości tamtych pól. A w ogóle najlepiej by było nową klasę np. FieldValidator i tam sprawdź czy wszystkie pola są wypełnione.
PS. Przeczytaj książkę "Czysty Kod". Jeśli Twój projekt działa to super, ale warto też zacząć robić kroki w poprawieniu jakości kodu bo straszny antypattern tu pokazałeś.

0

Dzięki za pomoc, jeżeli chodzi o update to przykładowo chciałbym zmienić cenę jednej z książek które są w bazie i nie chce wpisywać wszystkich pól tylko nazwę książki i oczywiście cenę.
Kod poprawie bo tak jak pisałeś wygląda dość nietypowo.

0
Ic3m4n napisał(a):

Dzięki za pomoc, jeżeli chodzi o update to przykładowo chciałbym zmienić cenę jednej z książek które są w bazie i nie chce wpisywać wszystkich pól tylko nazwę książki i oczywiście cenę.

Oczywiście da się to zrobić ale jak obsłużysz takie sytuacje:

  1. Co powinno się stać jeśli w bazie będą 2 książki z tym samym tytułem (inny autor, inne id itd, jedynie tytuły się pokryły)?
  2. Co jeśli zrobisz literówkę w nazwie książki i chciałbyś aktualizować w książce tylko tytuł?

Na razie pytam tylko teoretycznie o scenariusz (nie o konkretne rozwiązanie) co powinno się wydarzyć jeśli napotkasz powyższe sytuacje.

0

BookId powinno być inkementowane automatycznie ale nie do końca wiem jak to zrobić, i to by rozwiązało problem z dwoma tymi samymi książkami, jeżeli chodzi o tytuł to nie miałem takiej instrukcji, wykładowcy chodziło tylko o zmianę ceny podając tylko nazwę książki.

0

Aaa no to pisz że to projekt studencki ;)
BookId będzie inkrementowane automatycznie po stronie bazy jeśli dodasz do Id 2 rzeczy:

  1. Primary key ( http://www.w3schools.com/sql/sql_primarykey.asp ) - chociaż to pewnie masz
  2. Auto_increment ( http://www.w3schools.com/SQl/sql_autoincrement.asp )

Nie używam JDBC ale wydaje mi się że możesz bez problemu zrobić tak:

  1. Wpisujesz tylko tytuł książki który jest wymagany + pola które chcesz aktualizować.
  2. Robisz selecta na bazie i pobierasz książkę o tytule który wpisałeś.
  3. Następnie na tym co Ci zwróci (będziesz już miał ID książki) aktualizujesz pola które chcesz zmienić (ważne tylko jest żebyś wcześniej sprawdził które pola zostały wypełnione a nie na ślepo wszystkie ustawił bo wtedy Ci się ustawią też puste pola w miejscu w którym nic nie podałeś).
  4. Robisz normalny update.
0

Dzięki wielkie za pomoc, jutro będę próbował coś zmieniać dzisiaj już nie dam rady, ciężki dzień za mną.

Pozdrawiam.

0

Mam problem żadne z polecen nie chce mi działać. Wskazania mam takie :

  • zobaczyć wszystkie książki w sklepie
  •   dodanie nowej książki do bazy
    
  • zrobić update ceny używając nazwy książki
  • usunięcie książki używając jej nazwy

Co robię nie tak ?

JButton btnDeleteBook_1 = new JButton("Delete book");
		btnDeleteBook_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try
				{
					if (textField_3.getText() == null || textField_3.getText().isEmpty()){
						JOptionPane.showMessageDialog(null, "Please enter some details");
					}else {JOptionPane.showMessageDialog(null,"Book deleted successfully");}
					
					theQuery("delete from book where bookName="+textField_3.getText()+")");
					/*JOptionPane.showMessageDialog(null,"Book inserted successfully");*/
				}
				
				catch(Exception ex){}
				}
		});

	JButton btnUpdatePrice_1 = new JButton("Update Price");
		btnUpdatePrice_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try
				{
					if (textField_5.getText() == null || textField_5.getText().isEmpty()){
						JOptionPane.showMessageDialog(null, "Please enter some details");
					}else {JOptionPane.showMessageDialog(null,"Book inserted successfully");}
					
					theQuery("UPDATE book set price = "+textField_5.getText()+" where bookName = "+textField_4.getText());
					/*JOptionPane.showMessageDialog(null,"Book inserted successfully");*/
				}
				
				catch(Exception ex){}
							}
		});

public void theQuery(String query){

		Connection con = null;
		Statement st = null;
		try{
			con = DriverManager.getConnection("jdbc:mysql://localhost/bookshop","root","Password");
			st = con.createStatement();
			st.executeUpdate(query);
			
		}catch(Exception ex){JOptionPane.showMessageDialog(null,ex.getMessage());}
	}
CREATE TABLE book
(
   bookID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   bookName varchar(30) NOT NULL,
   authorName varchar(30) NOT NULL,
   price double(5, 2)
);
0

Zacznij od sensownej obsługi błędów

catch(Exception ex){
  //coś tu wyświetl, minimum to System.out.println(ex);
}
0

Przy update po wpisaniu nazwy

Unknown column "r" 'where clause'

usuwanie

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

PK jest w bookID i jak podam bookId to bez problemu usunie zapis czy wpisac w kodzie aby zrzucił PK z ID i przepisac go do nazwy ? raczej chyba jest to nie możliwe. Nie wiem co zastosować aby zadziałało mi usuwanie i update.

0

Jak wpisze

 theQuery("Delete from book where bookID="+textField_3.getText()); 

to nie ma problemu wszystko działa po nazwie błąd jak w poprzedniej widomości ręce mi już opadają brakuje mi 2 rzeczy i nie mogę znaleźć rozwiązania.

0

Porównaj zapytanie działające

theQuery("Delete from book where bookID="+textField_3.getText());

z niedziałającym

theQuery("delete from book where bookName="+textField_3.getText()+")");

Znajdź wszystkie różnice i wyciągnij wnioski.

0

Doskonale wiem ze bookID ma PK i dla tego bez problemu wszystko działa, problem jest w tym ze chce aby działało po nazwie bez zmieniania bazy. Tak jak pisałem wcześniej.

0

Jezeli chodzi o +")"); to wkleiłem bez poprawek

0

Dostałeś komunikat

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
tzn. że ten błędny nawias jest w Twoim kodzie.

0

2x taki sam błąd Unknown column "r" 'where clause'

Próbowałem z alter table i nie przyjmuje mi nazwy książki :/


theQuery("Delete from book where bookName="+textField_3.getText());

theQuery("UPDATE book set price= "+textField_5.getText()+" where bookName ="+textField_4.getText());
0

Kolumna bookName jest znakowa. Polecenie powinno chyba wyglądać tak:

theQuery("Delete from book where bookName=\"" + textField_3.getText() + "\"");

1 użytkowników online, w tym zalogowanych: 0, gości: 1