Gravar e buscar imagem no banco de dados [RESOLVIDO]

Pessoal,

  • Estou desenvolvendo uma aplicação com Hibernate onde tenho que gravar e buscar imagem no banco de dados.
  • No banco de dados defini um campo FOTO como tipo blob

Estou conseguindo gravar a imagem perfeitamente no banco de banco utilizando este comando
public static void main(String[] args){

[code]	RegistroDao regDao = new RegistroDao();
	Registro reg = new Registro();		
	byte[] foto = null;
	BufferedImage imagem;
	try {		
		//Ler a imagem do caminho especificado
		imagem = ImageIO.read(new File("C:/h.png"));
		//converte a BufferedImage em byte[]
		foto = ((DataBufferByte)((BufferedImage)imagem).getRaster().getDataBuffer()).getData();
	
		reg.setId(2);
		reg.setNome("hvivox");
		reg.setFoto(foto);
		regDao.salvar(reg);	
		
		
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

}[/code]

Porém minha dificuldade é como buscar esta informação do banco de dados e exibir no formato de imagem. Tentei utilizar os comando abaixo porém não tive sucesso.

[code]public void exibirFoto(){
RegistroDao regDao = new RegistroDao();
Registro reg = new Registro();
byte[] foto = null;

	//LENDO E COPIANDO IMAGEM ##############################################
	//BufferedImage imagem;
	 BufferedImage img = null; 
	reg = regDao.findById(4);

try {
img = ImageIO.read(new ByteArrayInputStream(reg.getFoto()));//getFoto() é do tipo byte[]
ImageIO.write(img, “PNG”, new File(“C:/Downloads/h.png”));

	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
}[/code]

Alguém tem uma sugestão melhor para buscar a informação no banco de dados e converter em imagem??? Lembrando que estou recebendo a informação como byte[] minha dificuldade é converter ele em um formato de imagem.

grato.

Também tentei estes comandos

Image image = Toolkit.getDefaultToolkit().createImage(reg.getFoto()); 
lblFoto.setIcon(new ImageIcon(image));

Não é mostrado erro, porém o JFrame não exibe a imagem na tela. O que deve está faltando??

Você leu a documentação do método getData() do DataBufferByte?

Ele é bem claro:

Ou seja, ele retorna apenas o primeiro bank da imagem.

Talvez esse post aqui te ajude:

[quote=ViniGodoy]Você leu a documentação do método getData() do DataBufferByte?

Ele é bem claro:

Ou seja, ele retorna apenas o primeiro bank da imagem.

Talvez esse post aqui te ajude:
http://intelectolivre.blogspot.com/2008/07/exibindo-gravando-e-recuperando-imagens.html[/quote]

Vini, mto obrigado graça a sua ajuda consegui resolver o problema.
A solução foram estas

  • PARA SALVAR OU GRAVAR A IMAGEM NO BANCO UTILIZEI ESTES COMANDOS
//Ler a imagem do caminho especificado
			imagem = ImageIO.read(new File("C:/logo.png"));
			//OBTEM A IMAGEM E TRANSFORMA EM BYTES[]
			ByteArrayOutputStream bytesImg = new ByteArrayOutputStream();
			ImageIO.write((BufferedImage)imagem, "jpg", bytesImg);//seta a imagem para bytesImg
			bytesImg.flush();//limpa a variável
			byte[] byteArray = bytesImg.toByteArray();//Converte ByteArrayOutputStream para byte[] 
			bytesImg.close();//fecha a conversão
			
			reg.setId(7);
			reg.setNome("Leomara");
			reg.setFoto(byteArray);
			regDao.salvar(reg);	
			

PARA BUSCAR E EXIBIR A IMAGEM DO BANCO DE DADOS UTILIZEI ESTES COMANADOS

public void exibirFoto(){
		RegistroDao regDao = new RegistroDao();
		Registro reg = new Registro();		
		byte[] foto = null;
		
		//LENDO E COPIANDO IMAGEM ##############################################
		BufferedImage img = null; 
		reg = regDao.findById(7);
								
		try {
			img = ImageIO.read(new ByteArrayInputStream(reg.getFoto()));
			lblFoto.setIcon(new ImageIcon(img));	
			ImageIO.write(img, "PNG", new File("C:/Downloads/h.png"));
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

LEMBRANDO QUE NO BANCO DECLAREI UMA COLUNA COM BLOB PARA SALVAR A IMAGEM E ESTOU UTILIZANDO HIBERNATE LOGO O MAPEAMENTO DO CAMPO FOTO FICOU ASSIM

	@Lob
	@Column(name = "foto")
	public byte[] getFoto() {
		return this.foto;
	}

:slight_smile:

hvivox, sei que estou abusando mas se puder postar a classe DAO e a entidade, não estou conseguindo fechar e já estou com a cabeça doendo

um abraço

A ENTIDADE QUE ESTOU USABDO FICOU ASSIM:

package entidades;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Persistence;

@Entity
public class Logomarcas implements Serializable {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String nome;

@Lob
@Column(name = "logomarcas")
private byte[] logomarcas;


 public Logomarcas() {
 
}

public byte[] getLogomarcas() {
    return logomarcas;
}

public void setLogomarcas(byte[] logomarcas) {
    this.logomarcas = logomarcas;
}


public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

    public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

 /**
 * Retorna um valor de codigo hash para o objeto.  Esta implementcao computa
 * um valor de c�digo hash baseado nos campos id deste objeto.
 * @return um valor de c�digo hash para este objeto.
 */
@Override
public int hashCode() {
    int hash = 0;
    hash += (this.id != null ? this.id.hashCode() : 0);
    return hash;
}


@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Logomarcas)) {
        return false;
    }
    Logomarcas other = (Logomarcas)object;
    if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
    return true;
}


/**
 * Retorna uma representa��o literal deste objeto.  Esta implementa��o cria
 * uma representa��o baseada nos campos id.
 * @return uma representa��o literal deste objeto.
 */
@Override
public String toString() {
   return "javaapplication9.Imagem[id=" + id + "]";
  //         return logomarcas;
           //return nome;
}

public void persist(Object object) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("GerenciamentoAmbulatorial");
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    try {
        em.persist(object);
        em.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        em.getTransaction().rollback();
    } finally {
        em.close();
    }
}

}

