本教程将引导您逐步了解如何使用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;@BeforeClasspublic static  void runBeforeClass() {bookDAO = new BookDAOImpl();}@AfterClasspublic static void runAfterClass() {bookDAO = null;}/*** Test method for {@link com.loiane.dao.BookDAOImpl#saveBook()}.*/@Testpublic void testSaveBook() {//File file = new File("images\\extjsfirstlook.jpg"); //windowsFile 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()}.*/@Testpublic void testGetBook() {Book book = bookDAO.getBook((long) 1);assertNotNull(book);try{//FileOutputStream fos = new FileOutputStream("images\\output.jpg");  //windowsFileOutputStream 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

使用Hibernate加载或保存图像-MySQL相关推荐

  1. Euresys eVision 加载和保存图像

    Euresys eVision  EImageBW8类的Load方法加载上来的图像像素值是按照列存储的,而自己创建EImgBW8类的Save方法保存图像时要求像素值是按照行顺序存储的.正确的加载和保存 ...

  2. c++版本opencv(02-第一个OpenCV程序 03.图像加载与保存)

    c++版本opencv(02-第一个OpenCV程序) 一.02-第一个OpenCV程序 二,03.图像加载与保存 来自网易云课堂 一.02-第一个OpenCV程序 如果加载到了之后呢,我们就要对它进 ...

  3. 在Flutter中更快地加载您的图像资源

    本文主要介绍在Flutter中更快地加载您的图像资源 我们可以将图像放在我们的资产文件夹中,但如何更快地加载它们?这是 Flutter 中的一个秘密函数,可以帮助我们做到这一点 - precacheI ...

  4. ROS之rviz文件的加载和保存

    最近将ORB-SLAM3中的pangolin可视化功能给搞掉了,换成了基于rviz的可视化显示,摆脱程度对pangolin库的依赖,为了方便每次在启动时程序自动打开rviz可视化界面,需要在第一次运行 ...

  5. LEADTOOLS如何加载,保存和拆分注释

    LEADTOOLS Recognition Imaging SDK是精选的LEADTOOLS SDK功能集,旨在在企业级文档自动化解决方案中构建端到端文档成像应用程序,这些解决方案需要OCR,MICR ...

  6. imgaug数据增强神器:第一章 加载和增强图像

    官网:https://imgaug.readthedocs.io/en/latest/ 教程:https://nbviewer.jupyter.org/github/aleju/imgaug-doc/ ...

  7. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  8. Android_WebView加载网页保存信息到Cookie

    WebView加载网页保存信息到Cookie     一.知识点     1.WebView加载INTERNET网页        2.Android Activity和网页jsp之间传递参数     ...

  9. Qt Load and Save PCL/PLY 加载和保存点云

    Qt可以跟VTK和PCL等其他库联合使用,十分强大,下面的代码展示了如何使用Qt联合PCL库来加载和保存PCL/PLY格式的点云: 通过按钮加载点云: void QMainWindow::on_pb_ ...

最新文章

  1. 代码整理工具_程序员软件:程序员有哪些常用又好用的编码小工具?
  2. Nginx+Keepalived+Tomcat之动静分离的web集群
  3. 15行代码让苹果设备崩溃,最新的iOS 12也无法幸免
  4. Nacos 2.0 升级前后性能对比压测
  5. MyBatis 实际使用案例-一级标签
  6. wamp php不可用_解析wamp的php.ini设置不生效
  7. IOS开发自定义tableviewcell的注意点
  8. 利用gitee搭建pdf在线阅读功能
  9. Linux系统怎么安装谷歌拼音,linux下安装google拼音输入法
  10. 邮箱发大文件服务器怎么删除,Exchange 2010如何删除系统默认邮箱数据库
  11. 高速光通信-调制概述
  12. 【我的OpenGL学习进阶之旅】什么是PVR文件以及如何打开它?
  13. 关于UVC PTZ功能
  14. 电子邮箱是什么?注册邮箱163、tom、qq等品牌有什么好处?
  15. lisp如何批量选中特定图层_cad怎么选中整个图层(cad 怎样快速选中后锁定所有图层 只显示一个图层)...
  16. vim在文件尾部插入内容
  17. XSS(Reflected)
  18. 计算机上的时钟发生装置教程,计算机的时钟发生装置叫做什么?
  19. 中国制造业的库存优化
  20. 两个曲柄滑块机构组成简单机械系统

热门文章

  1. JSON与JS对象的区别
  2. leetcode初级算法6.字符串转整数(atoi)
  3. jdk 9和jdk8_JDK 9是某些功能的终结
  4. jdk170不支持注释_JDK 9 @不建议使用的注释增强功能
  5. gradle java_Java EE,Gradle和集成测试
  6. java字符连接字符串数组_Java中连接字符串的最佳方法
  7. java8升级java12_为什么现在是升级到Java 8的最佳时机
  8. jdk 1.8 jdk8_JDK 8功能的可疑方面
  9. 使用Spring Boot构建REST Web服务
  10. Java中的AES加密和解密(CBC模式)