
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;
