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

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

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


假設我們現在分別讀進一個文字檔案與二進位檔案,並想將之儲存至資料庫中,則我們可以使用JdbcTemplate,例如:
 
         File binaryFile =  File();
File txtFile = File();

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

JdbcTemplate jdbcTemplate = JdbcTemplate(dataSource);

LobHandler lobHandler = DefaultLobHandler();

jdbcTemplate.execute(,
AbstractLobCreatingPreparedStatementCallback(lobHandler)
setValues(PreparedStatement pstmt, LobCreator lobCreator)
SQLException, DataAccessException
lobCreator.setClobAsCharacterStream(pstmt, 1, reader, () txtFile.length());
lobCreator.setBlobAsBinaryStream(pstmt, 2, is, () binaryFile.length());

);

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


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

如果要從資料庫中將資料讀取出來,並另存為檔案,我們可以使用以下的程式:
 
         Writer writer =  FileWriter();
OutputStream os = FileOutputStream( File());

jdbcTemplate.query(,
Object[] Integer(1),
AbstractLobStreamingResultSetExtractor()
streamData(ResultSet rs) 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的操作無異,例如您的資料庫表格為:
 
CREATE TABLE user (
id INT auto_increment PRIMARY Key,
txt TEXT,
image BLOB
);


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

* User.java
 
 onlyfun.caterpillar;
 
User
Integer id;
String txt;
[] image;

Integer getId()
id;

setId(Integer id)
this.id = id;

[] getImage()
image;

setImage([] image)
this.image = image;

String getTxt()
txt;

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的程式片段示範:
 
        ApplicationContext context =
FileSystemXmlApplicationContext();

InputStream is = FileInputStream( File());
[] b = [is.available()];
is.read(b);
is.close();

User user = User();
user.setTxt();
user.setImage(b);

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

user = (User) hibernateTemplate.execute( HibernateCallback()
Object doInHibernate(Session session) HibernateException, SQLException
User user = (User) session.load(User.class, Integer(1));
Hibernate.initialize(user);
user;

);

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

OutputStream os = FileOutputStream( File());
os.write(b);
os.close();


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值