Hibernate+Spring彻底搞定Clob、Blob的存取

Hibernate+Spring彻底搞定Clob、Blob的存取 


摘要:本文通过一个实例讲述如何通过Spring2+Hibernate3来快捷操作数据库中的Lob字段。 
环境:Oracle10g、Srping2、Hibernate3、JUint4 

说明:由于时间紧迫,没有详细写出思路。运行一下例子就明白了。 


一、创建实体并添加Xdoclet的Hibernate标签 

Java代码   收藏代码
  1. /** 
  2.  * @author leizhimin 
  3.  * @hibernate.mapping default-lazy="false" 
  4.  * @hibernate.meta attribute="class-description" value="工作日志" 
  5.  * @hibernate.class table="rc_gzrz" 
  6.  */  
  7. public class WorkNote {  
  8.     private Long id;                    //标识  
  9.     private Date workDate;             //日期  
  10.     private String weather;             //天气  
  11.     private String content;             //日志内容(Clob)  
  12.     private String state;               //日志状态  
  13.     private Long orgId;                 //机构id  
  14.     private Long userId;                //用户id  
  15.     private Date createDate;            //创建日期  
  16.     private byte[] image;               //图片  
  17.    
  18.     public static final String WORKNOTE_BLANK = "00";         //未填写  
  19.     public static final String WORKNOTE_FULL = "11";          //已填写  
  20.    
  21.     /** 
  22.      * @hibernate.id generator-class="sequence" column="BS" 
  23.      * @hibernate.meta attribute="field-description" value="标识" 
  24.      * @hibernate.generator-param name="sequence" value="SEQ_GW" 
  25.      */  
  26.     public Long getId() {  
  27.         return id;  
  28.     }  
  29.    
  30.     public void setId(Long id) {  
  31.         this.id = id;  
  32.     }  
  33.    
  34.     /** 
  35.      * @hibernate.property column="workDate" not-null="false" type="timestamp" 
  36.      * @hibernate.meta attribute="field-description" value="工作日期" 
  37.      */  
  38.    
  39.     public Date getWorkDate() {  
  40.         return workDate;  
  41.     }  
  42.    
  43.     public void setWorkDate(Date workDate) {  
  44.         this.workDate = workDate;  
  45.     }  
  46.    
  47.     /** 
  48.      * @hibernate.property column="weather" not-null="false" length="24" 
  49.      * @hibernate.meta attribute="field-description" value="天气" 
  50.      */  
  51.     public String getWeather() {  
  52.         return weather;  
  53.     }  
  54.    
  55.     public void setWeather(String weather) {  
  56.         this.weather = weather;  
  57.     }  
  58.    
  59.     /** 
  60.      * @hibernate.property column="content" not-null="false" type="text" 
  61.      * @hibernate.meta attribute="field-description" value="内容" 
  62.      */  
  63.     public String getContent() {  
  64.         return content;  
  65.     }  
  66.    
  67.     public void setContent(String content) {  
  68.         this.content = content;  
  69.     }  
  70.    
  71.     /** 
  72.      * @hibernate.property column="state" not-null="false" length="2" 
  73.      * @hibernate.meta attribute="field-description" value="状态" 
  74.      */  
  75.     public String getState() {  
  76.         return state;  
  77.     }  
  78.    
  79.     public void setState(String state) {  
  80.         this.state = state;  
  81.     }  
  82.    
  83.     /** 
  84.      * @hibernate.property column="orgId" type="long" 
  85.      * @hibernate.meta attribute="field-description" value="机构id" 
  86.      */  
  87.     public Long getOrgId() {  
  88.         return orgId;  
  89.     }  
  90.    
  91.     public void setOrgId(Long orgId) {  
  92.         this.orgId = orgId;  
  93.     }  
  94.    
  95.     /** 
  96.      * @hibernate.property column="userId" type="long" 
  97.      * @hibernate.meta attribute="field-description" value="用户id" 
  98.      */  
  99.     public Long getUserId() {  
  100.         return userId;  
  101.     }  
  102.    
  103.     public void setUserId(Long userId) {  
  104.         this.userId = userId;  
  105.     }  
  106.    
  107.     /** 
  108.      * @hibernate.property column="createDate" not-null="false" type="timestamp" 
  109.      * @hibernate.meta attribute="field-description" value="创建日期" 
  110.      */  
  111.     public Date getCreateDate() {  
  112.         return createDate;  
  113.     }  
  114.    
  115.     public void setCreateDate(Date createDate) {  
  116.         this.createDate = createDate;  
  117.     }  
  118.    
  119.     /** 
  120.      * @hibernate.property column="image" type="blob" not-null="false" 
  121.      * @hibernate.meta attribute="field-description" value="图片" 
  122.      */  
  123.     public byte[] getImage() {  
  124.         return image;  
  125.     }  
  126.    
  127.     public void setImage(byte[] image) {  
  128.         this.image = image;  
  129.     }  
  130. }  


