[JAVA] L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit

Ceci est l'article du 10ème jour du Java Advent Calendar 2016 ¥ -Qiita. L'article du 9ème jour était deaf_tadashi About JMH, a micro-benchmark tool. Le 11ème jour est @ leak4mk0.

À propos de cette page

Lorsque vous souhaitez mettre des données de test (principalement des images ou PDF) dans des colonnes de type BLOB à l'aide de DBUnit Il existe un mécanisme pour spécifier le fichier en XML.

Cependant, cette fois, je voudrais vous présenter comment mettre les données de test d'EXCEL dans une colonne de type BLOB.

Si vous n'avez jamais utilisé DBUnit, il existe de nombreuses informations japonaises sur la façon de l'utiliser. Veuillez faire le tour.

But de l'écriture

Je suis tombé sur l'importation de données de colonne BLOB, c'est donc un partage. Je pense que c'est une situation très rare, Vous pouvez suivre cette voie! J'apprécierais que vous le sachiez.

Dépendances

environnement

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

Bibliothèque

DBUnit : 2.5.3 OJDBC : 8

Le début de ça

Dans un environnement où le code de test unitaire est exécuté sans égalité (il y a des données dans la base de données, mais les données peuvent être facilement modifiées par des mains humaines). Dans le développement où si le code de test devient une erreur, il vous est demandé de trouver la cause et de la corriger. Cela introduit Ikan et CI, et pour le code de test contenant des données dans la base de données, je ne peux plus le réparer, donc Migrons les données pour qu'elles puissent être importées par DBUnit afin qu'elles puissent être restaurées à tout moment depuis l'EDI! Les mesures.

En faisant ce qui précède, vous pouvez éviter que le test ne soit interrompu sauf en modifiant le logiciel, et cela ne demandera pas d'effort supplémentaire, Introduit en poussant fort sur le point et le mérite de la qualité obtenu en faisant CI.

Histoire principale

Ecrire les données de migration dans Excel, qui est utilisé pour l'importation de données dans DBUnit

Cela a été fait en utilisant la force brute de la copie de SQL Developer. Les données de colonne de type BLOB sont copiées et copiées en lançant une fonction stockée qui code BASE64 avec une instruction SELECT.

Ecrire les données de test écrites dans Excel depuis EXCEL vers DB avec DBUnit (sujet principal)

Le problème qui s'est produit

Lorsque vous exécutez DatabaseOperation # execute de DBUnit, ClassCastException se produit à l'emplacement d'écriture de la colonne BLOB et le traitement échoue.

Cause

Côté OJDBC, simplement "Si je voulais écrire des données dans une colonne BLOB, j'utiliserais un BlobObject, Vous ne pouvez pas diffuser car les données que vous versez sont des octets! " Il paraît que.

Contre-mesures

Mis à part la lecture, lorsque j'écris BLOB par moi-même, je n'utilise pas BlobObject, mais je pense que je peux l'écrire en octets par la force. J'ai besoin de changer le DataType de org.dbunit.dataset.Column en BINARY, j'ai donc créé le code suivant.

code java (extrait)



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

    //OraclePreparedStatement tente de mettre un objet BLOB dans une colonne BLOB,
    //Je veux définir des données octets, alors convertissez-les en BINARY
    //En guise de mise en garde, ITableMetaData#colonnes et IDataSet#ITableMetaData#Avec colonnes
    //Les deux doivent être mis à jour vers BYNARY car ils sont gérés en double
    ITable table = dataset.getTable(tableName);
    Column[] cols = tableMetaData.getColumns();
    for(int i = 0; i < cols.length; i++){
        //Remplacez le type BLOB par BINARY
        if(DataType.BLOB.equals(cols[i].getDataType())){
            Column col = new Column(cols[i].getColumnName(), DataType.BINARY);
            //Puisque les éléments de la relation de référence du tableau peuvent être librement réécrits, cela est utilisé pour atteindre l'objectif.
            cols[i] = col;
            int idx = table.getTableMetaData().getColumnIndex(cols[i].getColumnName());
            table.getTableMetaData().getColumns()[idx] = col;
        }
    }

    //Flux de données
    DatabaseOperation.CLEAN_INSERT.execute(con, dataset);

Comme vous pouvez le voir dans le commentaire, il est réalisé en réécrivant de force l'objet dans l'état de référence.

Vous avez maintenant correctement écrit les données de colonne BLOB dans votre base de données à l'aide de DBUnit. Si vous êtes dans la même situation, faites-le!

Supplémentaire

Pourquoi n'a-t-il pas été possible de lier des fichiers de ressources avec XML?

Parce que les données BLOB étaient une instance de Java créée côté système (pas un fichier PDF ou image, mais la progression du traitement métier) J'ai adopté cette approche. Ne cherchez pas pourquoi cela se produit.

De plus, comme il existe de nombreuses possibilités d'utiliser simplement Excel comme une base de données, En effet, il est pratique pour savoir si le développeur peut définir les données dans Excel.

Résumé

Si vous utilisez DBUnit pour lancer des données dans une colonne BLOB via JDBC, Définissez le DataType du champ de colonnes de ITableMetaData et IDataSet # ITableMetaData sur BINARY et c'est OK! Nous avons livré une excellente technique pour tout le monde.

Recommended Posts

L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
L'histoire de RxJava souffrant de NoSuchElementException
L'histoire de l'écriture de Java dans Emacs
L'histoire de l'acquisition de Java Silver en deux mois de totalement inexpérimenté.
[Order method] Définit l'ordre des données dans Rails
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de la fabrication d'un Othello ordinaire à Java
L'histoire de l'apprentissage de Java dans la première programmation
L'histoire d'une exception d'état illégale dans Jetty.
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
Importer des données Excel avec Java 2
Importer des données Excel avec Java
Importer des données Excel avec Java 3
L'histoire que Tomcat a souffert d'une erreur de timeout dans Eclipse
Une histoire de mettre ubuntu dans le disque dur par ignorance complète et de faire yolov3
[Édition Java] Histoire de la sérialisation
L'histoire de @ViewScoped dévore la mémoire
Filtrer les fluctuations des données brutes
Ordre de traitement dans le programme
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
L'histoire du passage d'Amazon RDS pour MySQL à Amazon Aurora Serverless
Confirmation et refactoring du flux de la requête au contrôleur dans [httpclient]
Comment modifier le nombre maximum et maximum de données POST dans Spark
Obtenez le résultat de POST en Java
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
L'identité des paramètres de rails [: id]
L'histoire de la mise à jour du Docker Container de Sonar Qube
Histoire de refactoring de rails apprise sur le terrain
Quelle est la structure des données d'ActionText?
Le contenu des données enregistrées par CarrierWave.
Trouvez la différence à partir d'un multiple de 10
Ecrire le mouvement de Rakefile dans le runbook
L'histoire de l'utilisation intentionnelle de Try catch pour la première fois de ma vie
Essayez les modèles de conception en langage C! Modèle de souvenir - mémorisons les souvenirs des données
Comment créer une combinaison unique de données dans la table intermédiaire des rails