Página Inicial do Fórum > [Tutoriais] - Banco de Dados

Manipulando campos BLOB e CLOB com JDBC



Criar novo tópico   Responder tópico


  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Manipulando campos BLOB e CLOB com JDBC

    Por: Giovane Roslindo Kuhn

    Este tutorial apresenta de forma sucinta como manipular campos dos tipos BLOB e CLOB utilizando o driver Oracle JDBC (ojdbc14.jar).

    Em linhas gerais, a prova de conceito possui os seguintes passos:
    1) ler um arquivo texto (grande) e um arquivo binário (imagem);
    2) inserir o conteúdo destes arquivos em um registro no banco de dados utilizando JDBC;
    3) selecionar o registro do banco e ler o conteúdo dos campos BLOB e CLOB utilizando JDBC;
    4) gerar um arquivo binário com o conteúdo do campo BLOB e um arquivo texto com o conteúdo do campo CLOB;
    5) certificar que o conteúdo dos arquivos gerados é idêntico ao conteúdo dos arquivos originais;


    Para o entendimento deste tutorial é necessário algum conhecimento em JDBC e SQL, para isto veja em:
    Acessando banco de dados em Java (PARTE 1)
    Acessando banco de dados em Java (PARTE 2)
    Acessando banco de dados em Java (PARTE 3)

    Let's play !!!


    Preparando o ambiente

    A preparação do ambiente para a prova de conceito tem os seguintes passos:
    1) criação da tabela de testes com os campos BLOB e CLOB, segue definição:

    2) criação do arquivo binário (teste.jpg)
    3) criação do arquivo texto (teste.txt)


    PS: Não é necessário preparar manualmente o ambiente, pois o programa de teste executa os passos descritos acima.


    Inserindo registro

    Para criar um registro, primeiramente deve ser inserido um registro com os campos CLOB e BLOB vazios:


    Depois deve-se selecionar o registro e efetivamente inserir o conteúdo dos campos CLOB e BLOB, para isto o registro é bloqueado com a cláusula "for update":


    Segue o código para atribuir o conteúdo do arquivo binário para o campo BLOB, nota-se que uma linha é específica para o driver Oracle, para outros drivers utilizar a linha comentada:


    Segue o código para atribuir o conteúdo do arquivo texto para o campo CLOB, nota-se que uma linha é específica para o driver Oracle, para outros drivers utilizar a linha comentada:


    Basta comitar a transação e fechar o cursor:



    Selecionando registro

    O próximo objetivo da prova de conceito é selecionar o registro inserido e criar um novo arquivo binário com o campo BLOB e outro para o campo CLOB.
    Primeiro é selecionado o registro, um "select" normal:


    Depois é criado um novo arquivo binário com o conteúdo do campo BLOB:


    Depois é criado um novo arquivo texto com o conteúdo do campo CLOB:


    Para finalizar é fechado o cursor:



    Validando arquivos

    Para validar a prova de conceito é feito uma comparação entre os arquivos originais e os arquivos novos, segue código que verifica se o conteúdo de dois arquivos são iguais:


    Primeiro verifica os arquivos binários:


    E por fim, verifica os arquivos textos:



    Well, done !!!

    Giovane Roslindo Kuhn é bacharel em Ciências da Computação pela Universidade Regional de Blumenau. Atuando profissionalmente no Projeto Jakare da empresa Senior Sistemas, que consiste em um framework para desenvolvimento de aplicações J2EE e é reponsável pelos projetos Baba XP, SnailDB e Apollo. Incentivador do uso de metodologias ágeis de desenvolvimento, especialmente XP e desing patterns.

    _________________





  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Segue fonte completo:


    _________________





  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Agiliza um pouco ae


    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona




  1. bb
    Posts:125


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    ei kuhn, esse tutorial q vc fez... me diz uma coisa...

    vc vai colocar isso no seu curriculum como 'artigos publicados' ????
    pretende fazer mestrado ou algo do tipo?

    abracao
    _________________
    Sun Certified Programmer
    .:. Up The |rons .:.




  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    bb
    ei kuhn, esse tutorial q vc fez... me diz uma coisa...

    vc vai colocar isso no seu curriculum como 'artigos publicados' ????
    pretende fazer mestrado ou algo do tipo?

    abracao



    Opa... na real estes tipos de artigos nem contam para a carreira acadêmica... escrevo estes tipos de artigos para auxiliar a comunidade Java e nada mais =DDD !!!

    Quanto ao mestrado, tem fortes pretensões !!!! Vamos ver se final do ano rola !!!

    Mas pq a curiosidade cara ???

    []'s
    _________________





  1. bb
    Posts:125


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    eh pq meu chefe tah afim de fazer mestrado tb., e tah afim de fazer tipo umas pesquisas pra contar pontos saca., publicar artigos e etc...

    entao eu tava wondering se esse tutorial nao poderia ser na pratica um artigo publicado.,

    soh isso


    _________________
    Sun Certified Programmer
    .:. Up The |rons .:.




  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Eh... acho difícil artigos deste gênero auxiliarem o seu chefe para ingressar num mestrado !!! Mas sem sobra de dúvida auxiliariam e muito a galera Java !!!

    Flow
    _________________





  1. Achilles
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    A pergunta vai parecer meio boba, mas tô me batento aqui. Se o campo CLOB não for um arquivo ou uma imagem, se for simplemente uma string gigantesca, um texto, eu até consigo pegar o campo clob e transformar de volta a string, mas quando servidor é linux essa string vem com caracteres estranhos no lugar da acentução ou cedilha, engraçado que o servidor no windows não acontece isso.
    Vocês podem me dar uma luz?
    _________________
    JavaFree.org




  1. firmao
    Posts:365


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Tenho um campo Blob que gravo um objeto tipo HashMap, mas quando vou tentar recupera-lo da minha base de dados ele volta como um array de bytes, como faço pra converter devolta em um HashMap.

    Agradecido,

    André Valdestilhas
    _________________
    Andre Valdestilhas

    SCJP, SCWCD
    JavaFree.org




  1. gustavogatto
    Posts:26


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Cara deixa eu explicar o que eu quero fazer: eu tenho um site onde tem notícias, como o corpo desta notícia tem o tamanho maior que 4.000 caracteres tive que optar pelo campo CLOB, porém tenho um número grande de jornalistas na qual podem inserir notícias ao mesmo tempo...

    Eu sou iniciante em java e to completamente perdido em relação a isto.

    Eu preciso que os dados do formulário, inclusive a notícia tamanho família, vá para o banco de dados...

    Eu consegui inserir dados neste campo, apenas utilizando um arquivo texto com o conteúdo, mas não posso depender de um arquivo, pois podem haver mais de um jornalista naquele mesmo instante cadastrando uma notícia... E estas não podem se conflitar e nem gerar sobrecarregamento de E/S...

    O que preciso não é nada de outro mundo, mas tô emperrado nisto e não consigo solucionar... please, help-me!
    _________________
    "Não concordo com o que dizes, mas defendo até a morte o direito de o dizeres" Voltaire




  1. gustavogatto
    Posts:26


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44


    _________________
    "Não concordo com o que dizes, mas defendo até a morte o direito de o dizeres" Voltaire




  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    firmao
    Tenho um campo Blob que gravo um objeto tipo HashMap, mas quando vou tentar recupera-lo da minha base de dados ele volta como um array de bytes, como faço pra converter devolta em um HashMap.

    Agradecido,

    André Valdestilhas




    André, recomendo você utilizar a serialização do Java para colocar o HashMap no campo BLOB do banco, para isto utilize a classe ObjectOutputStream, por exemplo:


    Para ler utilize classe ObjectInputStream, por exemplo:


    Eu não testei estes dois códigos, mas qq coisa só berra novamente, flow !

    _________________





  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    gustavogatto
    Cara deixa eu explicar o que eu quero fazer: eu tenho um site onde tem notícias, como o corpo desta notícia tem o tamanho maior que 4.000 caracteres tive que optar pelo campo CLOB, porém tenho um número grande de jornalistas na qual podem inserir notícias ao mesmo tempo...

    Eu sou iniciante em java e to completamente perdido em relação a isto.

    Eu preciso que os dados do formulário, inclusive a notícia tamanho família, vá para o banco de dados...

    Eu consegui inserir dados neste campo, apenas utilizando um arquivo texto com o conteúdo, mas não posso depender de um arquivo, pois podem haver mais de um jornalista naquele mesmo instante cadastrando uma notícia... E estas não podem se conflitar e nem gerar sobrecarregamento de E/S...

    O que preciso não é nada de outro mundo, mas tô emperrado nisto e não consigo solucionar... please, help-me!



    Gustavo,

    Não precisas criar um arquivo e depois ler deste arquivo, podes trabalhar diretamente com String que vem da sua tela de cadastro.

    Para inserir o valor no campo CLOB, no lugar da classe FileReader, utilize a classe StringReader.

    Para ler o valor do campo CLOB para uma String, no lugar da classe FileWriter, utilize a classe StringWriter e depois o método getBuffer().

    Qq coisa berra novamente, flow !!

    _________________





  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Achilles
    A pergunta vai parecer meio boba, mas tô me batento aqui. Se o campo CLOB não for um arquivo ou uma imagem, se for simplemente uma string gigantesca, um texto, eu até consigo pegar o campo clob e transformar de volta a string, mas quando servidor é linux essa string vem com caracteres estranhos no lugar da acentução ou cedilha, engraçado que o servidor no windows não acontece isso.
    Vocês podem me dar uma luz?



    Achilles,

    Este problema normalmente ocorre devido problemas de configuração do "charset" do seu banco de dados. Leia a respeito de "charset" ou "character encoding".

    QQ novidade posta pra gente aí !!!
    _________________





  1. gustavogatto
    Posts:26


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    brain
    Gustavo,

    Não precisas criar um arquivo e depois ler deste arquivo, podes trabalhar diretamente com String que vem da sua tela de cadastro.

    Para inserir o valor no campo CLOB, no lugar da classe FileReader, utilize a classe StringReader.

    Para ler o valor do campo CLOB para uma String, no lugar da classe FileWriter, utilize a classe StringWriter e depois o método getBuffer().

    Qq coisa berra novamente, flow !!



    Opa.. deu certo, mas estou com outro problema...

    ERRO: java.lang.RuntimeException: java.io.IOException: Não serão lidos mais dados do soquete



    Meu post segue no link:

    http://www.javafree.org/javabb/viewtopic.jbb?t=851545
    _________________
    "Não concordo com o que dizes, mas defendo até a morte o direito de o dizeres" Voltaire




  1. marceloplis
    Posts:47


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Pessoal, consegui fazer o Upload gravar no campo Blob, mas to com 2 probleminhas:

    1 - nao está fazendo upload de arquivos maiores que 4kb (mesmo eu tendo alterado no file.setSizeMax(50*1024*1024); caso o arquivo tenha 5kb por exemplo, já não faz upload informando a seguinte exceção "tamanho dos dados maior que o tamanho máximo para este tipo: "tamanho do arquivo"";

    2 - como fazer a recuperação desse arquivo que foi gravado como array de bytes e mostralo no formao original??;

    Alguém tem alguma ideia de como fazer ele aceitar arquivos de qualquer tamanho e recuperar o arquivo no BD?????

    obs:já coloquei (-1) no lugar do 50*1024*1024 e continua a mesma coisa!!

    Valew)
    _________________
    Marcelo César




  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    marceloplis
    Pessoal, consegui fazer o Upload gravar no campo Blob, mas to com 2 probleminhas:

    1 - nao está fazendo upload de arquivos maiores que 4kb (mesmo eu tendo alterado no file.setSizeMax(50*1024*1024); caso o arquivo tenha 5kb por exemplo, já não faz upload informando a seguinte exceção "tamanho dos dados maior que o tamanho máximo para este tipo: "tamanho do arquivo"";

    2 - como fazer a recuperação desse arquivo que foi gravado como array de bytes e mostralo no formao original??;

    Alguém tem alguma ideia de como fazer ele aceitar arquivos de qualquer tamanho e recuperar o arquivo no BD?????

    obs:já coloquei (-1) no lugar do 50*1024*1024 e continua a mesma coisa!!

    Valew)



    Sua dúvida já esta no tópico http://www.javafree.org/javabb/viewtopic.jbb?t=851658

    Flow.
    _________________





  1. racelike
    Posts:13


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Brain, por favor me ajuda ai

    eu estou com o mesmo problema do marceloplis acima, mas já desisti de fazer do jeito simples que estava fazendo. (usando setBytes direto sem inserir primeiro um campo vazio).

    o meu problema de fazer igual ao seu tutorial acima é já na consulta de seleção do registro, onde eu quero selcionar os campos blob.

    a consulta é equivalente a esta sua:

    ResultSet rs = stmt.executeQuery("select cadastro, imagem, texto from teste where cadastro = 1 for update");



    essa consulta retorna null. Já coloquei diretamente a consulta sql usando o sql tools ou o squirrel, e a mensagem que eles dão é ORA-01002: extração fora de seqüência

    voce sabe o que é isso? quando eu tiro o "for update" da consulta, ai nao dá problema.

    outra pergunta, no meu campo blob vai ter só arquivo .doc, .pdf, .rtf. vc recomenda alterar para Clob? se eu conseguir passar por esse erro, vou ter outras perguntas, mas por enquanto fica só nessas

    agradeço qualquer comentario




  1. racelike
    Posts:13


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    eu consegui resolver. o problema era so o autocommit que nao tava setado pra falso. e é isso que bloqueia a consulta, ate vc dar o commit manualmente, depois de mandar o arquivo




  1. luismatos
    Posts:1


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    EhOlá

    Experimentei este método para inserir uma imagem em um blob e apareceu-me o seguinte erro:

    java.lang.NullPointerException
    Este é o código que estou a usar:


    Alguem sabe qual e o problema?

    Obrigado
    Luís Matos




  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Eh

    luismatos
    Olá

    Experimentei este método para inserir uma imagem em um blob e apareceu-me o seguinte erro:

    java.lang.NullPointerException
    Este é o código que estou a usar:


    Alguem sabe qual e o problema?

    Obrigado
    Luís Matos




    Em qual linha que ocorreu o NPE ??? Tem certeza que o existe um registro com imagem no banco ??? Caso não tenha, pode estar retornando nulo o código abaixo:



    Aguardando retorno, flow !
    _________________





  1. rafiusiks
    Posts:2


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Não estou conseguindo dar um getClob no meu RS, ele da um erro... pq será??
    _________________
    "..."




  1. TriTonE
    Posts:1576


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Cola ae o StackTrace ae pra gente ver o erro
    _________________
    Daniel F. Martins




  1. gerfferson
    Posts:3


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Olá...

    Estou precisando ler um arquivo blob do oracle e gravar no disco...

    O arquivo é do tipo "txt".

    Atenciosamente,
    Gerfferson Santos.




  1. brain
    Posts:654


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    gerfferson
    Olá...

    Estou precisando ler um arquivo blob do oracle e gravar no disco...

    O arquivo é do tipo "txt".

    Atenciosamente,
    Gerfferson Santos.




    Ué, o tutorial não te ajudou ??? Leia com atenção pq ele faz exatamente isso, ler um clob do banco e criar um arquivo txt e ler um blob e criar um jpg.

    Flow
    _________________



  1. Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    vc esta referenciando um objeto que esta nulo ou não foi inicializado




  1. rodrigopupo
    Posts:14


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Como utilizo o MySQL, claro que a linha de comando:

    OutputStream bout = ((BLOB) blob).getBinaryOutputStream();

    não será possivel, assim qual a solução para utilizar no MySQL?
    Eu só quero inserir uma imagem no banco e depois acessa-la, ela pode vim em ImageIcon.

    O que posso fazer ?


  1. Comment Arrow

    Publicado em: 22/12/2009 10:12:09

    Gostaria de saber o tamanho em bytes do tipo blob.....alguem poderi me ajudar?

    tipo...um char é 1 byte.....um int são 4 bytes....

    o tipo blob é quanto????




  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 22/12/2009 15:52:23

    Leticia_Nayara
    Gostaria de saber o tamanho em bytes do tipo blob.....alguem poderi me ajudar?

    tipo...um char é 1 byte.....um int são 4 bytes....

    o tipo blob é quanto????


    Oi,

    o BLOB tem o tamanho que voce quiser

    falando sério, o BLOB tem tamanho variável, dependendo do que estiver armazenado nele e da implementação do banco de dados. É semelhante a um String.

    documentação do BLOB no MySQL
    ...A BLOB is a binary large object that can hold a variable amount of data...


    []]
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.


  1. Comment Arrow

    Publicado em: 22/12/2009 10:12:09

    tá.....mas no caso de eu estar armazenando uma imagem jpg nele...qual seria esse tamanho......

    preciso estipular qnt espaço o banco ira ocupar....e estou utiliando um campo do tipo blob.....





  1. lvieira
    Posts:237


    Comment Arrow

    Publicado em: 23/12/2009 03:07:15

    se colocar uma imagem de 1MB ele vai ocupar 1MB...
    se a imagem for de 30kb, vai ocupar 30kb...

    na prática ele deve ocupar uns bytes a mais pra controle interno, mas comparado com o tamanho do arquivo armazenado, dá pra desprezar esse valor...




  1. siberiun
    Posts:1


    Comment Arrow

    Publicado em: 17/12/2010 13:20:13

    brain
    Segue fonte completo:



    Olá brain,

    Não estou conseguindo baixar o arquivo exemplo que você anexou.
    Tem como verificar?

    Grato

    Siberiun




  1. fcuritiba
    Posts:30


    Comment Arrow

    Publicado em: 29/12/2010 09:38:27

    Galera, se em vez de imagens eu preciso armazenar videos, pois sera uma pagina com varios videos pequeno(quadros) e qdo eu clicar vai rodar em tamanho maior...

    Posso usar a mesma logica do exemplo citado?

    valeu




  1. Pacato
    Posts:45


    Comment Arrow

    Publicado em: 14/09/2012 11:44:52

    Pessoal..

    Vocês poderiam me ajudar com meu problema também?

    http://javafree.uol.com.br/viewtopic.jbb?t=887107


  1. Comment Arrow

    Publicado em: 11/03/2013 10:18:38

    Pessoal, usando um map com os campos vindos de um formulário preencho um relatório, salvo em pdf e gravo esse pdf num campo blob na tabela.
    A pergunta é: Tem como recuperar o conteúdo dos campos que eu preenchi o pdf gravado ?
    _________________
    Carlos Lindberg
    Analista de Sistemas na SEFAZ/SE




  1. mmillers
    Posts:205


    Comment Arrow

    Publicado em: 11/03/2013 14:45:46

    bom hein. tava precisando




  1. Relacionados





Novo tópico   Responder tópico     Índice do forum -> [Tutoriais] - Banco de Dados