二、通过XDoclet生成Mapping,并修正lob映射的类型为Spring提供的类型 

Java代码   收藏代码
  1. <?xml version="1.0" encoding="gb2312"?>  
  2.    
  3. <!DOCTYPE hibernate-mapping PUBLIC  
  4.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  5.     "[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">  
  6.    
  7. <hibernate-mapping  
  8.         default-lazy="false"  
  9. >  
  10.     <class  
  11.         name="com.topsoft.oa.routine.domain.office.entity.WorkNote"  
  12.         table="rc_gzrz"  
  13.     >  
  14.         <meta attribute="class-description">工作日志</meta>  
  15.    
  16.         <id  
  17.             name="id"  
  18.             column="BS"  
  19.             type="java.lang.Long"  
  20.         >  
  21.             <meta attribute="field-description">标识</meta>  
  22.             <generator class="sequence">  
  23.                 <param name="sequence">SEQ_GW</param>  
  24.               <!--    
  25.                   To add non XDoclet generator parameters, create a file named   
  26.                   hibernate-generator-params-WorkNote.xml   
  27.                   containing the additional parameters and place it in your merge dir.   
  28.               -->   
  29.             </generator>  
  30.         </id>  
  31.    
  32.         <property  
  33.             name="workDate"  
  34.             type="timestamp"  
  35.             update="true"  
  36.             insert="true"  
  37.             column="workDate"  
  38.             not-null="false"  
  39.         >  
  40.             <meta attribute="field-description">工作日期</meta>  
  41.         </property>  
  42.    
  43.         <property  
  44.             name="weather"  
  45.             type="java.lang.String"  
  46.             update="true"  
  47.             insert="true"  
  48.             column="weather"  
  49.             length="24"  
  50.             not-null="false"  
  51.         >  
  52.             <meta attribute="field-description">天气</meta>  
  53.         </property>  
  54.    
  55.         <property  
  56.             name="content"  
  57.             type="org.springframework.orm.hibernate3.support.ClobStringType"  
  58.             update="true"  
  59.             insert="true"  
  60.             column="content"  
  61.             not-null="false"  
  62.         >  
  63.             <meta attribute="field-description">内容</meta>  
  64.         </property>  
  65.    
  66.         <property  
  67.             name="state"  
  68.             type="java.lang.String"  
  69.             update="true"  
  70.             insert="true"  
  71.             column="state"  
  72.             length="2"  
  73.             not-null="false"  
  74.         >  
  75.             <meta attribute="field-description">状态</meta>  
  76.         </property>  
  77.    
  78.         <property  
  79.             name="orgId"  
  80.             type="long"  
  81.             update="true"  
  82.             insert="true"  
  83.             column="orgId"  
  84.         >  
  85.             <meta attribute="field-description">机构id</meta>  
  86.         </property>  
  87.    
  88.         <property  
  89.             name="userId"  
  90.             type="long"  
  91.             update="true"  
  92.             insert="true"  
  93.             column="userId"  
  94.         >  
  95.             <meta attribute="field-description">用户id</meta>  
  96.         </property>  
  97.    
  98.         <property  
  99.             name="createDate"  
  100.             type="timestamp"  
  101.             update="true"  
  102.             insert="true"  
  103.             column="createDate"  
  104.             not-null="false"  
  105.         >  
  106.             <meta attribute="field-description">创建日期</meta>  
  107.         </property>  
  108.    
  109.         <property  
  110.             name="image"  
  111.             type="org.springframework.orm.hibernate3.support.BlobByteArrayType"  
  112.             update="true"  
  113.             insert="true"  
  114.             column="image"  
  115.             not-null="false"  
  116.         >  
  117.             <meta attribute="field-description">图片</meta>  
  118.         </property>  
  119.    
  120.         <!--  
  121.             To add non XDoclet property mappings, create a file named  
  122.                 hibernate-properties-WorkNote.xml  
  123.             containing the additional properties and place it in your merge dir.  
  124.         -->  
  125.    
  126.     </class>  
  127.    
  128. </hibernate-mapping>  




