Apache Derby: typ danych Matrix
Polecenia SQL
W klasie MatrixUtil
dodajemy dwa polecenia tworzące typ Matrix
oraz tworzące tabelę do przechowywania danych tego typu.
public static final String CREATE_TYPE_MATRIX = "CREATE TYPE matrix " + "EXTERNAL NAME 'matrices.Matrix' LANGUAGE JAVA"; public static final String CREATE_TABLE = "CREATE TABLE macierze(" + "id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS " + "IDENTITY(START WITH 1, INCREMENT BY 1), macierz Matrix)";
Utworzenie bazy danych
Do zestawu klas dodajemy klasę DerbyUtil
.
Do klasy MatrixUtil dodajemy metodę tworzącą bazę danych:
public static void createMatrixDB(String path) { DerbyUtil.startDerbyEngine("EmbeddedDriver"); Connection con = DerbyUtil.connectEmbeddedDB(path, ";create=true"); Statement stat = null; try { stat = con.createStatement(); stat.addBatch(CREATE_TYPE_MATRIX); stat.addBatch(CREATE_TABLE); stat.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownDerbyEngine(); }
Bazę danych tworzymy w klasie Matrix038
:
package matrices2; import matrices.MatrixUtil; public class Matrix038 { public static void main(String[] args) { MatrixUtil.createMatrixDB("matrices/assets/baza_macierzy"); } }
Po uruchomieniu klasy w systemie plików zobaczymy bazę danych:
Zapis macierzy do bazy danych
Do klasy MatrixUtil dodajemy metodę:
public static void writeMatrixToDB(String path, Matrix matrix) { DerbyUtil.startDerbyEngine("EmbeddedDriver"); Connection con = DerbyUtil.connectEmbeddedDB(path, "; create=false"); PreparedStatement stmt = null; String insertSQL = "INSERT INTO macierze (id, macierz) values (DEFAULT,?)"; try { stmt = con.prepareStatement(insertSQL); stmt.setObject(1, matrix); stmt.executeUpdate(); stmt.clearParameters(); } catch (SQLException e1) { e1.printStackTrace(); } DerbyUtil.close(stmt); DerbyUtil.close(con); DerbyUtil.shutdownDerbyEngine(); }
Przy użyciu klasy Matrix039
odczytujemy macierz z pliku tekstowego i zapisujemy do bazy danych:
package matrices2; import matrices.Matrix; import matrices.MatrixUtil; public class Matrix039 { public static void main(String[] args) { Matrix matrix = new Matrix("matrices/assets/matrix1.txt"); MatrixUtil.writeMatrixToDB("matrices/assets/baza_macierzy", matrix); } }
Odczyt macierzy z bazy danych
Do klasy MatrixUtil
dodajemy nową metodę:
public static Matrix[] readMatricesFromDB(String path) { DerbyUtil.startDerbyEngine("EmbeddedDriver"); Connection con = DerbyUtil.connectEmbeddedDB(path, "; create=false"); String selectSQL = "SELECT * FROM macierze"; PreparedStatement pstm = null; ResultSet rs; Matrix[] mat = new Matrix[0]; try { pstm = con.prepareStatement(selectSQL); rs = pstm.executeQuery(); while (rs.next()) { mat = ArrayUtil.extendArray(mat); rs.getInt("id"); Matrix m = (Matrix) rs.getObject("macierz"); mat[mat.length - 1] = m; } } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(pstm); DerbyUtil.close(con); DerbyUtil.shutdownDerbyEngine(); return mat; }
Bazę odczytujemy uruchamiając klasę Matrix040:
package matrices2; import matrices.Matrix; import matrices.MatrixUtil; import matrices.Util; public class Matrix040 { public static void main(String[] args) { Matrix[] mat = MatrixUtil.readMatricesFromDB(" matrices/assets/baza_macierzy"); for (Matrix matrix : mat) { matrix.printToConsole(); Util.print(""); } } }
Po uruchomieniu klasy na konsoli zobaczymy macierz odczytaną z bazy danych:
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
Pliki do ściągnięcia
Moduł matrices – aktualny stan projektu = 030;