12
votes

Comment manipuler un blob en Java?

J'ai une procédure de base de données qui retourne une blob. Quelqu'un peut-il me dire comment manipuler le blob? Y a-t-il une API spécifique pour cela?


1 commentaires

Telle que l'API pour Java.SQL.Blob?


4 Réponses :


16
votes

existe une API spécifique pour cela?

Bien sûr, l'API JDBC.

  • Trail: Accès à la base de données JDBC ™

    Vous obtenez la maintien de l'instance blob tout comme vous obtenez une valeur de n'importe quelle valeur d'un ensemble de résultats. Vous devez ensuite utiliser le get ... - et définir ... Méthodes sur ce blob .

    Ici, vous avez essentiellement deux options:

    • Travail avec un octet-tableau:

      1. Obtenez la maintien d'un octet [] contenant les données via blob.getBytes
      2. manipuler cet octet-tableau
      3. Réglez-le en utilisant blob.setbytes .


      4. Travail avec INPUTStream / de sortie :

        1. Get Tenir un INPUTStream via blob.getbilarystream
        2. manipuler ce flux comme vous voyez FIT
        3. Utilisez Blob.setbarystream .

          Une approche alternative consiste à ignorer la messagerie avec blob en premier lieu et utilisez plutôt la deuxième approche (avec des flux) directement via le "code> résultatsset -Interface.


3 commentaires

Mon expérience est que résultatset.getbarydream () est plus robuste que de travailler avec des instances de blob


@aioobe: Merci pour les réponses. Mais quelqu'un peut-il me dire comment "RestaurantsTbaraystream ()" est robuste par rapport à "blob.getbaraystream"?


Si votre pilote prend en charge RestructsetSet.getBlob et BLOB.GETBARYARYSREAM , et que vous êtes assez confiant que vous ne passerez pas à une autre base de données, allez simplement avec celui que vous trouverez le plus lisible.



2
votes

Avec une API simple Java JDBC, vous pouvez obtenir un java.sql.blob retour d'un résultatsset .

  1. résultatset.getBlob (index) ou
  2. résultatset.getBlob (Nom de colonne de chaîne) .

    Les deux renvoient un blob .

    Une fois que vous avez obtenu un blob , vous pouvez obtenir le byte [] retour du blob.getbytes () méthode ou défini en utilisant < Un href = "http://download.oracle.com/javase/6/docs/api/java/sql/blob.html#setbytes%28LONG ,%20BYte%5B%5D%29" rel = "nofollow"> < code> setbytes () méthode.

    Mise à jour: voir que certains fournisseurs de pilotes de base de données ne prennent pas en charge blob , vous pouvez utiliser Resultset.getBinaryStream () .


3 commentaires

Pourquoi inutile? L'existence d'un type de données BLOB dans la base de données n'a rien à voir avec le support du conducteur. Tous les conducteurs Support RESEILLET.GETBLEBLOB () Seulement support Resultset.getInputStream ()


@Tall: Merci les gars pour les réponses. Si GetBlob () n'est pas pris en charge par tout alors quelle méthode est bonne à utiliser? Blob.getbaraystream ()?


Je fais habituellement résultatset.getBytes () et fonctionne avec octet [] .



5
votes

Cela dépend de quel type de blob contient (image, vidéo) et son extension. J'ai écrit un programme simple pour récupérer une image de DB et le montrer dans la page JSP. J'espère que cela aide.

pages JSP xxx

page de servlet xxx

procédure d'appel xxx


0 commentaires

0
votes

Vous pouvez utiliser Javax. sql.rowset.serial.serialblob .

Je l'utilise dans mon application Springboot & Angular4 comme ceci:

  • Obtenez base64String de l'application Angular4
  • décodage base64string à octet []
  • Créer SerialBlob comme ceci: SerialBlob Serialblob = Nouveau SerialBlob (octet [])
  • stockez-le dans la base de données avec JPeePository

0 commentaires