三、通过Mapping 用XDoclet生成数据库(Oracle)脚本,并建表 

Java代码   收藏代码
  1. drop table rc_gzrz cascade constraints;  
  2.   
  3.   
  4.  create table rc_gzrz (  
  5.      BS number(19,0) not null,  
  6.      workDate timestamp,  
  7.      weather varchar2(24 char),  
  8.      content clob,  
  9.      state varchar2(2 char),  
  10.      orgId number(19,0),  
  11.      userId number(19,0),  
  12.      createDate timestamp,  
  13.      image blob,  
  14.      primary key (BS)  
  15.  );  
  16.   
  17.  comment on table rc_gzrz is  
  18.      '工作日志';  
  19.   
  20.  comment on column rc_gzrz.BS is  
  21.      '标识';  
  22.   
  23.  comment on column rc_gzrz.workDate is  
  24.      '工作日期';  
  25.   
  26.  comment on column rc_gzrz.weather is  
  27.      '天气';  
  28.   
  29.  comment on column rc_gzrz.content is  
  30.      '内容';  
  31.   
  32.  comment on column rc_gzrz.state is  
  33.      '状态';  
  34.   
  35.  comment on column rc_gzrz.orgId is  
  36.      '机构id';  
  37.   
  38.  comment on column rc_gzrz.userId is  
  39.      '用户id';  
  40.   
  41.  comment on column rc_gzrz.createDate is  
  42.      '创建日期';  
  43.   
  44.  comment on column rc_gzrz.image is  
  45.      '图片';  




四、创建DAO层 


Java代码   收藏代码
  1. /** 
  2.  * Created by IntelliJ IDEA. 
  3.  * User: leizhimin 
  4.  * Date: 2007-11-16 
  5.  * Time: 10:55:50 
  6.  * To change this template use File | Settings | File Templates. 
  7.  */  
  8. public interface WorkNoteDAO extends CommonDAO {  
  9.     /** 
  10.      * 根据日期查询工作日志 
  11.      * 
  12.      * @param workDate 工作日期 
  13.      * @param userId   用户id 
  14.      * @param orgId    机构id 
  15.      * @param sp       分页对象 
  16.      * @return List 
  17.      */  
  18.     public List findWorkNoteByDate(Date workDate, Long userId, Long orgId, SplitPage sp);  
  19.    
  20.     /** 
  21.      * 根据状态查询工作日志 
  22.      * 
  23.      * @param state     日志状态 
  24.      * @param userId    用户id 
  25.      * @param orgId     机构id 
  26.      * @param sp        分页对象 
  27.      * @return List 
  28.      */  
  29.     public List findWorkNoteByState(String state, Long userId, Long orgId, SplitPage sp);  
  30. }  
  31.    
  32.    
  33.    
  34. /** 
  35.  * Created by IntelliJ IDEA. 
  36.  * User: leizhimin 
  37.  * Date: 2007-11-16 
  38.  * Time: 10:56:00 
  39.  * To change this template use File | Settings | File Templates. 
  40.  */  
  41. public class WorkNoteDAOImpl extends CommonDAOImpl implements WorkNoteDAO{  
  42.     public List findWorkNoteByDate(Date workDate, Long userId, Long orgId, SplitPage sp) {  
  43.         return null;  
  44.     }  
  45.    
  46.     public List findWorkNoteByState(String state, Long userId, Long orgId, SplitPage sp) {  
  47.         return null;    
  48.     }  
  49. }  



