Статьи

Загрузить или сохранить изображение с помощью Hibernate — MySQL

Из этого туториала вы узнаете, как сохранить и загрузить изображение из базы данных ( MySQL ) с помощью Hibernate .

Требования

Для этого проекта sampel мы будем использовать:

  • Eclipse IDE (вы можете использовать свою любимую IDE);
  • MySQL (вы можете использовать любую другую базу данных, при необходимости не забудьте изменить тип столбца);
  • Банки и зависимости Hibernate (вы можете скачать пример проекта со всеми необходимыми банками);
  • JUnit — для тестирования (jar также включен в пример проекта).

Снимок экрана

Когда мы закончим реализацию этого примера проекта, он должен выглядеть следующим образом:

Модель базы данных

Прежде чем мы начнем с примера проекта, мы должны запустить этот сценарий SQL в MySQL :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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 в этом проекте. Книга имеет идентификатор , имя и изображение , которые представлены массивом байтов .

Поскольку мы собираемся сохранить изображение в базе данных, мы должны использовать тип BLOB . В MySQL есть несколько вариантов BLOB , разницу между которыми можно посмотреть здесь . В этом примере мы собираемся использовать Medium Blob , который может хранить L + 3 байта, где L <2 ^ 24 .

Убедитесь, что вы не забыли добавить определение столбца в аннотацию столбца .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
 }
}

Hibernate Config

Этот файл конфигурации содержит необходимую информацию, используемую для подключения к базе данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
<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>

Hibernate Util

Класс HibernateUtil помогает в создании SessionFactory из файла конфигурации Hibernate.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
 }
}

DAO

В этом классе мы создали два метода: один для сохранения экземпляра Book в базу данных, а другой для загрузки экземпляра Book из базы данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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. Для этого нам нужно загрузить изображение с жесткого диска, и мы собираемся использовать тот, который находится в папке с изображениями. Затем мы можем вызвать класс DAO и сохранить в базу данных.

Тогда мы можем попытаться загрузить изображение. Просто чтобы убедиться, что это то же самое изображение, которое мы загрузили, мы собираемся сохранить его на жестком диске.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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 ) из:

Github : https://github.com/loiane/hibernate-image-example

BitBucket : https://bitbucket.org/loiane/hibernate-image-example/downloads

Удачного кодирования!

Ссылка: Как загрузить или сохранить изображение с помощью Hibernate — MySQL от нашего партнера по JCG Лоян Гронер в блоге блога