`

Spring 對 Lob 的支援...

阅读更多
如果要將 將檔案存入資料庫,我們在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
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/demo</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="lobHandler">
<ref bean="lobHandler"/>
</property>
<property name="mappingResources">
<list>
<value>onlyfun/caterpillar/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
</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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="user">
 
<id name="id" column="id">
<generator class="native"/>
</id>
 
<property name="txt" column="txt"/>
 
<property name="image" column="image"/>
</class>
</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

分享到:
评论

相关推荐

    oracle dbms_lob

    例如,可以使用`DBMS_LOB.WRITE`在INSERT或UPDATE语句中修改LOB值,或者使用`DBMS_LOB.APPEND`在已有的LOB后面添加新内容。 学习`DBMS_LOB`包的过程中,了解其每个过程和函数的参数含义、使用场景和返回值非常重要...

    lob笔记.doclob笔记.doc

    根据给定文件的部分内容,我们可以深入探讨在PostgreSQL数据库中如何处理大对象(LOB,Large Object)以及Blob、Clob的使用方式与管理机制。以下将详细解释这些知识点: ### Blob与Clob在PostgreSQL中的实现 #### ...

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

    &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; &lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&gt; &lt;bean id="jdbcTemplate" class="org....

    Packt.Mastering.LOB.Development.for.Silverlight.5.A.Case.Study.in.Action

    《Packt.Mastering.LOB.Development.for.Silverlight.5.A.Case.Study.in.Action》这本书专注于使用Silverlight 5进行企业级应用(LOB,Line of Business)开发的实践指导。通过对具体案例的研究,读者可以深入理解...

    Oracle数据库中LOB的调优.pdf

    设置合理的CHUNK值,不仅可以避免存储空间的浪费,而且由于Oracle对LOB字段的I/O操作也是以CHUNK为单位,因此可以改善I/O性能。CHUNK的值应该根据实际应用中LOB字段经常使用的平均长度来调节。 2. In-Line与Out-Of-...

    Spring.3.x企业应用开发实战(完整版).part2

    1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring...

    Spring+3.x企业应用开发实战光盘源码(全)

    第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。  第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。  第3章:...

    Oracle中对LOB对象的操作.pdf

    DBMS_LOB.COPY(img_Blob, BFILENAME('PHOTO', imgFile), DBMS_LOB.GETLENGTH(BFILENAME('PHOTO', imgFile))); -- 关闭BLOB DBMS_LOB.CLOSE(img_Blob); END; ``` 在实际应用中,可能还需要考虑LOB的性能优化,...

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

    &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;value&gt;MyEntity.hbm.xml &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.OracleDialect ...

    ORACLE LOB大对象处理.pdf

    - DBMS_LOB.Read()过程:从LOB数据中读取指定长度的数据到缓冲区。 - DBMS_LOB.SubStr()函数:从LOB数据中提取子字符串。 6. DBMS_LOB包的使用: - DBMS_LOB包中的过程和函数被用来处理LOB数据,可以读取、写入...

    spring+hibernate操作oracle的clob字段

    &lt;bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler"&gt; &lt;bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support....

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    4 Service Manager App LOB Owner Installer.exe

    4 Service Manager App LOB Owner Installer.exe

    前端开源库-lob.zip

    "前端开源库-lob.zip"这个压缩包文件很可能包含了名为"LOB"的前端开源库的相关资源。虽然没有提供具体的标签信息,我们可以根据“前端开源库”这一关键词来推测其内容,通常包括源代码、文档、示例、测试用例等。在...

    ODI LOB 类型KM

    这个KM主要用于对Oracle数据库中的LOB字段进行增量更新。在数据集成过程中,增量更新是必要的,特别是当源系统和目标系统之间有实时数据同步需求时。ODI的Incremental Update KM能够识别自上次同步以来发生变化的...

    spring oracle blob

    &lt;bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true"&gt; ``` 以上配置中,`DataSourceTransactionManager`用于管理事务,而`OracleLobHandler`则...

    本文档主要介绍如何对LOB字段进行处理

    以上代码首先通过查询获取了目标行的`document`字段的LOB定位器,然后准备了要写入的文本数据,并通过`DBMS_LOB.WRITE()`过程将文本写入CLOB字段。 #### 结论 本文详细介绍了在Oracle数据库中如何使用和维护LOB...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。  第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到...

Global site tag (gtag.js) - Google Analytics