五、创建带JTA事务控制的业务service层 

Java代码   收藏代码
  1. /** 
  2.  * Created by IntelliJ IDEA. 
  3.  * User: leizhimin 
  4.  * Date: 2007-11-16 
  5.  * Time: 16:43:57 
  6.  * To change this template use File | Settings | File Templates. 
  7.  */  
  8. public interface OfficeService {  
  9.    
  10.     public void saveWorkNote(WorkNote workNote);  
  11.    
  12.     public void updateWorkNote(WorkNote workNote);  
  13. }  
  14.    
  15.    
  16. /** 
  17.  * Created by IntelliJ IDEA. 
  18.  * User: leizhimin 
  19.  * Date: 2007-11-16 
  20.  * Time: 16:45:54 
  21.  * To change this template use File | Settings | File Templates. 
  22.  */  
  23. public class OfficeServiceImpl implements OfficeService{  
  24.     private WorkNoteDAO workNoteDAO;  
  25.    
  26.     public WorkNoteDAO getWorkNoteDAO() {  
  27.         return workNoteDAO;  
  28.     }  
  29.    
  30.     public void setWorkNoteDAO(WorkNoteDAO workNoteDAO) {  
  31.         this.workNoteDAO = workNoteDAO;  
  32.     }  
  33.    
  34.     public void saveWorkNote(WorkNote workNote) {  
  35.         this.workNoteDAO.saveObject(workNote);  
  36.     }  
  37.    
  38.     public void updateWorkNote(WorkNote workNote) {  
  39.         this.workNoteDAO.updateObject(workNote);  
  40.     }  
  41. }  



六、书写单元测试,并运行 
Java代码   收藏代码
  1. /** 
  2.  * Created by IntelliJ IDEA. 
  3.  * User: leizhimin 
  4.  * Date: 2007-11-16 
  5.  * Time: 16:49:17 
  6.  * To change this template use File | Settings | File Templates. 
  7.  */  
  8. public class TestOffice extends TestCase {  
  9.     public void test_worknote_save(){  
  10.         OfficeService officeService = (OfficeService) ContextHelper.getContext().getBean("officeServiceProxy");  
  11.         WorkNote workNote=new WorkNote();  
  12.         workNote.setContent("[url]http://lavasoft.blog.51cto.com/[/url]");  
  13.         workNote.setOrgId(Long.parseLong("999"));  
  14.         workNote.setCreateDate(new Date());  
  15.         byte[] b="lavasoft".getBytes();  
  16.         workNote.setImage(b);  
  17.         officeService.saveWorkNote(workNote);  
  18.     }  
  19. }  


看看测试结果: 

 
 

