Wymagania wstępne:

  1. Masz utworzony folder C:/Przykłady
  2. Jeśli działasz z linii poleceń utworzyłeś ścieżkę CLASSPATH lub MODULEPATH prowadzące do plików *.jar Apache Derby
  3. Jeżeli programujesz w IDE masz dodaną bibliotekę Apache Derby do projektu

Klasy

Klasa R007.java
1    package aderby.start;
2    
3    import aderby.DerbyUtil;
4    
5    import java.sql.*;
6    
7    public class R007 {
8        private static final String baza = "C:\\Przyklady\\thirddb";
9        private static final String properties = "create=true";
10       private static final String createTable = "CREATE TABLE thirdtable (id INT PRIMARY KEY, name VARCHAR (30))";
11       private static final String insertData = "INSERT INTO thirdtable VALUES(1, 'Mirka'),(2, 'Ula'),(3, 'Jacek')";
12       private static final String selectData1 = "SELECT * FROM thirdtable";
13       private static final String selectData2 = "SELECT * FROM thirdtable WHERE id=2";
14   
15       public static void main(String[] args) {
16           DerbyUtil.startDerbyEngine(DerbyUtil.embdriver);
17           Connection conn = DerbyUtil.connectEmbeddedDB(baza, properties);
18           Statement stat1 = null;
19           Statement stat2 = null;
20           Statement stat3 = null;
21           Statement stat4 = null;
22           ResultSet rs1 = null;
23           ResultSet rs2 = null;
24           try {
25               stat1 = conn.createStatement();
26               stat1.execute(createTable);
27               stat2 = conn.createStatement();
28               stat2.execute(insertData);
29               stat3 = conn.createStatement();
30               rs1 = stat3.executeQuery(selectData1);
31               while (rs1.next()) {
32                   System.out.println(rs1.getInt(1) + " | " + rs1.getString(2));
33               }
34               stat4 = conn.createStatement();
35               rs2 = stat4.executeQuery(selectData2);
36               while (rs2.next()) {
37                   System.out.println(rs2.getInt(1) + " | " + rs2.getString(2));
38               }
39           } catch (SQLException e) {
40               e.printStackTrace();
41           }
42           DerbyUtil.close(rs1);
43           DerbyUtil.close(rs2);
44           DerbyUtil.close(stat1);
45           DerbyUtil.close(stat2);
46           DerbyUtil.close(stat3);
47           DerbyUtil.close(stat4);
48           DerbyUtil.close(conn);
49           DerbyUtil.shutdownEmbeddedDB(baza);
50           DerbyUtil.shutdownDerbyEngine();
51       }
52   }
53   

Ad. 8. Ścieżka do bazy danych
Ad. 9. Jeden z atrybut połączenia. Baza danych jest tworzona poprzez ustanowienie połączenia. Jeżeli create=true, a baza istnieje zostanie ustanowione polączenie, jeśli baza nie istnieje baza zostanie utworzona i zostanie z nią nawiązane połączenie.
Ad 10. Polecenie SQL utworzenia tabeli zawierającej dwie kolumny (id, name). W pierwszej kolumnie umieszczane będą liczby typu int. PRIMARY KEY oznacza zakaz wprowadzenia danej liczby więcej niż raz, ponieważ liczby te będą używane do wyszukiwania. Nie ma obowiązku wprowadzania liczb w określonej kolejności. W drugiej umieszczane mogą być łańcuchy znaków (stringi) o długości do 30 znaków.
Ad. 11. Polecenie SQL wstawienia kolejnych trzech rekordów.
Ad. 12. Polecenie SQL wybrania wszystkich danych z tabeli.
Ad. 13. Polecenie wybrania rekordu, który w kolumnie id ma wartosć 2.
Ad. 16. Startuje silnik Derby, wczytując sterownik.
Ad. 17. Utworzenie połączenia z podana bazą z użyciem podanych własciwości.
Ad. 25. Utworzenie polecenia.
Ad. 26. Wykonanie polecenia utworzenia tabeli.
Ad. 27. Utworzenie polecenia.
Ad. 28. Wykonanie polecenia wstawienia danych do tabeli
Ad. 29. Utworzenie polecenia
Ad. 30. Wykorzystanie polecenia do wykonania zapytania i utworzenia zbioru wynikowego.
Ad. 31 – 33. Przegladanie zbioru wynikowego i drukowanie wszystkoego co zostanie znalezione.
Ad. 34 – 38. Jak Ad. 29 – 33.
Ad. 42 – 48. Zamykamy zbiory wynikowe, polecenia i połączenie w kolejności odwrotnej niz były tworzone.
Ad. 49. Zamyka pojedynczą bazę danych.
Ad. 50. Stopuje silnik derby (i wszystkie ewentualne bazy).