E A DAO
package dao;

import entidades.Logomarcas;
import java.util.List;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import util.Banco;

public class LogomarcasDAO {
//Cria um novo objeto de entidade.
EntityManager em;
//Cria um objeto para fazer as consultas.
Query q;
//Construtor da classe que já instacia os objetos para acesso ao banco.
public LogomarcasDAO() {
//Objeto de entidade recebe um objeto de entidade real do banco, através da classe Banco.
em = Banco.getInsatance().getEntityManager();
//Cria um objeto para manipular as consultas no banco.
q=em.createQuery(“FROM Logomarcas cid order by log.nome”);
}
//Método que faz consulta ao banco de dados através do ID passado como parâmetro.
public Logomarcas get(Long id){
em.clear();
em.getTransaction().begin();
Logomarcas log =em.find(Logomarcas.class,id);
em.getTransaction().commit();
return log;

}
//Cria uma consulta de Logomarcas , e retorna em uma lista de Logomarcas .
public List<Logomarcas> select(){
    em.clear();
    em.getTransaction().begin();
    
    List lista=em.createQuery("FROM Logomarcas cid order by log.nome").getResultList();
    
    em.getTransaction().commit();
    return lista;
}
//Busca de Logomarcas , passando uma lista de Logomarcas , e um filtro passado como parâmetro. 
public List<Logomarcas> select(String filtro){
    em.clear();
    em.getTransaction().begin();
    
    String hsql;
    hsql = "FROM Logomarcas log";
    hsql += "Where ";
    hsql += "log.nome like :filtro ";
        
    Query query = em.createQuery(hsql);
    query.setParameter("filtro", filtro + "%");
    
    List lista=query.getResultList();
    
    em.getTransaction().commit();
    return lista;
}
//Método para salvar a Logomarcas . Passa Logomarcas como parâmetro.
public void saveOrUpdate(Logomarcas log){
    em.clear();
    em.getTransaction().begin();
    em.merge(log);
    em.getTransaction().commit();
}
//Método para deletar a Logomarcas . Passa Logomarcas como parâmetro.
public void delete(Logomarcas log){
    em.clear();
    em.getTransaction().begin();
    log= em.find(Logomarcas.class,log.getId());
    if (cid!=null){
        em.remove(log);
    }
    em.getTransaction().commit();
}    

}

Ah já estava esquecendo a tabela logomarca está ligada a tabela empresa

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Empresa implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@ManyToOne
private Logomarcas logomarcas;

public Empresa() {
}

public void setLogomarcas(byte[] logomarcas) {
    this.logomarcas.setLogomarcas(logomarcas);
}

public byte[] getLogomarcas() {
    return logomarcas.getLogomarcas();
}


o netbeans não acusa erro mas o banco (postgres) não aceita o dado
empresas.setLogomarcas(byteArray);

Posso ajudar sim posta o erro aqui que te ajudo.

[quote=hvivox][quote=ViniGodoy]Você leu a documentação do método getData() do DataBufferByte?

Ele é bem claro:

Ou seja, ele retorna apenas o primeiro bank da imagem.

Talvez esse post aqui te ajude:
http://intelectolivre.blogspot.com/2008/07/exibindo-gravando-e-recuperando-imagens.html[/quote]

Vini, mto obrigado graça a sua ajuda consegui resolver o problema.
A solução foram estas

  • PARA SALVAR OU GRAVAR A IMAGEM NO BANCO UTILIZEI ESTES COMANDOS
//Ler a imagem do caminho especificado
			imagem = ImageIO.read(new File("C:/logo.png"));
			//OBTEM A IMAGEM E TRANSFORMA EM BYTES[]
			ByteArrayOutputStream bytesImg = new ByteArrayOutputStream();
			ImageIO.write((BufferedImage)imagem, "jpg", bytesImg);//seta a imagem para bytesImg
			bytesImg.flush();//limpa a variável
			byte[] byteArray = bytesImg.toByteArray();//Converte ByteArrayOutputStream para byte[] 
			bytesImg.close();//fecha a conversão
			
			reg.setId(7);
			reg.setNome("Leomara");
			reg.setFoto(byteArray);
			regDao.salvar(reg);	
			

PARA BUSCAR E EXIBIR A IMAGEM DO BANCO DE DADOS UTILIZEI ESTES COMANADOS

public void exibirFoto(){
		RegistroDao regDao = new RegistroDao();
		Registro reg = new Registro();		
		byte[] foto = null;
		
		//LENDO E COPIANDO IMAGEM ##############################################
		BufferedImage img = null; 
		reg = regDao.findById(7);
								
		try {
			img = ImageIO.read(new ByteArrayInputStream(reg.getFoto()));
			lblFoto.setIcon(new ImageIcon(img));	
			ImageIO.write(img, "PNG", new File("C:/Downloads/h.png"));
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

LEMBRANDO QUE NO BANCO DECLAREI UMA COLUNA COM BLOB PARA SALVAR A IMAGEM E ESTOU UTILIZANDO HIBERNATE LOGO O MAPEAMENTO DO CAMPO FOTO FICOU ASSIM

	@Lob
	@Column(name = "foto")
	public byte[] getFoto() {
		return this.foto;
	}

[/quote]

Nó cara Muito obrigado a vc e a vini, consegui fazer.