使用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;@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb回顾第四篇Servlet异常处理

前言&#xff1a;很多网站为了给用户很好的用户体验性&#xff0c;都会提供比较友好的异常界面&#xff0c;现在我们在来回顾一下Servlet中如何进行异常处理的。 1&#xff1a;声明式异常处理 什么是声明式&#xff1a;就是在web.xml中声明对各种异常的处理方法。 是通过<er…

java开发cs教程,日常运维(一)

w命令&#xff1a;用于查看系统负载、显示已经登陆系统的用户列表&#xff0c;并显示用户正在执行的指令等信息第一行从左面开始显示的信息依次为&#xff1a;时间&#xff0c;系统运行时间&#xff0c;登录用户数&#xff0c;平均负载。第二行开始以及下面所有的行&#xff0c…

coursera 《现代操作系统》 -- 第五周 同步机制(1)

临界区块&#xff08;Critical section&#xff09;指的是一个访问共用资源&#xff08;例如&#xff1a;共用设备或是共用存储器&#xff09;的程序片段&#xff0c;而这些共用资源有无法同时被多个线程访问的特性。&#xff08;不是字面意思的一个区域&#xff0c;是程序片段…

java.lang.NoClassDefFoundError:如何解决–第2部分

本文是我们的NoClassDefFoundError故障排除系列的第2部分。 看一下第1部分 。 它将重点介绍最简单的NoClassDefFoundError问题类型。 本文对于Java初学者来说是理想的选择&#xff0c;我强烈建议您自己编译并运行示例Java程序。 今后将使用以下书写格式&#xff0c;并为您提供&…

Android开发技术周报 Issue#34

教程 Google Develop for Android 系列 前几天在G上看到Google Developers站点&#xff0c;有一个Android系列的文章&#xff0c;分享到个人微博&#xff0c;周末闲来没事就学写了下&#xff0c;把它们简单的翻译了下&#xff0c;没想到一发不可收拾&#xff0c;六篇文章全部都…

php进度条插件,分享8款优秀的 jQuery 加载动画和进度条插件_jquery

加载动画和进度条在网站和 Web 应用中的使用非常流行。虽然网速越来越快&#xff0c;但是我们的网站越来越复杂&#xff0c;同时用户对网站的使用体验的要求也越来越高。在内容加载缓慢的时候&#xff0c;使用时尚的加载动画和进度条告诉用户还有内容正在加载是一种非常好的方式…

卷积神经网络(CNN)与特殊的卷积

各种卷积操作的可视化的显示形式&#xff1a;GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning1. fractionally-strided 卷积 如上图示&#xff0c;输入为 33 &#xff0c;想要卷积上采样成 55 的输出。需要…

JBoss AS 7:自定义登录模块

JBoss AS 7很整洁&#xff0c;但是仍然缺少文档&#xff08;错误消息没有那么有用&#xff09;。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块&#xff0c;以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。 为什么要使用Ja…

MySQL安装步骤及相关问题解决

1. 下载MySQL Server&#xff0c;网址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2. 点击MySQL5.5.21的安装文件&#xff0c;出现安装向导界面&#xff0c;单击“next”继续安装&#xff1a; 3. 选择接受协议&#xff0c;单击“next”继续安装&#xff1a; 4. 在出现选…

matlab的数学函数,matlab中常见数学函数的使用

matlab中常见数学函数的使用 MATLAB 基本知识 Matlab 的内部常数 pi 圆周率 exp(1) 自然对数的底数 e i 或 j 虚数单位 Inf 或 inf 无穷大 Matlab 的常用内部数学函数 指数函数 exp(x) 以 e 为底数 log(x) 自然对数&#xff0c;即以 e 为底数的对数 log10(x) 常用对数&#xff…

C++中 list与vector的区别

C中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C vector和list的区别 1.vector数据结构vector和数组类似&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变。因此能高效的进行随机存取&#xff0c;时间复杂度为o(1);但因为内…

使用Struts 2的查询网格(无插件)

当将jQuery与struts 2一起使用时&#xff0c;开发人员被说服使用struts2-jQuery插件 。 因为大多数论坛和其他Internet资源都支持struts2 jQuery插件。我有这种经验。 我想将Struts 2使用jQuery Grid插件&#xff0c;但不使用struts2 jQuery插件。 对于我而言&#xff0c;很难找…

php reflectionmethod,PHP ReflectionMethod getClosure()用法及代码示例

ReflectionMethod::getClosure()函数是PHP中的一个内置函数&#xff0c;用于为该方法返回动态创建的闭包&#xff0c;否则&#xff0c;在出现错误的情况下返回NULL。用法:Closure ReflectionMethod::getClosure ( $object )参数&#xff1a;该函数接受参数对象&#xff0c;该参…

java学习笔记--IO流

第十二章大纲&#xff1a; I/O input/output 输入/输出 一、创建文件&#xff0c;借助File类来实现 file.createNewFile() &#xff1a; 创建文件 file.exists() &#xff1a; 判断文件是否存在&#xff0c;如果存在&#xff0c;则返回true delete() &#xff1a; 删除文件&…

linux命令之kill篇

作业四&#xff1a;查询firewall进程&#xff0c;然后杀死 [rootlocalhost 桌面]# ps -aux |grep firewall root 772 0.0 2.0 327912 20704 ? Ssl 15:23 0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid root 5323 0.0 0.0 112660…

ActiveMQ网络连接器

这篇文章对我和任何对网络连接器如何为ActiveMQ工作感兴趣的ActiveMQ贡献者而言都是更多的内容。 我最近花了一些时间查看代码&#xff0c;并认为最好画一些快速的图表来帮助我记住我学到的东西&#xff0c;并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入有误&…

《程序设计与数据结构》第3周学习总结

学号 20162317 《程序设计与数据结构》第3周学习总结 教材学习内容总结 第三章的内容相比之前两章更为具体&#xff0c;介绍的内容更为集中&#xff0c;主要说到了类和对象的问题&#xff0c;其中也仔细介绍了String类、Random类、Math类、NumberFormat类等类。此外也说到了与类…

Java中带有JWebSocket的WebServerSocket

首先&#xff0c;转到http://jwebsocket.org/下载2个软件包Server and Client。 如果要查看源代码&#xff0c;请下载源代码包。 服务器 解压缩服务器程序包。 转到“ conf”文件夹 选择“ jWebSocket.xml”文件打开 编辑“ jWebSocket.xml”文件&#xff0c;在标签<dom…

OpenCV入门指南----人脸检测

本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测&#xff08;人脸识别&#xff09;。人脸检测可以说是学术界的宠儿&#xff0c;在不少EI&#xff0c;SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。当然人脸检测的巨大实用价值也让…

matlab提取艾里斑,艾里斑:我不是雀斑

正是艾里斑&#xff0c;限制了光学仪器的精度我们知道凸透镜能把入射光会聚到它的焦点上&#xff0c;由于透镜的口径有一定大小&#xff0c;限制了光线的传播&#xff0c;所以凸透镜也会发生衍射。这导致透镜无法把光线会聚成无限小的点&#xff0c;而只会在焦点上形成具有一定…