klasy do obsługi bazy danych prośba o pomoc

0

Witam wszystkich,
Jestem początkującą osobą jeśli chodzi o javę, więc proszę o wyrozumiałość. Mam do zrobienia projekt na zaliczenie z materiału, którego jeszcze nawet nie robiliśmy niestety, a ciężko mi to ogarnąć. Mam stworzyć małą bazę danych w PostgreSQL i napisać aplikację CRUD wraz z GUI do jej obsługi.
Mam tylko dwie tabele:
Klienci(id_klienta jako INT klucz główny, imię, nazwisko,adres, numer_tel)
Wizyta(id_wizyty SERIAL jako klucz główny, id_klienta jako klucz obcy,data,wykonana_praca, cena)
Mam nadzieję, że chociaż układ bazy danych jest ok.
Ale mam problem:
nie mam pojęcia jak rozplanować klasyw javie, znalazłem sterownik do łączenia się z PostgreSQL i kod do sprawdzenia czy działa połączenie i to jest jedna klasa, polączenie działa ok.
Stworzyłem klasę Main, chciałem utworzyć te tabele, ale nie wiem jak się zabrać. Mam problem z inną klasą, którą próbowałem zrozumieć, znalazłem ją na jednymz tutoriali, ale nie wiem jak ją zmienić na swoje potrzeby:

package Hairdresser;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import javax.naming.ConfigurationException;


public class DBConnectionFactory {

       private static String connectionURI;
       private static boolean isPrepared = false;
       private static String connectionClass;

       private static void prepare() throws ConfigurationException {
               Properties properties = new Properties();
             
               try {
                       properties.load(new FileInputStream("db.configuration"));
               } catch (FileNotFoundException e) {
                       throw new ConfigurationException(e);
               } catch (IOException e) {
                       throw new ConfigurationException(e);
               }
               if (properties.containsKey("connection.uri")) {
                       connectionURI = properties.getProperty("connection.uri");
               } else {
                       throw new ConfigurationException("brak klucza connection.url");
               }
               if (properties.containsKey("connection.class")) {
                       connectionClass = properties.getProperty("connection.class");
               } else {
                       throw new ConfigurationException("brak klucza connection.class");
               }
               try {
                       Class.forName(connectionClass);
               } catch (ClassNotFoundException e) {
                       throw new ConfigurationException("brak sterownika " + connectionClass);
               }
               isPrepared = true;
       }

       public static Connection getConnection() throws ConfigurationException {
               if (!isPrepared)
                       try {
                               prepare();
                       } catch (ConfigurationException e) {
                               e.printStackTrace();
                       }
               try {
                       Connection connection = DriverManager.getConnection(connectionURI);
                       return connection;
               } catch (SQLException e) {
                       throw new ConfigurationException(e);
               }
       }

}

wyskakują mi errory przy każdym: ConfigurationException(e) - constructor undefined

nie wiem jak zmienić i gdzie wpisać ewentualnie moją ścieżkę do bazy jeśli o to chodzi...

próbowałem utworzyć tabele w bazie danych używając klasy Main:

package Hairdresser;

import java.sql.Connection;

public class Main {
        public static void main(String[] args) throws Exception {
                Connection conn = DBConnectionFactory.getConnection();
                String clientsQuery = "CREATE TABLE Cients ( client_id INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), " +
                		"firstname  VARCHAR(50), surname  VARCHAR(50), address VARCHAR(50), phone_no VARCHAR," +
                		"PRIMARY KEY (client_id) )";
                String visitQuery = "CREATE TABLE Visit ( visit_id INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," +
                		" client_id INT, date DATESTAMP, what_done VARCHAR, extra_info VARCHAR(50), price INT, PRIMARY KEY (visit_id), FOREIGN KEY(client_id) )";
                conn.createStatement().execute(clientsQuery);
                conn.createStatement().execute(visitQuery);
                conn.close();
        	}
}

ale oczywiście nie działa nic bo jest jakiś problem z połączeniem.....
aczkolwiek test następującym kodem działa:

package Hairdresser;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class JDBCConnectionTest {
 
	public static void main(String[] argv) {
 
		System.out.println("-------- PostgreSQL "
				+ "JDBC Connection Testing ------------");
 
		try {
 
			Class.forName("org.postgresql.Driver");
 
		} catch (ClassNotFoundException e) {
 
			System.out.println("Where is your PostgreSQL JDBC Driver? "
					+ "Include in your library path!");
			e.printStackTrace();
			return;
 
		}
 
		System.out.println("PostgreSQL JDBC Driver Registered!");
 
		Connection connection = null;
 
		try {
 
			connection = DriverManager.getConnection(
					"jdbc:postgresql://127.0.0.1:5432/Hairdresser", "postgres",
					"Jurijj11");
 
		} catch (SQLException e) {
 
			System.out.println("Connection Failed! Check output console");
			e.printStackTrace();
			return;
 
		}
 
		if (connection != null) {
			System.out.println("You made it Julian! You are a genius...take control your database now!");
		} else {
			System.out.println("Failed to make connection!");
		}
	}
 
}

