[JAVA] Die Geschichte des Werfens von BLOB-Daten von EXCEL in DBUnit

Dies ist der Artikel zum 10. Tag von Java Adventskalender 2016 ¥ -Qiita. Der Artikel am 9. Tag war deaf_tadashis Über JMH, ein Mikro-Benchmark-Tool. Der 11. Tag ist @ leak4mk0.

Über diese Seite

Wenn Sie Testdaten (hauptsächlich Bilder oder PDF) mit DBUnit in BLOB-Spalten einfügen möchten Es gibt einen Mechanismus zum Angeben der Datei in XML.

Dieses Mal möchte ich jedoch vorstellen, wie Testdaten von EXCEL in eine Spalte vom Typ BLOB eingefügt werden.

Wenn Sie DBUnit noch nie verwendet haben, gibt es viele japanische Informationen zur Verwendung. Bitte gehen Sie herum.

Zweck des Schreibens

Ich bin beim Importieren von BLOB-Spaltendaten gestolpert, es handelt sich also um eine Freigabe. Ich denke, es ist eine sehr seltene Situation, Du kannst diesen Weg gehen! Ich würde es begrüßen, wenn Sie das wissen könnten.

Abhängigkeiten

Umgebung

OS : Redhat 6.5 Java : 1.8.20 DB : Oracle 12c

Bibliothek

DBUnit : 2.5.3 OJDBC : 8

Der Anfang davon

In einer Umgebung, in der Unit-Test-Code ohne Gleichheit ausgeführt wird (es gibt Daten in der Datenbank, die Daten können jedoch leicht von Menschenhand geändert werden). Wenn in der Entwicklung der Testcode fehlschlägt, werden Sie aufgefordert, die Ursache zu finden und zu beheben. Dies führt Ikan und CI ein, und für Testcode, der Daten in der Datenbank enthält, kann ich diese nicht mehr reparieren Lassen Sie uns die Daten migrieren, damit sie von DBUnit importiert werden können, damit sie jederzeit aus der IDE wiederhergestellt werden können! Maße.

Wenn Sie die oben genannten Schritte ausführen, können Sie verhindern, dass der Test unterbrochen wird, außer indem Sie die Software ändern. Dies erfordert keinen zusätzlichen Aufwand. Eingeführt durch hartes Drücken auf den Punkt und den Qualitätsnutzen, der durch CI erzielt wird.

Hauptgeschichte

Schreiben Sie die Migrationsdaten in Excel, das für den Datenimport in DBUnit verwendet wird

Dies wurde mit der brutalen Kraft des Kopierens von SQL Developer durchgeführt. Spaltendaten vom Typ BLOB werden kopiert und kopiert, indem eine gespeicherte Funktion ausgelöst wird, die BASE64 mit einer SELECT-Anweisung codiert.

Schreiben Sie die in Excel von EXCEL in DB geschriebenen Testdaten mit DBUnit (Hauptfach)

Das aufgetretene Problem

Wenn Sie DatabaseOperation # ausführen, führen Sie DBUnit aus. ClassCastException tritt am Schreibort der BLOB-Spalte auf und die Verarbeitung schlägt fehl.

Ursache

Auf der OJDBC-Seite einfach "Wenn ich Daten in eine BLOB-Spalte schreiben wollte, würde ich ein BlobObject verwenden. Sie können nicht umwandeln, da die Daten, die Sie eingeben, Bytes sind! "" Es scheint, dass.

Gegenmaßnahmen

Abgesehen vom Lesen verwende ich BlobObject nicht, wenn ich BLOB selbst schreibe, aber ich denke, dass ich es mit Gewalt in Bytes schreiben kann. Ich muss den Datentyp von org.dbunit.dataset.Column in BINARY ändern, also habe ich den folgenden Code erstellt.

