要求
对于此示例项目,我们将使用:
- 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 ):
Github : https : //github.com/loiane/hibernate-image-example
BitBucket : https : //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