WEBCODELOG

free codes, enjoy

Tag: ‘mysql’

Manipulando BLOB – MySQL vs. Oracle

without comments

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.

Faça download das classes.

Written by Luciano

novembro 16th, 2009 at 10:55 pm

Posted in Programação

Tagged with , ,

Função InitCap para MySql

without comments

Conhecida em várias linguagens e ambientes o InitCap tem a função de transformar o primeiro caracter de cada palavra em maíusculo e o restante em minúsculo. Infelizmente o MySql não disponibiliza essa funcionalidade nativa, portanto, você terá que criá-la.

Essa é a minha versão do InitCap em Java.

private static final String SEPARADOR[] = {"do","da","de","e","dos","das"};

/**
* @author lsilva
* @param in
* @return
*/
public static String initCap( String in ){
String out    = null;
String[] part = in.split(" ");
StringBuffer temp = new StringBuffer();

for (int i = 0; i<part.length; i++){

if( i>0 ) temp.append(" ");
if( ehSeparador( part[i] ) ){
temp.append( part[i].toLowerCase() );
}else{
temp.append( part[i].substring(0, 1).toUpperCase() );
temp.append( part[i].toLowerCase().substring(1, part[i].length()) );
}
}// for end

out = temp.toString();
return out;
}

/**
* @author lsilva
* @param sep
* @return
*/
private static boolean ehSeparador(String sep){
boolean r = false;
for (int i = 0; i < SEPARADOR.length; i++){

if( sep.equalsIgnoreCase( SEPARADOR[i] ) ){
r = true;
break;
}else{
r = false;
}
}
return r;
}

Depois de algumas discussões e muita zuação, meu amigo Orlando disse: “Muita firula pra pouca coisa, faz assim cara:

/**
* @author oneto
* @param n
* @return
*/
public static String initCap( String n ){
String[] x                      = n.split(" ");
StringBuffer r  = new StringBuffer();
String e                        = " de , da , des , da ";

for (int i = 0;i<x.length;i++){
if(e.indexOf(x[i].trim().toLowerCase())< 0){
r.append(x[i].substring(0,1).toUpperCase() + x[i].substring(1,x[i].length()).toLowerCase() + " " );
}else{
r.append(x[i].toLowerCase() + " ");
}
}
return r.toString().trim();
}

Essa função pode ser feita de diversas outras maneiras, aqui foram apenas sugeridas algumas. Muitas vezes você não precisará criar basta pesquisar sobre a linguagem utilizada, por exemplo, em PHP a função nativa para isto é o ucwords.

That’s all.

Written by Luciano

julho 25th, 2008 at 9:52 pm

Posted in Programação

Tagged with , , ,