原文: https://howtodoinjava.com/hibernate/hibernate-example-of-insertselect-blob-from-database/

在先前的 Hiberate 教程中,我们了解了一级缓存二级缓存和一些映射示例等。这是 Hiberate 相关教程的完整列表。 在本文中,我将举一个使用 hibernate 将 BLOB 数据插入数据库并使用 hibernate 实体从数据库中获取数据的示例。

简而言之,插入和获取 BLOB 数据(例如图像)需要两个步骤:将数据库列类型定义为“BLOB”,并且在实体中具有“字节数组”类型的字段。

让我们举个例子,其中,我将 Windows C 驱动器中的“test.png”图像插入数据库(MySQL)。 然后,我将再次从数据库中读取图像数据并将其存储到其他位置。

Hiberate 实体

请注意,我已将数据字段声明为byte[]

  1. @Entity
  2. @Table(name = "TBL_IMAGES")
  3. public class ImageWrapper implements Serializable {
  4. private static final long serialVersionUID = 1L;
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY)
  7. @Column(name = "ID", unique = true, nullable = false)
  8. private Integer id;
  9. @Column(name = "IMAGE_NAME", unique = false, nullable = false, length = 100)
  10. private String imageName;
  11. @Column(name = "DATA", unique = false, nullable = false, length = 100000)
  12. private byte[] data;
  13. //Getters and Setters
  14. }

将 Blob 数据插入数据库

让我们看一下代码:

  1. Session session = HibernateUtil.getSessionFactory().openSession();
  2. session.beginTransaction();
  3. File file = new File("C:\test.png");
  4. byte[] imageData = new byte[(int) file.length()];
  5. try {
  6. FileInputStream fileInputStream = new FileInputStream(file);
  7. fileInputStream.read(imageData);
  8. fileInputStream.close();
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. ImageWrapper image = new ImageWrapper();
  13. image.setImageName("test.jpeg");
  14. image.setData(imageData);
  15. session.save(image); //Save the data
  16. session.getTransaction().commit();
  17. HibernateUtil.shutdown();

执行完上述代码后,您可以验证是否已在数据库中创建表。 并且创建了一个 BLOB 列来保存图像数据。

从数据库中插入/选择 Blob 的 Hiberate 示例 - 图1

Hibernate blob 示例

从数据库读取 Blob 数据

这很简单,实际上您不需要执行任何其他操作。 上面的实体定义可以正常工作。

  1. Session session = HibernateUtil.getSessionFactory().openSession();
  2. session.beginTransaction();
  3. ImageWrapper imgNew = (ImageWrapper)session.get(ImageWrapper.class, 1);
  4. byte[] bAvatar = imgNew.getData();
  5. try{
  6. FileOutputStream fos = new FileOutputStream("C:\temp\test.png");
  7. fos.write(bAvatar);
  8. fos.close();
  9. }catch(Exception e){
  10. e.printStackTrace();
  11. }
  12. session.getTransaction().commit();
  13. HibernateUtil.shutdown();

Hiberate 配置

作为参考,这是我在此示例中使用的配置:

hibernate.cfg.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
  9. <property name="hibernate.connection.password">password</property>
  10. <property name="hibernate.connection.username">root</property>
  11. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  12. <property name="show_sql">true</property>
  13. <property name="hibernate.hbm2ddl.auto">create</property>
  14. <mapping class="hibernate.test.dto.ImageWrapper"></mapping>
  15. </session-factory>
  16. </hibernate-configuration>

以下也是HibernateUtil.java的代码

HibernateUtil.java

  1. public class HibernateUtil {
  2. private static final SessionFactory sessionFactory = buildSessionFactory();
  3. @SuppressWarnings("deprecation")
  4. private static SessionFactory buildSessionFactory() {
  5. try {
  6. // Create the SessionFactory from hibernate.cfg.xml
  7. return new AnnotationConfiguration().configure(new File
  8. ("D:\Latest Setup\eclipse_juno_workspace\hibernate-test-project\hibernate.cgf.xml"))
  9. .buildSessionFactory();
  10. }
  11. catch (Throwable ex) {
  12. // Make sure you log the exception, as it might be swallowed
  13. System.err.println("Initial SessionFactory creation failed." + ex);
  14. throw new ExceptionInInitializerError(ex);
  15. }
  16. }
  17. public static SessionFactory getSessionFactory() {
  18. return sessionFactory;
  19. }
  20. public static void shutdown() {
  21. getSessionFactory().close();
  22. }
  23. }

如果仍然感到麻烦,请下载随附的源代码。

源码下载

祝您学习愉快!