`

spring对二进制文件(CLOB与BLOB型)的支持

阅读更多
如果要將 將檔案存入資料庫,我們在JDBC中可以使用CLOB與BLOB來分別針對文字檔案與二進位檔案進行儲存,Spring中可以透過JdbcTemplate來處理CLOB與BLOB。

舉個例子來說,假設您的MySQL資料庫表格如下:
1
2
3
4
5
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY,
txt TEXT,
image BLOB
);


假設我們現在分別讀進一個文字檔案與二進位檔案,並想將之儲存至資料庫中,則我們可以使用JdbcTemplate,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        final File binaryFile = new File("c:\\workspace\\wish.jpg");
final File txtFile = new File("c:\\workspace\\test.txt");

final InputStream is = new FileInputStream(binaryFile);
final Reader reader = new FileReader(txtFile);

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

final LobHandler lobHandler = new DefaultLobHandler();

jdbcTemplate.execute("INSERT INTO test (txt, image) VALUES(?, ?)",
new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
protected void setValues(PreparedStatement pstmt, LobCreator lobCreator)
throws SQLException, DataAccessException {
lobCreator.setClobAsCharacterStream(pstmt, 1, reader, (int) txtFile.length());
lobCreator.setBlobAsBinaryStream(pstmt, 2, is, (int) binaryFile.length());
}
});

reader.close();
is.close();


JdbcTemplate中傳入了AbstractLobCreatingPreparedStatementCallback的實作,並傳入一 個 LobHandler,對於MySQL(MS SQL Server或Oracle 10g),這邊使用DefaultLobHandler即可,對於Oracle 9i特定的LOB處理,我們可以使用OracleLobHandler。

如果要從資料庫中將資料讀取出來,並另存為檔案,我們可以使用以下的程式:
1
2
3
4
5
6
7
8
9
10
11
12
13
        final Writer writer = new FileWriter("c:\\workspace\\test_bak.txt");
final OutputStream os = new FileOutputStream(new File("c:\\workspace\\wish_bak.jpg"));

jdbcTemplate.query("SELECT txt,image FROM test WHERE id = ?",
new Object[] {new Integer(1)},
new AbstractLobStreamingResultSetExtractor() {
protected void streamData(ResultSet rs) throws SQLException, IOException, DataAccessException {
FileCopyUtils.copy(lobHandler.getClobAsCharacterStream(rs, 1), writer);
FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs, 2), os);
}
});
writer.close();
os.close();
 

在使用Spring搭配Hibernate時,可以簡化對Lob型態的處理,只要在SessionFactory建構時指定LobHandler,例如:
* beans-config.xml
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.     <bean id="dataSource"  
  5.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  6.         <property name="driverClassName">  
  7.             <value>com.mysql.jdbc.Driver</value>  
  8.         </property>  
  9.         <property name="url">  
  10.             <value>jdbc:mysql://localhost:3306/demo</value>  
  11.         </property>  
  12.         <property name="username">  
  13.             <value>root</value>  
  14.         </property>  
  15.         <property name="password">  
  16.             <value>123456</value>  
  17.         </property>  
  18.     </bean>  
  19.   
  20.     <bean id="lobHandler"  
  21.         class="org.springframework.jdbc.support.lob.DefaultLobHandler" />  
  22.     <bean id="sessionFactory"  
  23.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"  
  24.         destroy-method="close">  
  25.         <property name="dataSource">  
  26.             <ref bean="dataSource" />  
  27.         </property>  
  28.         <property name="lobHandler">  
  29.             <ref bean="lobHandler" />  
  30.         </property>  
  31.         <property name="mappingResources">  
  32.             <list>  
  33.                 <value>onlyfun/caterpillar/User.hbm.xml</value>  
  34.             </list>  
  35.         </property>  
  36.         <property name="hibernateProperties">  
  37.             <props>  
  38.                 <prop key="hibernate.dialect">  
  39.                     org.hibernate.dialect.MySQLDialect   
  40.                 </prop>  
  41.             </props>  
  42.         </property>  
  43.     </bean>  
  44.     <bean id="hibernateTemplate"  
  45.         class="org.springframework.orm.hibernate3.HibernateTemplate">  
  46.         <property name="sessionFactory">  
  47.             <ref bean="sessionFactory" />  
  48.         </property>  
  49.     </bean>  
  50. </beans>  


在這邊指定LobHandler時,對於MySQL、DB2、MS SQL Server、Oracle 10g,使用DefaultLobHandler即可,而對於Oracle 9i,則可以使用OracleLobHandler。

接下來的操作與一般對HibernateTemplate的操作無異,例如您的資料庫表格為:
1
2
3
4
5
CREATE TABLE user (
id INT auto_increment PRIMARY Key,
txt TEXT,
image BLOB
);


Spring的ClobStringType可以將CLOB映射至String,而BlobByteArrayType可以將BLOB映射至byte[],所以我們可以設計一個User類別如下:

* User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package onlyfun.caterpillar;
 
public class User {
private Integer id;
private String txt;
private byte[] image;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}  
}


Use.hbm.xml沒什麼特別的:

* User.hbm.xml
xml 代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  3. <hibernate-mapping>  
  4.     <class name="onlyfun.caterpillar.User" table="user">  
  5.         <id name="id" column="id">  
  6.             <generator class="native" />  
  7.         </id>  
  8.         <property name="txt" column="txt" />  
  9.         <property name="image" column="image" />  
  10.     </class>  
  11. </hibernate-mapping>  


以下是個簡單的儲存與讀取Lob的程式片段示範:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        ApplicationContext context =
new FileSystemXmlApplicationContext("beans-config.xml");

InputStream is = new FileInputStream(new File("c:\\workspace\\wish.jpg"));
byte[] b = new byte[is.available()];
is.read(b);
is.close();

User user = new User();
user.setTxt("long...long...text");
user.setImage(b);

HibernateTemplate hibernateTemplate = (HibernateTemplate) context.getBean("hibernateTemplate");
hibernateTemplate.save(user);

user = (User) hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
User user = (User) session.load(User.class, new Integer(1));
Hibernate.initialize(user);
return user;
}
});

System.out.println(user.getTxt());
b = user.getImage();

OutputStream os = new FileOutputStream(new File("c:\\workspace\\wish_bak.jpg"));
os.write(b);
os.close();


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1064190


分享到:
评论
1 楼 fangang 2007-01-19  
很不错的文章,支持一下

相关推荐

    Mybatis 处理 CLOB、BLOB 类型数据

    BLOB 类型用于存储二进制数据,可以存储图片、音乐、视频等文件。在 Oracle 数据库中,BLOB 类型对应的数据库类型是 BLOB,在 MySQL 中对应的类型是 BLOB。 MyBatis 提供了对 CLOB 和 BLOB 类型的内置支持,通过将 ...

    spring2通过jdbc的方式读取、更新数据库的clob或者blob类型的数据

    CLOB通常用于存储大文本数据,如文章、报告等,而BLOB则用于存储二进制大数据,如图片、音频或视频文件。 首先,我们来了解Spring的JdbcTemplate,它是Spring JDBC模块的核心组件,提供了一种简化数据库操作的抽象...

    java中(注解符)处理Clob(blob)类型

    Clob 类型用于存储大规模的字符数据,而 Blob 类型用于存储大规模的二进制数据。在 Java 中,处理 Clob 和 Blob 类型需要使用特殊的注解配置来确保正确地读取和写入数据。 一、Clob 类型的注解配置 在 Java 中,...

    spring blob相关

    Oracle数据库是企业级应用广泛采用的关系型数据库系统,它也支持BLOB类型来存储大量的二进制数据,如图像、音频或视频文件。在Spring框架中操作Oracle数据库中的BLOB字段,我们需要了解一些关键概念和步骤。 首先,...

    spring oracle blob

    BLOB(Binary Large Object)是二进制大对象的缩写,通常用于存储大量的二进制数据,如图片、音频或视频文件等。在Oracle数据库中,BLOB类型是一种专门用来存储大量二进制数据的数据类型。 ### 二、创建包含BLOB...

    spring+hibernate 解决大字段(clob)

    在企业级应用开发中,经常会遇到需要存储大量文本或二进制数据的情况,这时就需要用到数据库的大字段类型如CLOB(Character Large Object)和BLOB(Binary Large Object)。本文将详细介绍如何在Spring与Hibernate...

    spring+hibernate操作oracle的clob字段

    在J2EE开发中,处理大数据对象(如大文本或二进制数据)时,Oracle数据库的CLOB字段常被用来存储超过4000字节的信息。Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和...

    使用Jdbc4操作Blob,Clob

    Blob通常用于存储二进制数据,如图片、音频或视频文件,而Clob则用于存储大量文本数据,如长篇的文本或XML文档。在JDBC4中,处理LOB对象变得更为直接和高效,主要归功于新增的`java.sql.Blob`和`java.sql.Clob`接口...

    图片存数据库 clob类型

    ### 图片存储数据库——CLOB类型 #### 一、引言 在开发Web应用程序时,...此外,对于非常大的图片文件,可能还需要考虑使用BLOB(Binary Large Object)类型来存储原始二进制数据,或者采用其他更加高效的存储方案。

    spring1.2+hibernate2对大字段的处理实例

    1. **Blob/Clob类型**:对于大文本或二进制数据,可以使用数据库的Blob(Binary Large Object)和Clob(Character Large Object)类型。Hibernate2支持将Java的`java.sql.Blob`和`java.sql.Clob`对象映射到数据库的...

    spring1.2+hibernate3对大字段的处理实例,供大家学习与交流,可直接运行

    4. **BLOB/CLOB处理**:在Hibernate中,BLOB用于存储二进制大数据,CLOB用于存储字符大数据。在配置实体类时,可以指定对应的字段为这些类型。 5. **批处理**:在进行大量大字段操作时,可以使用批处理更新或插入,...

    spring3+springmvc+jpa2+gae

    JPA 2.0引入了更多特性,如 Criteria 查询、Entity Graph、二进制大对象(Blob/Clob)支持等,提高了开发者的工作效率和代码的可维护性。JPA可以通过ORM(对象关系映射)框架,如Hibernate,将Java对象与数据库表...

    简单易行:Spring中操作LOB字段案例

    在Spring框架中,LOB(Large Object)字段通常用于存储大数据,如BLOB(Binary Large Object)用于二进制数据,如图片或文档,CLOB(Character Large Object)用于字符数据,如长文本。本篇文章将深入探讨如何在...

    Spring jar 包.zip

    它支持复杂的数据类型,如BLOB(二进制大对象)和CLOB(字符大对象),并提供了高级的索引策略,如位图索引和函数索引。Oracle还提供了丰富的安全特性和强大的备份恢复机制。 整合这些组件意味着创建一个包含Spring...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    Spring+Hibernate处理Oracle lob字段(一)

    在Oracle数据库中,LOB字段主要有BLOB(Binary Large Object)和CLOB(Character Large Object)两种类型,分别用于存储二进制和字符数据。处理这些字段时,我们需要配置Hibernate的实体类和映射文件。 在实体类中...

    oracle+hibernate 处理blob +uploadify实例

    Blob(Binary Large Object)是数据库中用于存储二进制大对象的类型,常用于存储图片、音频、视频等文件。 首先,我们来看`Learner`类,这是Java对象的映射,代表了数据库中的`LEARNER`表。`Learner`类包含学员的...

    三个ssh框架

    Hibernate4相较于之前的版本,优化了查询性能,支持了更多的JPA标准,并引入了二进制大型对象(Blob/Clob)的处理。 “sshtest”可能是一个整合了SSH三个框架的示例项目,用于演示如何在实际开发中将它们集成在一起...

    Apress.Spring.Persistence – A.Running.Start.Feb.2009.pdf

    - **二进制数据处理**:探讨了Spring JDBC中处理二进制数据的方法,如BLOB和CLOB类型。 - **其他JdbcTemplate实现**:概述了除了默认的JdbcTemplate之外,还有哪些其他的实现可供选择。 ### 第三章:使用Spring与...

Global site tag (gtag.js) - Google Analytics