看到了吧,存进去了,各位周末愉快~~ 
### 回答1: 要导出和导入Oracle数据库中的CLOBBLOB数据类型,可以使用以下方法: 1. 使用Oracle自带的exp和imp工具导出和导入整个数据库或特定表的数据。在导出时,使用参数“file=clob_data.dmp”或“file=blob_data.dmp”指定导出文件名。在导入时,使用参数“file=clob_data.dmp”或“file=blob_data.dmp”指定导入文件名。 2. 使用Oracle SQL Developer工具导出和导入特定表的数据。在导出时,选择要导出的表,右键点击选择“导出”选项,选择“导出数据”并选择“导出为LOB文件”。在导入时,选择要导入的表,右键点击选择“导入”选项,选择“导入数据”并选择“从LOB文件导入”。 3. 使用PL/SQL代码导出和导入CLOBBLOB数据。在导出时,使用SELECT语句查询CLOBBLOB列的值,并将其写入文件中。在导入时,使用INSERT语句将文件中的值插入到CLOBBLOB列中。 以上是几种常见的导出和导入Oracle数据库中CLOBBLOB数据的方法。具体使用哪种方法取决于具体情况和需求。 ### 回答2: Oracle是一个广泛使用的关系型数据库,其中包含了CLOB(字符大对象)和BLOB(二进制大对象)类型的数据。这些数据类型通常用于存储大型文本和图像等二进制数据。在Oracle中,导出和导入CLOBBLOB数据是非常常见的任务。本文将介绍如何导出和导入这些类型的数据。 首先,我们需要了解Oracle提供的导出工具是exp和expdp。exp是旧版工具,而expdp是新版工具。在导出CLOBBLOB数据时,我们建议使用expdp,因为它是专门为大量导出数据而设计的。下面我们来看看导出CLOB数据的方法: 1. 使用expdp导出 使用expdp命令导出CLOB数据需要指定以下参数: - expdp system/password tables=table_name directory=directory_name dumpfile=file_name.dmp lob_file=file_name.log EXCLUDE=STATISTICS 其中table_name是要导出的表名,directory_name是导出文件的路径,file_name是导出文件的名称,lob_file是LOB类型的文件的名称。 2. 使用SQL*Plus导出 我们也可以使用SQL*Plus命令导出CLOB数据。以下是步骤: 1)使用SQL*Plus连接到Oracle数据库。 2)使用以下命令在本机上创建目录 OBJECT_DIR: CREATE OR REPLACE DIRECTORY OBJECT_DIR AS 'C:\TEMP'; 3)使用以下命令导出CLOB数据: SET LONG 10000 SET PAGESIZE 0 SET LINESIZE 1000 SET FEEDBACK OFF SPOOL CLOB_Export.sql SELECT 'SELECT ' || column_name || ' FROM ' || table_name || ' WHERE ' || where_clause || ';' FROM all_tab_cols WHERE data_type = 'CLOB' AND table_name = 'TABLE_NAME'; SPOOL OFF 4)使用以下命令将生成的SQL脚本文件CLOB_Export.sql导出到本地目录: exp userid=username/password file=dumpfile.dmp owner=owner_name log=clob_export.log 接下来我们会介绍如何导入CLOBBLOB数据。 1. 使用impdp导入 使用impdp命令导入CLOB数据需要指定以下参数: - impdp system/password directory=directory_name dumpfile=file_name.dmp logfile=file_name.log tables=table_name 其中directory_name是导入文件的路径,file_name是导入文件的名称,table_name是要导入数据的表的名称。 2. 使用SQL*Plus导入 我们也可以使用SQL*Plus命令导入CLOB数据。以下是步骤: 1)使用SQL*Plus连接到Oracle数据库。 2)使用以下命令在本机上创建LOB的目录 LOB_DIR: CREATE OR REPLACE DIRECTORY LOB_DIR AS 'C:\TEMP'; 3)使用以下命令在Oracle中创建LOB表: CREATE TABLE lob_table ( lob_column CLOB ); 4)使用以下命令将LOB类型的文件loaded_file.xml导入到LOB表中: INSERT INTO lob_table (lob_column) VALUES (EMPTY_CLOB()); SELECT lob_column FROM lob_table FOR UPDATE; DECLARE infile BFILE :=BFILENAME('OBJECT_DIR', 'loaded_file.xml'); lob_loc CLOB; BEGIN DBMS_LOB.OPEN(lob_column, DBMS_LOB.LOB_READWRITE); DBMS_LOB.LOADFROMFILE(lob_column, infile, DBMS_LOB.GETLENGTH(infile)); DBMS_LOB.CLOSE(lob_column); COMMIT; END; / 以上是导出导入CLOB/BLOB数据的两种方法,根据实际情况可以选择使用expdp、impdp或SQL*Plus导出和导入。然而在导入CLOB/BLOB时,需要特别注意数据库版本以及LOB大小限制等问题。 ### 回答3: 在Oracle中,CLOBBLOB是用来存储大文本和二进制数据的数据类型。有时候我们需要对这些数据进行导入和导出。在这篇文章中,我会介绍如何将CLOBBLOB数据导入和导出。 导出CLOB/BLOB数据 在Oracle中,可以使用DBMS_LOB包来导出CLOBBLOB数据。首先,我们需要使用SELECT语句来查询需要导出的数据。查询的结果会以一个CLOBBLOB对象的形式存在,然后我们可以把这个对象导出到一个文件中。以下是导出CLOBBLOB对象到文件中的步骤: 1.查询需要导出的数据 例如,我们可以使用以下SELECT语句来查询一个CLOB表中的数据: SELECT clob_column FROM clob_table; 2.将查询结果存储到变量中 为了方便将查询结果导出到文件中,我们需要将查询结果存储到一个变量中。我们可以使用PL/SQL或SQL*Plus来完成这个任务。以下是一个PL/SQL的例子: DECLARE my_data CLOB; BEGIN SELECT clob_column INTO my_data FROM clob_table; END; 3.将变量的值导出到文件中 使用DBMS_LOB包中的函数,可以将变量的值导出到文件中,以下是一个导出CLOB数据的例子: DECLARE my_data CLOB; my_file UTL_FILE.FILE_TYPE; BEGIN SELECT clob_column INTO my_data FROM clob_table; my_file := UTL_FILE.FOPEN('MY_DIR', 'my_file.txt', 'w'); DBMS_LOB.FILEEXPORT(my_file, my_data); UTL_FILE.FCLOSE(my_file); END; 注意: - 'MY_DIR'是Oracle指定的一个目录,需要在数据库中提前定义。 - 'my_file.txt'是导出文件的名称 - 'w'表示以覆盖模式写入文件 这个例子将会把查询出来的CLOB数据导出为txt文件。 导入CLOB/BLOB数据 同样的,我们可以使用DBMS_LOB包来导入CLOBBLOB数据。以下是导入CLOBBLOB数据的步骤: 1.读取文件内容 使用UTL_FILE包中的函数,可以读取文件的内容到一个变量中,例如以下SQL*Plus的命令: DEFINE my_file='my_file.txt' DECLARE my_data CLOB; my_file UTL_FILE.FILE_TYPE; BEGIN my_file := UTL_FILE.FOPEN('MY_DIR', '&my_file', 'r'); UTL_FILE.GET_LINE(my_file, my_data); UTL_FILE.FCLOSE(my_file); END; 注意: - 'my_file.txt'是要导入到数据库的文件名称 - MY_DIR是Oracle指定的一个目录,需要在数据库中提前定义。 2.将变量的值导入到数据库中 使用INSERT语句将变量的值插入到CLOB表中,例如以下的SQL*Plus命令: INSERT INTO clob_table (clob_column) VALUES (my_data); 注意: 在Oracle中,插入CLOBBLOB数据时,要使用专门的函数,例如: INSERT INTO clob_table (clob_column) VALUES (TO_LOB('some text')); 以上就是导出和导入CLOB/BLOB数据的步骤。当然,在实际操作中可能会遇到各种各样的问题,我们需要仔细阅读相关的文档,查找正确的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值