7.BDF2-UPLOADER

2023-07-03 17:22 更新
在BDF2-UPLOADER模塊當中,為我們提供了一個將文件從瀏覽器上傳到服務(wù)端的工具,該工具以標準的Dorado7組件形式存在,利用標準的HTML及JAVASCRIPT實現(xiàn)文件的選擇與上傳(未采用任何其它第三方控件,比如flash,activex等),兼容所有主流瀏覽器(IE、FF、Chrome等),默認提供了將文件保存到服務(wù)端某文件夾或服務(wù)端數(shù)據(jù)表中兩種類型的文件存儲機制。

要使用BDF2-UPLOADER模塊,我們可以到nexus.bsdn.org上下載最新的BDF2-UPLOADER模塊的jar,或者可以到我們提供的在線創(chuàng)建項目向?qū)е羞x擇BDF2-UPLOADER模塊并下載即可;同樣,如果您采用的是Maven來管理項目,那么只需要將BDF2-UPLOADER模塊的依賴信息加到我們的pom.xml當中即可:
BDF2-UPLOADER模塊的依賴
<dependency>
 <groupId>com.bstek.bdf2</groupId>
 <artifactId>bdf2-uploader</artifactId>
 <version>2.0.0</version>
</dependency>
添加好BDF2-UPLOADER模塊之后,就可以啟動我們的項目
注意
實際上,BDF2-JASPERREPORTS模塊就依賴BDF2-UPLOADER模塊,所以在之前我們介紹BDF2-JASPERREPORTS模塊中,在上傳jasper格式報表及相關(guān)資源,用的就是BDF2-UPLOADER模塊提供的上傳功能。
我們知道BDF2-JASPERREPORTS模塊提供了一個標準的Dorado7組件來讓我們實現(xiàn)上傳功能,所以啟動工程后,要在我們view的工具欄當中看到這個上傳組件,需要更新Dorado7規(guī)則(在線更新方式),更新完成之后,打開一個view,可以在工具欄當中看到如下圖所示組件圖標。

這個名為“RichUploader”的組件就是BDF2-UPLOADER模塊提供的上傳組件,將這個組件添加到view當前,運行這個view可以看到這個組件就是一個標準的HTML的Button,如下圖所示:

因為RichUploader上傳組件就是一個標準的HTML的Button,所以在Dorado7View當中使用空上組件時,我們就可以當其是一個Dorado7的button,可以像操作Dorado7的button一樣,將其放在一個容器當中,放在一個表單當中,或者放在一個FormElement的container當中,對于RichUploader我們需要注意下面這幾個屬性:
屬性名類型默認值描述
allowFileTypesString允許用戶上傳哪些類型的文件,默認為空,表示不限制類型。
allowMaxFileSize
int允許用戶上傳文件的最大尺寸,單位是byte,默認為空,表示不限制尺寸。
captionString上傳按鈕的標題,如上圖當中的“上傳測試”。
processor
String文件上傳到服務(wù)端時采用哪個文件上傳處理器來處理上傳的文件,默認為空,表示采用ID為“Database”的文件上傳處理器,這個處理器的作用就是將文件上傳到服務(wù)器下某個目錄。
autoSubmit

booleantrue選擇好文件后是否自動上傳,默認為true,表示選擇好文件組件會自動觸發(fā)上傳動作,如果設(shè)置為false,那么我們需要手工調(diào)用該組件的submit方法來執(zhí)行上傳動作。
除了上述四個屬性外,RichUploader還提供了四個事件,如下表所示:
事件名描述
onSelect在選擇好一個文件,但還沒開始將文件上傳到服務(wù)端時觸發(fā)的事件,在這個事件當中,我們可以通過其中提供的arg參數(shù)的filename屬性拿到選擇好的文件的文件名稱。
onSuccess
文件上傳成功之后觸發(fā)的事件,從這個事件當中的arg參數(shù)中,我們可以獲取到上傳成功之后文件的文件名(arg.filename),以及文件存儲后產(chǎn)生的id(arg.id),一般來說,對于我們的業(yè)務(wù)系統(tǒng),我們需要保存這個id ,通過這個id就可以找到上傳的文件,filename一般僅用于顯示。
onFail
文件上傳失敗之后觸發(fā)的事件,從這個事件當中的arg參數(shù)中,我們可以獲取到上傳失敗的錯誤消息(arg.errorMessage),比如上傳文件類型不對,文件尺寸太大,或其它的錯誤消息等。
我們知道RichUploader組件有個名為processor的屬性,它可以決定文件上傳到服務(wù)端時采用哪個文件上傳處理器來處理上傳的文件,默認情況下,BDF2-UPLOADER模塊當中提供了兩個文件上傳處理器,分別是LocalDirectory及Database。LocalDirectory就是將上傳的文件存儲到服務(wù)端某個目錄下;而Database則是將上傳文件存儲到服務(wù)端數(shù)據(jù)庫的特定表當中。如果在使用過程當中,我們有自己的文件存儲方式(比如存儲到DMS中),那么可以自定義自己的文件上傳處理器,要自定義文件上傳處理器,我們需要實現(xiàn)IFileProcessor接口,這個接口源碼如下:
IFileProcessor接口源碼
package com.bstek.bdf2.uploader.processor;
import java.io.InputStream;
import com.bstek.bdf2.uploader.model.UploadDefinition;
/**
 * @author Jacky.gao
 * @since 2013-5-1
 */
public interface IFileProcessor {
 /**
 * 保存上傳的文件
 * @param uploadDefinition 可以從這個對象中取到上傳文件的ID、名稱、大小等信息
 * @param inputStream 上傳文件的流對象
 */
 void saveFile(UploadDefinition uploadDefinition,InputStream inputStream);
 /**
 * 根據(jù)給出的文件上傳對象,返回對應(yīng)的文件流
 * @param uploadDefinition 文件上傳對象
 * @return 要取回的文件流
 */
 InputStream loadFile(UploadDefinition uploadDefinition);
 /**
 * 根據(jù)文件上傳對象,刪除對應(yīng)的文件
 * @param uploadDefinition 文件上傳對象
 */
 void deleteFile(UploadDefinition uploadDefinition);
 /**
 * @return 返回當前處理器的ID
 */
 String key();
 /**
 * @return 是否禁用當前處理器
 */
 boolean isDisabled();
}
接口比較簡單,這里就不于解釋了,處理器實現(xiàn)類編寫完成之后,需要配置到Spring當中,這樣我們就可以在RichUploader中使用這個處理器了,方法就是給RichUploader的processor屬性值設(shè)置為我們自定義的處理器key()方法返回的值即可。

例子是最好的示范,我們來看看系統(tǒng)默認提供的Database這個自定義處理器的寫法:
Database文件上傳處理器
package com.bstek.bdf2.uploader.processor.impl;
import java.io.InputStream;
import com.bstek.bdf2.uploader.model.UploadDefinition;
import com.bstek.bdf2.uploader.processor.IFileProcessor;
import com.bstek.bdf2.uploader.service.ILobStoreService;
/**
 * @author Jacky.gao
 * @since 2013-5-20
 */
public class DatabaseFileProcessor implements IFileProcessor {
 private boolean disabled;
 private ILobStoreService lobStoreService;
 public void saveFile(UploadDefinition uploadDefinition,InputStream inputStream) {
 try {
 lobStoreService.storeBinaryStream(inputStream, inputStream.available(),uploadDefinition.getId());
 } catch (Exception e) {
 throw new RuntimeException(e);
 }
 }
 public InputStream loadFile(UploadDefinition uploadDefinition) {
 try {
 return lobStoreService.getBinaryStream(uploadDefinition.getId());
 } catch (Exception e) {
 throw new RuntimeException(e);
 }
 }
 public void deleteFile(UploadDefinition uploadDefinition) {
 try {
 lobStoreService.deleteBinaryStream(uploadDefinition.getId());
 } catch (Exception e) {
 throw new RuntimeException(e);
 }
 }
 public String key() {
 return "Database";
 }
 public boolean isDisabled() {
 return disabled;
 }
 ......
}
對于已經(jīng)上傳好的文件,我們可以通過下頁兩個URL對通過RichUploader上傳的文件進行在線顯示(比如圖片、XML文件等)或直接下載。我們
首先來看看下載文件的URL:
<contextPath>/dorado/bdf2/uploader/process.download?id=<通過RichUploader上傳文件成功后拿到的文件的id>
如果需要在線顯示一個通過RichUploader上傳的文件,其訪問的URL格式如下:
<contextPath>/dorado/bdf2/uploader/process.display?id=<通過RichUploader上傳文件成功后拿到的文件的id>
對于BDF2-UPLOADER模塊,我們還提供了下面這個屬性允許用戶覆蓋:
屬性名類型默認值描述
bdf2.upload.dataSourceNameStringBDF2-UPLOADER模塊要采用的數(shù)據(jù)源,為空表示采用默認數(shù)據(jù)源。
bdf2.uploader.allowMaxFileSizeint0允許上傳文件的最大尺寸,默認為0表示不限制尺寸。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。
bdf2.uploader.allowFileTypes
String允許上傳文件的類型,多個類型用逗號分隔,默認為空表示不限制類型。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。
bdf2.uploader.defaultProcessorString
Database
默認要采用的文件上傳處理器,默認為Database,表示上傳的文件存放于數(shù)據(jù)庫特定表中。該屬性可以在RichUploader組件使用時重新定義,一旦定義會覆蓋這個屬性定義的值,否則就采用這里定義的值。
bdf2.uploader.localDirectoryFileProcessorDirectoryString
uploadfiles
如果采用LocalDirectory這個文件上傳處理器,那么該屬性就是定義文件上傳到服務(wù)端后該存放于哪個目錄下,默認為uploadfiles,表示將存放到應(yīng)用所在目錄的WEB-INF/uploadfiles目錄下,如果我們需要指定其它目錄,那么需要定義一個真實存在的目錄,比如定義值為D:\myuploadfiles,那么就表示上傳的文件放存放于D盤下的myuploadfiles目錄中。
bdf2.uploader.localDirectoryFileProcessorStorageMethod
String
month
文件存儲在目錄中時,子目錄的定義方式,這里支持三個值:year、month、day,分別表示按年、按年\月及按年\月\日這三種格式來劃分目錄存放上傳文件。默認為month,表示按年\月格式劃分目錄存放上傳文件。
bdf2.uploader.localDirectoryFileProcessorFileNameStorageMethod
String
uuid
上傳后文件命名方式,這里支持三種格式:hybrid、uuid及realName。hybrid表示文件在命名是將uuid+文件名這種混合方式命名;uuid則將直接采用uuid命名文件;而realName只是采用文件真實名稱。
bdf2.uploader.disableDatabaseFileProcessorboolean
false
是否禁用Database方式文件處理器,一旦禁用,運行時將不能使用。
bdf2.uploader.disableLocalDirectoryFileProcessorbooleanfalse是否禁用LocalDirectory方式文件處理器,一旦禁用,運行時將不能使用。
在BDF2-UPLOADER當中為了方便我們操作文件,還提供了兩個service,分別是IFileService及ILobStoreService。IFileService用于實現(xiàn)對上傳文件的各種,比如根據(jù)上文件的文件ID查找對應(yīng)的上傳文件對象、根據(jù)上傳文件ID查詢上傳的文件流等,其源碼如下:
IFileService源碼
package com.bstek.bdf2.uploader.service;
import java.io.InputStream;
import com.bstek.bdf2.uploader.model.UploadDefinition;
/**
 * @author Jacky.gao
 * @since 2013-5-12
 */
public interface IFileService {
 public static final String BEAN_ID="bdf2.uploader.fileService";
 UploadDefinition getUploadDefinition(String id);
 InputStream getFile(UploadDefinition definition);
 InputStream getFile(String id);
 void deleteUploadDefinition(String id);
}
對于這個service的實例獲取,我們可以通過ContextHolder.getBean(IFileService.BEAN_ID)來實現(xiàn),或者直接在Spring當中注入ID為bdf2.uploader.fileService的bean。

ILobStoreService則為我們提供了一個將文件存儲到BDF2-UPLOADER中特定的數(shù)據(jù)庫表的service,其源碼如下:
ILobStoreService接口源碼
package com.bstek.bdf2.uploader.service;
import java.io.InputStream;
import java.io.Reader;
import java.sql.SQLException;
/**
 * 大對象倉庫服務(wù)接口,對外提供二進制數(shù)據(jù),超長文本等的儲存、更新、取出等操作。
 * <p>
 * 這里的操作分為兩組:<br/>
 * <ol>
 *
<li>byte及binaryStream相關(guān)的為第一組,代表了對二進制數(shù)據(jù),如圖片、聲音、視頻等的操作,在數(shù)據(jù)庫中通常以B
LOB或IMAGE類型表示</li>
 *
<li>string、asciiString及characterStream相關(guān)的為第二組,代表了對大文本對象,如文本文件、新聞公告等的操作
,
 * 在數(shù)據(jù)庫中通常以CLOB或TEXT類型表示</li>
 * </ol>
 * 需要注意的是,不管為哪種類型的大對象,倉庫中均不允許其內(nèi)容為空,
若業(yè)務(wù)數(shù)據(jù)允許引用一個空對象,請將業(yè)務(wù)表中的允許為空的記錄的相關(guān)字段設(shè)置為NULL。<br/>
 * 對于不再需要的大對象,請及時使用delete*函數(shù)清理,以免造成空間的浪費。<br/>
 * 此接口中的所有函數(shù)均不能保證一定能完成指定的操作,請在使用時處理拋出的異常<br/>
 * </p>
 * @author jacky.gao@bstek.com
 * @since 2.0
 */
public interface ILobStoreService {
 /**
 * 保存一個byte數(shù)組,并返回它在倉庫中的主鍵。
 * 
 * @param content
 * 需要保存的內(nèi)容,不能為空
 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getBytes(String)}取得倉庫中的內(nèi)容
 * @throws SQLException
 * 將byte數(shù)組保存到數(shù)據(jù)庫時可能拋出此異常
 */
 String storeBytes(byte[] content) throws SQLException;
 /**
 * 保存一個byte數(shù)組,并返回它在倉庫中的主鍵。
 * @param content 需要保存的內(nèi)容,不能為空
 * @param id 需要保存的內(nèi)容的ID
 * @throws SQLException
 * 將byte數(shù)組保存到數(shù)據(jù)庫時可能拋出此異常
 */
 void storeBytes(byte[] content,String id) throws SQLException;
 /**
 * 根據(jù)內(nèi)容在倉庫中的主鍵,刪除對應(yīng)的記錄。
 * 
 * @param id
 * 需要刪除的內(nèi)容在倉庫中的主鍵
 * @throws SQLException
 * 在從數(shù)據(jù)庫中刪除數(shù)據(jù)時可能拋出此異常;
此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。
 */
 void deleteBytes(String id) throws SQLException;
 /**
 * 更新主鍵所指的內(nèi)容。
 * <p>
 * 保證此內(nèi)容的名稱<font color="red">不</font>變。
 * </p>
 * 
 * @param id
 * 需要被更新的內(nèi)容的主鍵
 * @param content
 * 新的值
 * @throws SQLException
 * 
在更新數(shù)據(jù)庫的過程中可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。
 */
 void updateBytes(String id, byte[] content) throws SQLException;
 /**
 * 根據(jù)主鍵查詢內(nèi)容,若未找到,返回<code>null</code>。
 * 
 * @param id
 * 內(nèi)容的主鍵,通常由業(yè)務(wù)記錄中的某一字段保有
 * @return 與主鍵相對應(yīng)的內(nèi)容
 * @throws SQLException
 * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 byte[] getBytes(String id) throws SQLException;
 /**
 * 保存一個二進制數(shù)據(jù)流中的數(shù)據(jù),并返回其在倉庫中的主鍵。
 * 
 * @param inputStream
 * 需要保存的內(nèi)容,不能為空
 * @param contentLength
 * 內(nèi)容的長度。如若保存一個{@link java.io.File}對象,則通常此長度由
 * {@link java.io.File#length}取得
 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getBinaryStream(String)}取得倉庫中的內(nèi)容
 * @throws SQLException
 */
 String storeBinaryStream(InputStream inputStream, int contentLength) throws SQLException;
 /**
 * 保存一個二進制數(shù)據(jù)流中的數(shù)據(jù),并返回其在倉庫中的主鍵。
 * 
 * @param inputStream
 * 需要保存的內(nèi)容,不能為空
 * @param contentLength
 * 內(nèi)容的長度。如若保存一個{@link java.io.File}對象,則通常此長度由
 * {@link java.io.File#length}取得
 * @param id
 * 需要保存的內(nèi)容ID
 * @throws SQLException
 */
 void storeBinaryStream(InputStream inputStream, int contentLength,String id) throws SQLException;
 /**
 * 根據(jù)內(nèi)容在倉庫中的主鍵,刪除對應(yīng)的記錄。
 * 
 * @param id
 * 需要被刪除的內(nèi)容的主鍵
 * @throws SQLException
 * 
在刪除數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。
 */
 void deleteBinaryStream(String id) throws SQLException;
 /**
 * 更新指定主鍵代表的內(nèi)容。
 * <p>
 * 保證此內(nèi)容的名稱<font color="red">不</font>變。
 * </p>
 * 
 * @param id
 * 需要被更新的內(nèi)容的主鍵
 * @param inputStream
 * 用于更新內(nèi)容的二進制輸入流
 * @param contentLength
 * 二進制輸入流的長度
 * @throws SQLException
 * 
在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
 */
 void updateBinaryStream(String id, InputStream inputStream,
 int contentLength) throws SQLException;
 /**
 * 根據(jù)主鍵取得內(nèi)容的二進制輸入流,若未找到,返回<code>null</code>。
 * 
 * @param id
 * 需要查詢的內(nèi)容的主鍵
 * @return 代表內(nèi)容的二進制輸入流
 * @throws SQLException
 * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常
 */
 InputStream getBinaryStream(String id) throws SQLException;
 /**
 * 保存一個超長的字符串,并返回其在倉庫中的主鍵。
 * 
 * @param content
 * 需要保存的內(nèi)容。
 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getString(String)}取得倉庫中的內(nèi)容
 * @throws SQLException
 * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 String storeString(String content) throws SQLException;
 /**
 * 保存一個超長的字符串,并返回其在倉庫中的主鍵。
 * 
 * @param content 需要保存的內(nèi)容。
 * @param id 需要保存的內(nèi)容ID。
 * @throws SQLException
 * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 void storeString(String content,String id) throws SQLException;
 /**
 * 根據(jù)內(nèi)容在倉庫中的主鍵刪除對應(yīng)的記錄。
 * 
 * @param id
 * 需要刪除的內(nèi)容在倉庫中的主鍵
 * @throws SQLException
 * 
在從數(shù)據(jù)庫中刪除記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
 */
 void deleteString(String id) throws SQLException;
 /**
 * 更新指定的主鍵代表的內(nèi)容。
 * 
 * @param id
 * 需要更新的內(nèi)容的主鍵
 * @param content
 * 用于更新的值
 * @throws SQLException
 * 
在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。
 */
 void updateString(String id, String content) throws SQLException;
 /**
 * 根據(jù)主鍵查詢其在倉庫中的內(nèi)容,若未找到,返回<code>null</code>。
 * 
 * @param id
 * 需要查詢的內(nèi)容的主鍵
 * @return 代表查詢內(nèi)容的字符串
 * @throws SQLException
 * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常
 */
 String getString(String id) throws SQLException;
 /**
 * 保存一個字節(jié)流,并返回其在倉庫中的主鍵。
 * 
 * @param asciiSrteam
 * 需要保存到倉庫中的字節(jié)流。
 * @param contentLength
 * 字節(jié)流的長度。
 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getAsciiStream(String)}取得倉庫中的內(nèi)容
 * @throws SQLException
 * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 String storeAsciiStream(InputStream asciiSrteam, int contentLength)
 throws SQLException;
 /**
 * 保存一個字節(jié)流,并返回其在倉庫中的主鍵。
 * 
 * @param asciiSrteam
 * 需要保存到倉庫中的字節(jié)流。
 * @param contentLength
 * 字節(jié)流的長度。
 * @param id 保存的ID
 * @throws SQLException
 * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 void storeAsciiStream(InputStream asciiSrteam, int contentLength,String id)
 throws SQLException;
 /**
 * 根據(jù)內(nèi)容在倉庫中的主鍵刪除對應(yīng)的記錄。
 * 
 * @param id
 * 需要刪除的內(nèi)容在倉庫中的主鍵
 * @throws SQLException
 * 
在從數(shù)據(jù)庫中刪除記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
 */
 void deleteAsciiStream(String id) throws SQLException;
 /**
 * 更新指定的主鍵代表的內(nèi)容。
 * 
 * @param id
 * 需要更新的內(nèi)容的主鍵
 * @param asciiStream
 * 用于更新的字節(jié)流
 * @param contentLength
 * 字節(jié)流的長度
 * @throws SQLException
 * 
在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
 */
 void updateAsciiStream(String id, InputStream asciiStream,
115
 int contentLength) throws SQLException;
 /**
 * 根據(jù)主鍵查詢其在倉庫中的內(nèi)容,若未找到,返回<code>null</code>。
 * 
 * @param id
 * 需要查詢的內(nèi)容的主鍵
 * @return 代表內(nèi)容的字節(jié)流
 * @throws SQLException
 * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常
 */
 InputStream getAsciiStream(String id) throws SQLException;
 /**
 * 保存一個字符流,并返回其在倉庫中的主鍵。
 * 
 * @param reader
 * 需要保存的字符流
 * @param contentLength
 * 字符流的長度
 * @return 保存后的內(nèi)容在倉庫中的主鍵,稍后可通過{@link #getCharacterStream(String)}取得倉庫中的內(nèi)容
 * @throws SQLException
 * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 String storeCharacterStream(Reader reader, int contentLength)
 throws SQLException;
 /**
 * 保存一個字符流,并返回其在倉庫中的主鍵。
 * 
 * @param reader
 * 需要保存的字符流
 * @param contentLength
 * 字符流的長度
 * @param reader
 * 需要保存的字符流ID
 * @throws SQLException
 * 在將內(nèi)容保存到數(shù)據(jù)庫的過程中可能拋出此異常。
 */
 void storeCharacterStream(Reader reader, int contentLength,String id)
 throws SQLException;
 /**
 * 根據(jù)內(nèi)容在倉庫中的主鍵刪除對應(yīng)的記錄。
 * 
 * @param id
 * 需要刪除的內(nèi)容在倉庫中的主鍵
 * @throws SQLException
 * 
在從數(shù)據(jù)庫中刪除記錄時可能拋出此異常;此外,如果刪除不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
 */
 void deleteCharacterStream(String id) throws SQLException;
 /**
 * 更新指定的主鍵代表的內(nèi)容。
 * 
 * @param id
 * 需要更新的內(nèi)容的主鍵
 * @param reader
 * 用于更新的字符流
 * @param contentLength
 * 字符流的長度
 * @throws SQLException
 * 
在更新數(shù)據(jù)庫中的記錄時可能拋出此異常;此外,如果更新不成功,如與主鍵對應(yīng)的記錄不存在,也拋出此異常。;
 */
 void updateCharacterStream(String id, Reader reader,
 int contentLength) throws SQLException;
 /**
 * 根據(jù)主鍵查詢其在倉庫中的內(nèi)容,若未找到,返回<code>null</code>。
 * 
 * @param id
 * 需要查詢的內(nèi)容的主鍵
 * @return 代表內(nèi)容的字符流
 * @throws SQLException
 * 在查詢數(shù)據(jù)庫的過程中可能拋出此異常
 */
 Reader getCharacterStream(String id) throws SQLException;
 /**
 * 服務(wù)ID,代表了其在spring中的beanName。
 */
 public static final String BEAN_ID = "bdf2.lobStoreService";
}
同樣對于這個service的實例獲取,我們可以通過ContextHolder.getBean(ILobStoreService.BEAN_ID)來實現(xiàn),或者直接在Spring當中注入ID為bdf2.lobStoreService的bean。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號