Zielony Smok - logo witryny

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:

Baza danych w systemie plików
Rys. 280. Baza danych w systemie plików

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

matrices030.zip

Moduł matrices – aktualny stan projektu = 030;