Hibernate – イメージをデータベースに保存する
イメージをデータベースに保存するには、テーブルカラムをMySQLのブロブデータタイプ、または他のデータベースの同等のバイナリタイプとして定義する必要があります。
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の依存関係を追加してください。
<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.アバターモデル
アバターデータを格納するモデルクラスを作成します。イメージデータ型はバイトの配列です。
-
Avatar.java **
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ユーティリティ
データベース接続を取得するための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.gif
“ファイルを読み込んでデータベースに保存し、後でデータベースから取得して別のイメージファイル ”
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(); } }
完了しました。