休眠–将图像保存到数据库

要将图像保存到数据库中,您需要将表列定义为MySQL中的blob数据类型,或其他数据库中的等效二进制类型。 在Hibernate端,您可以声明一个字节数组变量来存储图像数据。

下载此示例– Hibernate-Image-Example.zip

这是一个使用Hibernate将图像保存到MySQL'avatar '表中的Maven项目。

1.表创建

MySQL中的头像表创建脚本。

CREATE TABLE  `mkyong`.`avatar` (
  `AVATAR_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `IMAGE` blob NOT NULL,
  PRIMARY KEY (`AVATAR_ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2. Maven依赖

添加Hibernate和MySQL依赖项。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mkyong.common</groupId>
  <artifactId>HibernateExample</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>HibernateExample</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    
        <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
        </dependency>
    
        <!-- MySQL database driver -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.9</version>
	</dependency>
	
	<!-- Hibernate framework -->
	<dependency>
		<groupId>hibernate</groupId>
		<artifactId>hibernate3</artifactId>
		<version>3.2.3.GA</version>
	</dependency>
	
	<!-- Hibernate library dependecy start -->
	<dependency>
		<groupId>dom4j</groupId>
		<artifactId>dom4j</artifactId>
		<version>1.6.1</version>
	</dependency>
	
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.1.1</version>
	</dependency>
	
	<dependency>
		<groupId>commons-collections</groupId>
		<artifactId>commons-collections</artifactId>
		<version>3.2.1</version>
	</dependency>
	
	<dependency>
		<groupId>cglib</groupId>
		<artifactId>cglib</artifactId>
		<version>2.2</version>
	</dependency>
	<!-- Hibernate library dependecy end -->
	
  </dependencies>
</project>

3.头像模型

创建一个模型类来存储化身数据。 图像数据类型是字节数组。

阿凡达

package com.mkyong.common;

public class Avatar implements java.io.Serializable {

	private Integer avatarId;
	private byte[] image;

	public Avatar() {
	}

	public Avatar(byte[] image) {
		this.image = image;
	}

	public Integer getAvatarId() {
		return this.avatarId;
	}

	public void setAvatarId(Integer avatarId) {
		this.avatarId = avatarId;
	}

	public byte[] getImage() {
		return this.image;
	}

	public void setImage(byte[] image) {
		this.image = image;
	}

}

4.映射文件

为头像创建一个Hibernate映射文件。 图像的数据类型为二进制。

Avatar.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.mkyong.common.Avatar" table="avatar" catalog="mkyong">
        <id name="avatarId" type="java.lang.Integer">
            <column name="AVATAR_ID" />
            <generator class="identity" />
        </id>
        <property name="image" type="binary">
            <column name="IMAGE" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

5.休眠配置文件

Hibernate配置文件定义了数据库连接和Hibernate映射文件。

hibernate.cfg.xml

<?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.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping resource="com/mkyong/common/Avatar.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

6.休眠工具

一个Hibernate实用程序类,用于获取数据库连接。

HibernateUtil.java

package com.mkyong.persistence;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
    public static void shutdown() {
    	// Close caches and connection pools
    	getSessionFactory().close();
    }

}

7.运行

读取文件“ C:\\ mavan-hibernate-image-mysql.mysql ”并将其保存到数据库中,以后再从数据库中获取并将其保存到另一个图像文件“ C:\\ test.gif ”中。

package com.mkyong.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.hibernate.Session;
import com.mkyong.persistence.HibernateUtil;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println("Hibernate save image into database");
        Session session = HibernateUtil.getSessionFactory().openSession();
        
        session.beginTransaction();
        
        //save image into database
    	File file = new File("C:\\mavan-hibernate-image-mysql.gif");
        byte[] bFile = new byte[(int) file.length()];
        
        try {
	     FileInputStream fileInputStream = new FileInputStream(file);
	     //convert file into array of bytes
	     fileInputStream.read(bFile);
	     fileInputStream.close();
        } catch (Exception e) {
	     e.printStackTrace();
        }
        
        Avatar avatar = new Avatar();
        avatar.setImage(bFile);
        
        session.save(avatar);
        
        //Get image from database
        Avatar avatar2 = (Avatar)session.get(Avatar.class, avatar.getAvatarId());
        byte[] bAvatar = avatar2.getImage();
        
        try{
            FileOutputStream fos = new FileOutputStream("C:\\test.gif"); 
            fos.write(bAvatar);
            fos.close();
        }catch(Exception e){
            e.printStackTrace();
        }

        session.getTransaction().commit();
    }
}

做完了

翻译自: https://mkyong.com/hibernate/hibernate-save-image-into-database/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux线程休眠时,其缓存的数据实际上是由操作系统内核管理并负责保存的,而不仅仅是用户级线程。在Linux环境下,系统采用了一个复杂的内存管理系统来处理进程、线程和缓存之间的交互。 当一个线程进入休眠状态时,并不会立即释放所有资源;相反,它将进入等待状态(例如等待I/O操作完成、等待事件信号等),这时CPU会释放该线程所占的计算资源。但在等待期间,如果线程需要访问缓存,则内核会维护必要的缓存信息以便于快速恢复线程状态。 对于缓存数据来说,在线程休眠期间可能会面临三种情况: 1. **进程级别的缓存**:Linux使用页缓存(Page Cache)机制来存储文件的数据块到内存中,以便加速文件读写速度。当线程休眠时,这部分缓存仍然存在,直到文件实际被移除或者被其他操作影响。 2. **程序特定的缓存**:这通常包括了由应用程序内部维护的缓存数据结构,比如数据库查询结果缓存、网络请求的结果缓存等。这类缓存往往依赖于进程级别线程间的共享内存或者其他同步机制来保持一致性。在线程休眠时,这些缓存通常会被保留在堆内存中,等待线程恢复后继续使用。 3. **硬件缓存**:CPU缓存以及GPU缓存等硬件缓存,在线程休眠时同样会被保留下来。这些缓存主要用于提升处理器性能,减少对外部存储设备的访问。 当线程从休眠状态唤醒时,内核会检查相应的资源是否可用。如果资源仍然有效并且未被其他线程修改,则可以安全地恢复线程的状态。对于涉及到缓存的部分,线程唤醒后通常能够迅速从之前的状态继续执行,无需重建大量的临时缓冲区或重新加载数据。 需要注意的是,具体的缓存策略和如何处理休眠线程时的缓存数据,还取决于使用的软件库和应用的具体设计。例如,某些库可能会提供专门的功能来帮助管理线程暂停期间的缓存状态,确保数据的一致性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值