przepraszam za moją amatorkę ale to naprawdę nie moja dziedzina.
czy ktoś mógłby mi udzielić jakichś wskazówek co robię źle i jak zorganizować mój kod i jakie klasy, podobno powinienem mieć osobne klasy do każdej tabeli ale nawet się za to nie biorę bo już utknąłem... a jeszcze mnie czeka CRUD i GUI a juz mam problemy. sam nie wiem co ma być gdzie i w jakich klasach.
jeśli ktoś byłby w stanie mi pomóc byłoby wspaniale, albo może ktoś ma jakiś tutorial dla naiwnych jak taki projekt zrobić krok po kroku.
Z góry dziękuję.
Julian

0

"podobno powinienem mieć osobne klasy do każdej tabeli ale nawet się za to nie biorę bo już utknąłem"

Przykładowo mająć tabelę
Klienci(id_klienta jako INT klucz główny, imię, nazwisko,adres, numer_tel)

Możesz zrobić klasę:

class Klienci {
int id_klient
String imie
String nazwisko
String adres
String tel
 +gettery/setter/konstuktory i wszystkie metody, których będziesz potrzebować jak np. toString()
}

Skoro ten drugi kod, już Cię połączył z bazą danych, używaj jego. Dodaj pole z "private Statement statement;", metody create i przykładowy kod:

public void utworzTabeleKlienci() {
statement = connection.createStatement();
statement.execute("CREATE TABLE Klienci(...............));"
                    );

P.S. Jak masz jakieś błędy to jeśli ich tutaj nie wkleisz, nie każdemu się chce analizować co może być źle w kodzie, zwłaszcza, że nie dodałeś kolorowania składni kodu żródłowego

0

przepraszam z amoje amatorskie umieszczenie zapytania na forum, jestem całkiem nowy tutaj. dziękuje bogdans za pokolorowanie, i dziękuję za podpowiedzi CYS odnośnie klasy dotyczącej tabeli. Problem jest taki, że to ciągle jest dla mnie czarna magia. Tzn że ten kod, który testuje połączenie wystarczy mi, żeby obsługiwać połączenie? Nie wiem jak to ugryżć. Czy ktoś mógły podac jakiś szkielet jakie klasy są potrzebne i co każda powinna zawierać, żeby to się jakoś trzymało kupy? Z góry dziękuję. Wiem, że moja niewiedza może irytować, ale to jest mój pierwszy projekt i nie moge nigdzie znależć jak zbudować taki projekt od podstaw.
Julian

0

Spróbuj coś z tego linka ogarnąć:
Bazy danych - JDBC

Generalnie do Twoich potrzeb interesuje Cię z tego linka od Tworzenie schematu do Operacje CRUD
Możesz zamienić metodę prepare() klasy DBConnectionFactory na swoją, która już Cię łączyła z bazą.

Idea jest w miare prosta - tworzysz klasę jak w przykładzie - DBConnectionFactory, która początkowo łączy Cię z bazą danych, a następnie wykonuje na niej operacje.
Klasy modelu są Ci potrzebne, aby przechowywać w nich dane zwracane z bazy, przykładowo:

        List<Klienci> rec = new ArrayList<Klienci>();
        Klienci klient;
        
        String query = "select ........ from Klienci";
        
        ResultSet resultSet = statement.executeQuery( query );  
        while (resultSet.next()) 
        {  
            klient = new Klienci();
            klient.setIDKlienta(resultSet.getInt(1));
            klient.setNazwa(resultSet.getString(2));
            ...........
            rec.add(klient);
        } 
        resultSet.close();
        
        return rec;   
0

Dziekuje bardzo CYS, niestety dzisiaj już nie zdążę tego sprawdzic, bo idę na wolontariat, ale dziękuję bardzo za Twoje wskazówki i jak tylko je przeanalizuję to powiem czy już mogę sobie poradzić.
Dziękuję bardzo i miłego dnia!!!

P.S.
Jestem otwarty na sugestie innych, jeśli ktoś miałby jakieś pomocne wskazówki albo materiały.

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