lunedì 25 luglio 2011

Leggere e scrivere campi Blob usando Java e JDBC


Nell’esempio vediamo come scrivere un programma java che si occupa di scrivere dati in formato blob su una tabella e poi successivamente leggere il file scritto e salvarlo sul proprio file system.
Come Db Server ho utilizzato MySql 5.5.
La tabella target ha la seguente struttura:

CREATE TABLE  `actionbazaar`.`testblob` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nomeFile` varchar(45) NOT NULL,
  `contenuto` longblob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;


Il campo “nomeFile” indica il nome con cui è identificato il nostro file, mentre il campo contenuto è di tipo LONGBLOB.
Mysql ha 4 tipi di dato per gestire i campi blob:

  • TinyBlob (256 bytes)
  • Blob (64 kb)
  • MediumBlob (16MB)
  • LongBlob (4GB)

Il progetto Java si connette al db utilizzando JDBC  e il driver di connessione mysql-connector 5.1.10 (è un jar da aggiungere al classpath del progetto).

Scrivere Blob su Db

Per scrivere il file su Db utilizziamo la proprietà del PreparedStatement setBinaryStream, che si occupa di inviare direttamente un inputStream come parametro.

Il codice completo del metodo di inserimento è il seguente:


/**
        * Codice per l'inserimento BLOB su Tabella
        * @param conn - la connessione
        * @param nomeFile- la Stringa con cui identifichiamo il file sul db (campo nomeFile)
        * @param file - il file del nostro filesystem che vogliamo portare su Db
        * @throws Exception
        */
       private void inserisciBlob(Connection conn,String nomeFile,File file) throws Exception{
             BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
             String sql="insert into actionbazaar.testblob(nomeFile,contenuto) values (?,?)";
             PreparedStatement pst=conn.prepareStatement(sql);
             pst.setString(1, nomeFile);
             pst.setBinaryStream(2, bis);
             pst.executeUpdate();
             pst.close();
       }


Leggere Blob da Db

Per leggere il file da db utilizziamo invece la proprietà getBinaryStream che ci torna un InputStream che poi leggiamo e scriviamo sul nostro File.



       /**
        * Metodo che recupera il file da db e lo salva su filesystem
        * @param conn - la connessione
        * @param discrimen - il campo nomeFile su tabella che identifica il nostro blob
        * @param file - il file di output che scriveremo sul nostro File System
        * @throws Exception
        */
       private void leggiBlob(Connection conn,String discrimen,File file) throws Exception{
             String sql="select contenuto from actionbazaar.testblob where nomeFile=?";
             PreparedStatement pst=conn.prepareStatement(sql);
             BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
            
             pst.setString(1, discrimen);
             ResultSet rs=pst.executeQuery();
             while(rs.next()){
                    InputStream is= rs.getBinaryStream("contenuto");
                    byte[] buffer = new byte[256];
                    while (is.read(buffer) > 0) {
                     bos.write(buffer);
                    }
             }
             bos.close();
       }




Il metodo main del nostro programma sarà quindi il seguente:



public static void main(String[] args) {
             Connection conn=null;
             ReadWriteBlobFields rbf=new ReadWriteBlobFields();
             try
             {
                    Class.forName(DRIVER);
                    conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);
                    System.out.println("Connessione effettuata....");
                    rbf.inserisciBlob(conn, "linux", new File("c:/temp/com_linux.pdf"));
                    File fOut=new File("out/linux.pdf");
                    rbf.leggiBlob(conn, "linux", fOut);
                    conn.close();
                    System.out.println("Procedura terminata correttamente");
             }
             catch(Exception ex){
                    ex.printStackTrace();
                    try {
                           conn.close();
                    } catch (SQLException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                    }
             }

       }







Nessun commento:

Posta un commento