Klasa DerbyUtil
1    package aderby;
2    
3    import java.lang.reflect.InvocationTargetException;
4    import java.sql.*;
5    
6    public class DerbyUtil {
7        public static final String embdriver = "EmbeddedDriver";
8        private DerbyUtil() {
9        }
10       //---------------------- R007 ------------------------------------------
11   
12       /**
13        * Startuje DerbyEngine. Jeśi załadowano Embedded Driver można
14        * od razu połączyć się z bazą danych. Jeśli załadowano ClientDriver
15        * aby połączyć się z bazą danych należy wcześniej uruchomić NetworkServer
16        * na tym lub zdalnym komputerze (w zależności gdzie znajduje się baza
17        * danych). Jeśli baza danych znajduje się na innym komputerze to
18        * połączenie z nią jest możliwe o ile na komputerze z bazą
19        * zostaną ustawione odpowiednie prawa dostępu. Jeżeli nie zostaną
20        * ustawione możliwe jest połączenie tylko z tego komputera, na którym
21        * baza się znajduje
22        *
23        * @param driverName - nazwa sterownika
24        * @return - true -jeśli sterownik został załadowany i silnik bazy danych
25        * Derby został uruchomiony, false - jeśli sterownik bazy danych nie został
26        * załadowany i silnik bazy danych nie został uruchomiony
27        */
28       public static boolean startDerbyEngine(String driverName) {
29           return loadDBDriver(driverName);
30       }
31   
32       /**
33        * Ładuje wskazany sterownik bazy danych
34        *
35        * @param driverName - nazwa sterownika do załadowania
36        * @return - true - jeśli sterownik został załadowany, false - w
37        * przeciwnym przypadku
38        * @throws IllegalArgumentException - wyrzucany wyjątek
39        */
40       private static boolean loadDBDriver(String driverName)
41               throws IllegalArgumentException {
42           if (driverName.equals("EmbeddedDriver")
43                   || driverName.equals("ClientDriver")) {
44               try {
45                   try {
46                       Class.forName("org.apache.derby.jdbc." + driverName).getDeclaredConstructors()[0].newInstance();
47                   } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
48                       e.printStackTrace();
49                   }
50               } catch (ClassNotFoundException e) {
51                   e.printStackTrace();
52                   return false;
53               }
54           } else {
55               throw new IllegalArgumentException("Niewłaściwa nazwa sterownika");
56           }
57           return true;
58       }
59   
60       /**
61        * Tworzy połaczenie z wbudowaną bazą danych. Ustawia właściwości określone
62        * w łańcuchu znaków 'properties'
63        *
64        * @param dbName     - nazwa bazy danych lub ścieżka do bazy danych z nazwą
65        *                   bazy danych na końcu
66        * @param properties - pary właściwości połączenia (nazwa=właściwość)
67        *                   oddzielone średnikami. Średnik na początku i końcu nie są potrzebne.
68        * @return - połączenie z bazą danych
69        */
70       public static Connection connectEmbeddedDB(String dbName, String properties) {
71           Connection conn = null;
72           try {
73               conn = DriverManager.getConnection("jdbc:derby:" + dbName + ";" + properties);
74           } catch (Throwable e1) {
75               e1.printStackTrace();
76           }
77           return conn;
78       }
79   
80       /**
81        * Zamyka polecenie
82        *
83        * @param stat - polecenie do zamknięcia
84        */
85       public static void close(Statement stat) {
86           if (stat != null) {
87               try {
88                   stat.close();
89               } catch (SQLException e) {
90                   e.printStackTrace();
91               }
92           }
93       }
94   
95       /**
96        * Zamyka połączenie
97        *
98        * @param conn - połączenie do zamknięcia
99        */
100      public static void close(Connection conn) {
101          if (conn != null) {
102              try {
103                  conn.close();
104              } catch (SQLException e) {
105                  e.printStackTrace();
106              }
107          }
108      }
109  
110      /**
111       * Zamyka bazę o podanej nazwie
112       *
113       * @param dbName - nazwa bazy do zamknięcia
114       * @return true - jesli baza zostala zamknieta, false - w przeciwnym wypadku
115       */
116      public static boolean shutdownEmbeddedDB(String dbName) {
117          boolean gotSQLExc = false;
118          try {
119              DriverManager
120                      .getConnection("jdbc:derby:" + dbName + ";shutdown=true");
121          } catch (SQLException se) {
122              if (se.getSQLState().equals("XJ015")) {
123                  gotSQLExc = true;
124              }
125          }
126          return gotSQLExc;
127      }
128  
129      /**
130       * Zatrzymuje silnik bazy danych Derby i wszystkie bazy danych,
131       *
132       * @return - true - jeśli silnik został zatrzymany i wszystkie bazy zostały
133       * zamknięte, false - w przeciwnym przypadku.
134       */
135      public static boolean shutdownDerbyEngine() {
136          boolean gotSQLExc = false;
137          try {
138              DriverManager.getConnection("jdbc:derby:;shutdown=true");
139          } catch (SQLException se) {
140              if (se.getSQLState().equals("XJ015")) {
141                  gotSQLExc = true;
142              }
143          }
144          return gotSQLExc;
145      }
146  
147      /**
148       * Zamyka zbiór wynikowy
149       *
150       * @param rs - zamykany zbiór wynikowy
151       */
152      public static void close(ResultSet rs) {
153          if (rs != null) {
154              try {
155                  rs.close();
156              } catch (SQLException e) {
157                  e.printStackTrace();
158              }
159          }
160      }
161  
162  }
163  
module-info.java
module aderby {
    requires java.sql;
}
Wynik

Po uruchomieniu kodu na konsoli zobaczymy:

1 | Mirka
2 | Ula
3 | Jacek
2 | Ula

W folderze C:/Przykłady znajdziemy bazę o nazwie thirddb.

Pliki do ściągniecia

Klasa R007.java.
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszyskich wpisach w projekcie. W przypadku pliku module-info.java może być potrzebne skreślenie niepotrzebnych wpisów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *