Требования
Для этого проекта 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 Лоян Гронер в блоге блога