Java-Code (Auszug)



    IDataSet databaseDataSet = con.createDataSet();
    ITableMetaData tableMetaData = databaseDataSet.getTableMetaData(tableName);

    //OraclePreparedStatement versucht, ein BLOB-Objekt in eine BLOB-Spalte einzufügen.
    //Ich möchte Byte-Daten festlegen, also konvertiere sie in BINARY
    //Als Einschränkung ITableMetaData#Spalten und IDataSet#ITableMetaData#Mit Spalten
    //Beide müssen aufgrund der doppelten Verwaltung auf BYNARY aktualisiert werden
    ITable table = dataset.getTable(tableName);
    Column[] cols = tableMetaData.getColumns();
    for(int i = 0; i < cols.length; i++){
        //Ersetzen Sie den BLOB-Typ durch BINARY
        if(DataType.BLOB.equals(cols[i].getDataType())){
            Column col = new Column(cols[i].getColumnName(), DataType.BINARY);
            //Da die Elemente der Referenzbeziehung des Arrays frei umgeschrieben werden können, wird dies verwendet, um den Zweck zu erreichen.
            cols[i] = col;
            int idx = table.getTableMetaData().getColumnIndex(cols[i].getColumnName());
            table.getTableMetaData().getColumns()[idx] = col;
        }
    }

    //Datenfluss
    DatabaseOperation.CLEAN_INSERT.execute(con, dataset);

Wie Sie im Kommentar sehen können, wird dies realisiert, indem das Objekt im Referenzzustand zwangsweise neu geschrieben wird.

Sie haben jetzt erfolgreich BLOB-Spaltendaten mit DBUnit in Ihre Datenbank geschrieben. Wenn Sie sich in der gleichen Situation befinden, tun Sie dies bitte!

Extra

Warum war es nicht möglich, Ressourcendateien mit XML zu verknüpfen?

Da die BLOB-Daten eine systemseitig erstellte Java-Instanz waren (keine PDF- oder Bilddatei, sondern der Fortschritt der Geschäftsverarbeitung) Ich habe diesen Ansatz gewählt. Erforschen Sie nicht, warum dies geschieht.

Da es viele Möglichkeiten gibt, Excel einfach wie eine Datenbank zu verwenden, Dies liegt daran, dass Sie bequem lernen können, ob der Entwickler die Daten in Excel definieren kann.

Zusammenfassung

Wenn Sie DBUnit verwenden, um Daten über JDBC in eine BLOB-Spalte zu werfen, Setzen Sie den Datentyp des Spaltenfelds von ITableMetaData und IDataSet # ITableMetaData auf BINARY und es ist OK! Wir haben eine großartige Technik für alle geliefert.

Recommended Posts

Die Geschichte des Werfens von BLOB-Daten von EXCEL in DBUnit
Die Geschichte von RxJava, das unter NoSuchElementException leidet
Die Geschichte des Schreibens von Java in Emacs
Die Geschichte des Erwerbs von Java Silver in zwei Monaten von völlig unerfahrenen.
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
Die Geschichte des einfachen String-Vergleichs in Java
Die Geschichte eines gewöhnlichen Othello in Java
Die Geschichte des Lernens von Java in der ersten Programmierung
Die Geschichte einer illegalen staatlichen Ausnahme in Jetty.
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Importieren Sie Excel-Daten mit Java 2
Importieren Sie Excel-Daten mit Java
Importieren Sie Excel-Daten mit Java 3
Die Geschichte, dass Tomcat in Eclipse unter einem Timeout-Fehler litt
Eine Geschichte, in der Ubuntu aus völliger Unwissenheit in HDD eingelegt und yolov3 ausgeführt wird
[Java Edition] Geschichte der Serialisierung
Die Geschichte von @ViewScoped, die Speicher verschlingt
Filtern Sie die Schwankungen der Rohdaten
Reihenfolge der Verarbeitung im Programm
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Die Geschichte des Wechsels von Amazon RDS für MySQL zu Amazon Aurora Serverless
Bestätigung und Umgestaltung des Flusses von der Anfrage zum Controller in [httpclient]
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
Holen Sie sich das Ergebnis von POST in Java
[Herausforderung CircleCI von 0] Lernen Sie die Grundlagen von CircleCI
Die Identität der Schienenparameter [: id]
Die Geschichte der Aktualisierung des Docker-Containers von Sonar Qube
Rails Refactoring Geschichte vor Ort gelernt
Wie ist die Datenstruktur von ActionText?
Der Inhalt der von CarrierWave gespeicherten Daten.
Finden Sie den Unterschied von einem Vielfachen von 10
Schreiben Sie die Bewegung von Rakefile in das Runbook
Die Geschichte, absichtlich zum ersten Mal in meinem Leben Try Catch zu verwenden
Probieren Sie Designmuster in C-Sprache aus! Erinnerungsmuster - merken wir uns die Speicher der Daten
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle