使用Hibernate加载或保存图像-MySQL

本教程将引导您逐步了解如何使用Hibernate从数据库( MySQL )保存和加载图像。

要求

对于此示例项目,我们将使用:

  • Eclipse IDE (您可以使用自己喜欢的IDE);
  • MySQL (您可以使用任何其他数据库,请确保在需要时更改列类型);
  • Hibernate jar和依赖关系(您可以下载带有所有必需jar的示例项目);
  • JUnit –用于测试(示例项目中还包括jar)。

打印屏幕

当我们完成该示例项目的实现时,它应如下所示:

数据库模型

在开始使用示例项目之前,我们必须将此sql脚本运行到MySQL中

DROP SCHEMA IF EXISTS `blog` ;
CREATE SCHEMA IF NOT EXISTS `blog` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `blog` ;

-- -----------------------------------------------------
-- Table `blog`.`BOOK`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `blog`.`BOOK` ;

CREATE  TABLE IF NOT EXISTS `blog`.`BOOK` (
  `BOOK_ID` INT NOT NULL AUTO_INCREMENT ,
  `BOOK_NAME` VARCHAR(45) NOT NULL ,
  `BOOK_IMAGE` MEDIUMBLOB NOT NULL ,
  PRIMARY KEY (`BOOK_ID`) )
ENGINE = InnoDB;

该脚本将创建一个表BOOK ,我们将在本教程中使用该表。

预订POJO

我们将在这个项目中使用一个简单的POJO 。 一本书有一个ID ,一个名称和一个图像 ,该图像字节数组表示

当我们要将图像持久化到数据库中时,我们必须使用BLOB类型。 MySQL有一些BLOB的变体,您可以在这里检查它们之间的区别。 在此示例中,我们将使用Medium Blob ,它可以存储L + 3个字节,其中L <2 ^ 24

确保不要忘记在“ 列”注释上添加列定义

package com.loiane.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;

@Entity
@Table(name="BOOK")
public class Book {

 @Id
 @GeneratedValue
 @Column(name="BOOK_ID")
 private long id;

 @Column(name="BOOK_NAME", nullable=false)
 private String name;

 @Lob
 @Column(name="BOOK_IMAGE", nullable=false, columnDefinition="mediumblob")
 private byte[] image;

 public long getId() {
  return id;
 }

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

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public byte[] getImage() {
  return image;
 }

 public void setImage(byte[] image) {
  this.image = image;
 }
}

休眠配置

此配置文件包含用于连接数据库的必需信息。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/blog</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     <property name="connection.pool_size">1</property>
     <property name="show_sql">true</property>
    </session-factory>
</hibernate-configuration>

休眠实用程序

HibernateUtil类有助于从Hibernate配置文件创建SessionFactory

package com.loiane.hibernate;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import com.loiane.model.Book;

public class HibernateUtil {

 private static final SessionFactory sessionFactory;

 static {
  try {
   sessionFactory = new AnnotationConfiguration()
        .configure()
        .addPackage("com.loiane.model") //the fully qualified package name
        .addAnnotatedClass(Book.class)
        .buildSessionFactory();

  } catch (Throwable ex) {
   System.err.println("Initial SessionFactory creation failed." + ex);
   throw new ExceptionInInitializerError(ex);
  }
 }

 public static SessionFactory getSessionFactory() {
  return sessionFactory;
 }
}

在此类中,我们创建了两种方法:一种将Book实例保存到数据库中,另一种从数据库中加载Book实例。

package com.loiane.dao;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.loiane.hibernate.HibernateUtil;
import com.loiane.model.Book;

public class BookDAOImpl {

 /**
  * Inserts a row in the BOOK table.
  * Do not need to pass the id, it will be generated.
  * @param book
  * @return an instance of the object Book
  */
 public Book saveBook(Book book)
 {
  Session session = HibernateUtil.getSessionFactory().openSession();
  Transaction transaction = null;
  try {
   transaction = session.beginTransaction();
   session.save(book);
   transaction.commit();
  } catch (HibernateException e) {
   transaction.rollback();
   e.printStackTrace();
  } finally {
   session.close();
  }
  return book;
 }

 /**
  * Delete a book from database
  * @param bookId id of the book to be retrieved
  */
 public Book getBook(Long bookId)
 {
  Session session = HibernateUtil.getSessionFactory().openSession();
  try {
   Book book = (Book) session.get(Book.class, bookId);
   return book;
  } catch (HibernateException e) {
   e.printStackTrace();
  } finally {
   session.close();
  }
  return null;
 }
}

测试

要对其进行测试,首先我们需要创建一个Book实例,并将图像设置为image属性。 为此,我们需要从硬盘驱动器中加载一幅图像,然后将使用位于images文件夹中的图像。 然后我们可以调用DAO类并保存到数据库中。

然后,我们可以尝试加载图像。 为了确保它与我们加载的图像相同,我们将其保存在硬盘中。

package com.loiane.test;

import static org.junit.Assert.assertNotNull;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.loiane.dao.BookDAOImpl;
import com.loiane.model.Book;

public class TestBookDAO {

 private static BookDAOImpl bookDAO;

 @BeforeClass
 public static  void runBeforeClass() {
  bookDAO = new BookDAOImpl();
 }

 @AfterClass
 public static void runAfterClass() {
  bookDAO = null;
 }

 /**
  * Test method for {@link com.loiane.dao.BookDAOImpl#saveBook()}.
  */
 @Test
 public void testSaveBook() {

  //File file = new File("images\\extjsfirstlook.jpg"); //windows
  File file = new File("images/extjsfirstlook.jpg");
        byte[] bFile = new byte[(int) file.length()];

        try {
         FileInputStream fileInputStream = new FileInputStream(file);
         fileInputStream.read(bFile);
         fileInputStream.close();
        } catch (Exception e) {
         e.printStackTrace();
        }

        Book book = new Book();
        book.setName("Ext JS 4 First Look");
        book.setImage(bFile);

        bookDAO.saveBook(book);

        assertNotNull(book.getId());
 }

 /**
  * Test method for {@link com.loiane.dao.BookDAOImpl#getBook()}.
  */
 @Test
 public void testGetBook() {

  Book book = bookDAO.getBook((long) 1);

  assertNotNull(book);

  try{
         //FileOutputStream fos = new FileOutputStream("images\\output.jpg");  //windows
         FileOutputStream fos = new FileOutputStream("images/output.jpg");
            fos.write(book.getImage());
            fos.close();
        }catch(Exception e){
         e.printStackTrace();
        }
 }
}

要验证它是否确实保存,让我们检查表Book

如果我们右键单击...

并选择查看我们刚刚保存的图像,我们将看到它:

源代码下载

您可以从以下位置下载完整的源代码(或分叉/克隆项目– git ):

Githubhttps//github.com/loiane/hibernate-image-example

BitBuckethttps : //bitbucket.org/loiane/hibernate-image-example/downloads

编码愉快!

参考: 如何使用Hibernate加载或保存图像–来自Loiane Groner博客博客的JCG合作伙伴 Loiane Groner


翻译自: https://www.javacodegeeks.com/2012/05/load-or-save-image-using-hibernate.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值