Sprawdzenie, czy w tabeli istnieje dane id

0

Cześć,

Poniżej metoda sprawdzająca, czy dane id istnieje w tabeli.
Czy macie propozycję jej uproszczenia albo zmiany?

Z góry dziękuję

   static boolean tabelRecordCheck(Connection connection, String table, String column, int id) throws SQLException {
        Statement statement = connection.createStatement();
        String existRow = "SELECT " + column + " FROM " + table + " WHERE " + column + " = " + id;
        ResultSet rst = statement.executeQuery(existRow);
        boolean resultSet = rst.next();
        if (!resultSet) {
            System.out.println("Błąd - nieistniejące id!");
        }
        rst.close();
        statement.close();
        return resultSet;
    }
1
  1. Dziwna metoda - w sensie założe. Czemu to dla dowolnej tabel i columny ma działać? - nietypowe. Jakiś "JavaMyAdmin" robisz?
  2. Sklejanie SQL => SQL injection, aczkolwiek w tym kodzie poniekąd SQL Injection jest by design - patrz punkt 1
  3. Tym niemniej zwykle warto przenieść się na PreparedStatement (w tym kodzie uda się to tylko w odniesieniu do id, które i tak jest "bezpiecznym" parametrem).
  4. Nie zamykasz poprawnie rst, statement - w razie błędu się nie zamkną - używaj try (resource) {} https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
  5. Metoda zwraca boolean, ale jeszcze niepotrzebnie śmieci po konsoli (System.out)- po co? Nie robi się takich rzeczy. To, że nie ma id to nie jest żaden Błąd tylko normalny wynik.
  6. Najważniejsze - najlepiej nie używaj JDBC gołego. Jest zbyt niskopoziomowe i pełne pułapek - skończy się to katastrofą na 100%. Jest trochę alternatyw, nie wiem co zamierzasz, więc nie mogę Ci polecić konkretu. Jakkolwiek blisko JDBC jest JDBI i nie ma tylu pułapek.
0

Kazda tabela ma kolumnę z innym id.
Przykład poniżej:

String sql_tabela_nauczyciel = "CREATE TABLE Nauczyciel (idn integer, nazwisko_nauczyciela char(30), imie_nauczyciela char(20))";

String sql_row1 = "INSERT INTO Nauczyciel (idn, nazwisko_nauczyciela, imie_nauczyciela) VALUES (1, 'Kowalski', 'Jan')";
String sql_row2 = "INSERT INTO Nauczyciel (idn, nazwisko_nauczyciela, imie_nauczyciela) VALUES (2, 'Nowak', 'Janina')";
String sql_row3 = "INSERT INTO Nauczyciel (idn, nazwisko_nauczyciela, imie_nauczyciela) VALUES (3, 'Stradomski', 'Jerzy')";

Takich tabel mam kilka. Chodzi mi o to, aby przy pisywaniu z konsoli danych dotyczących danego id, poprawność tego id było sprawdzane.

 if (tabelRecordCheck(polaczenie, "ocena", "ido", idOceny) &&
                        tabelRecordCheck(polaczenie, "przedmiot", "idp", idPrzedmiotu) &&
                        tabelRecordCheck(polaczenie, "uczen", "idu", idUcznia) &&
                        tabelRecordCheck(polaczenie, "nauczyciel", "idn", idNauczyciela)) {

                    PreparedStatement polaczenie2 = polaczenie.prepareStatement(insertRow);
                    polaczenie2.setInt(1, idNauczyciela);
                    polaczenie2.setInt(2, idUcznia);
                    polaczenie2.setInt(3, idPrzedmiotu);
                    polaczenie2.setInt(4, idOceny);
                    polaczenie2.setString(5, rodzajOceny);
                    System.out.println("execute: " + polaczenie2.executeUpdate());
                    polaczenie2.close();
                    break;
                }
            } catch (Exception ex) {
                scanner2.nextLine();
                System.out.println("Nieprawidłowy format id!");
            }

Jak możesz podać przykład jak uprościć metodę z pierwszego postu.
Z góry dziękuję.

1

Ręczny Id podczas insertu nauczyciela mi się nie podoba.

A jak dzwoneczek mi zadzwonił, nabrałem podejrzeń do czego ci ta funkcja potrzebna, bo być może do zdrożnych celów

2

Poprzednik dobrze prawi - tej metody w ogóle nie powinno być. Radykalnie uprościsz ją poprzez klawisz DEL( użyty wielokrotnie),
Użytkownik w konsoli nie powinien podawać ID - to system powinien przydzielać je automatycznie (i poprawnie). Typowo w bazach danych SQL używa się do tego sekwencji.

0

Przy wpisywaniu np. nauczyciela wybieram jego id.
Jak mam to zrobić inaczej?

1

@zhup ustawiasz że ID jest autogenerated a potem w insercie pomijasz to pole. Czyli np. w schemie masz id bigint identity albo jakąś sekwencje a potem masz INSERT INTO Nauczyciel (nazwisko_nauczyciela, imie_nauczyciela) VALUES ( 'Kowalski', 'Jan') i samo się zrobi.

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