Manipulando BLOB – MySQL vs. Oracle
A missão de um programador em manipular arquivos e armazená-los no banco de dados já não é uma tarefa desafiadora a tempos, visto que é extremamente fácil encontrar exemplos internet a fora, aqui vou fazer mais um, em que o foco é demonstrar a diferença de se realizar o mesmo procedimento utilizando o MySQL e Oracle.
1. Oracle
Primeiramente vamos fazer o processo para gravar um arquivo qualquer no banco de dados.
Criação da tabela que será utilizada para armazenar os arquivos.
CREATE TABLE ARQUIVOS( ID NUMBER(4) NOT NULL, TIPO VARCHAR2(20) NULL, ARQ BLOB DEFAULT EMPTY_BLOB() NOT NULL, CONSTRAINT PKARQ PRIMARY KEY(ID) )
Perceba que o campo ARQ que irá guardar o binário, tem como valor default a propriedade EMPTY_BLOB() – Retorna um LOB vazio, para ser usado como um indicador para INSERT ou UPDATE.
No geral, o processo para inserir um campo LOB (BLOB ou CLOB) no Oracle é um pouco burocrático, feito em duas etapas. Primeiro deve-se inserir o registro setando o campo BLOB como EMPTY_BLOB, no em seguida finalizamos com um SELECT FOR UPDATE no campo “LOB” especifico para que o byte[] seja gravado.
// Inserindo o empty_blob // String sql = "INSERT INTO arquivos(id, tipo, arq) VALUES(1, ?, EMPTY_BLOB())"; conn = ConnOracle.getInstance().getConn(); pstmt1 = conn.prepareStatement(sql); pstmt1.setString(1, "TEXT"); pstmt1.execute();
Este passo irá fazer com que um arquivo seja armazenado no banco.
// Faz o select como for update
// Inserir o binário
//
String ins = "SELECT arq FROM arquivos WHERE id = 1 FOR UPDATE";
pstmt2 = conn.prepareStatement(ins);
rset = pstmt2.executeQuery(ins);
while( rset.next() ){
Blob blob = rset.getBlob(1);
// filePath eh a String com o caminho do arquivo a ser gravado
File file = new File( filePath );
byte[] bbuf = new byte[1024];
InputStream bin = new FileInputStream( file );
// Realiza o cast especifico para o driver Oracle
OutputStream bout = ((BLOB) blob).getBinaryOutputStream();
int bytesRead = 0;
while( (bytesRead = bin.read(bbuf))!=-1 ){
bout.write(bbuf, 0, bytesRead);
}//
if( bout!=null ) bout.close();
}// end while
conn.commit();
2. MySQL
A estrutura da tabela muda pouco, o mais importante é que o campo para armazenar o arquivo é do tipo LONGBLOB, veja:
CREATE TABLE ARQUIVOS( ID INT(4) NOT NULL, TIPO VARCHAR(20) NULL, ARQ LONGBLOB NOT NULL, PRIMARY KEY(ID) );
Gravar um campo LONGBLOB no MySQL, é tão fácil quando gravar um int ou uma String, e eu não estou falando no sentido figurado.
File file = new File( filePath ); byte[] bytes = getBytesFromFile( file );</pre> // Inserindo o longblob // String sql = "INSERT INTO arquivos(id, tipo, arq) VALUES(1, ?, ?)"; conn = ConnMysql.getInstance().getConn(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, "TEXT"); pstmt.setBytes(2, bytes); pstmt.execute();
O método getBytesFromFile() é uma função genérica para converter o File em byte[], e somente este último é necessário para gravar, fácil assim.
Não posso deixar de indicar este artigo completo e bem detalhado, escrito por Giovane Kuhn do JavaFree.
Espero que estes simples códigos sejam proveitosos, abaixo estão as duas classes utilizadas para este post.








