深入淺析mybatis oracle BLOB類(lèi)型字段保存與讀取
一、BLOB字段
BLOB是指二進(jìn)制大對(duì)象也就是英文Binary Large Object的所寫(xiě),而CLOB是指大字符對(duì)象也就是英文Character Large Object的所寫(xiě)。其中BLOB是用來(lái)存儲(chǔ)大量二進(jìn)制數(shù)據(jù)的;CLOB用來(lái)存儲(chǔ)大量文本數(shù)據(jù)。BLOB通常用來(lái)保存圖片、文件等二進(jìn)制類(lèi)型的數(shù)據(jù)。
二、使用mybatis操作blob
1、表結(jié)構(gòu)如下:
create table BLOB_FIELD ( ID VARCHAR2(64 BYTE) not null, TAB_NAME VARCHAR2(64 BYTE) not null, TAB_PKID_VALUE VARCHAR2(64 BYTE) not null, CLOB_COL_NAME VARCHAR2(64 BYTE) not null, CLOB_COL_VALUE CLOB, constraint PK_BLOB_FIELD primary key (ID) );
2、實(shí)體代碼如下:
package com.test.entity;
import java.sql.Clob;
/**
* 大字段
*/
public class BlobField {
private String tabName;// 表名
private String tabPkidValue;// 主鍵值
private String blobColName;// 列名
private byte[] blobColValue;// 列值 clob類(lèi)型
public String getTabName() {
return tabName;
}
public void setTabName(String tabName) {
this.tabName = tabName;
}
public String getTabPkidValue() {
return tabPkidValue;
}
public void setTabPkidValue(String tabPkidValue) {
this.tabPkidValue = tabPkidValue;
}
public String getBlobColName() {
return blobColName;
}
public void setBlobColName(String blobColName) {
this.blobColName = blobColName;
}
public byte[] getBlobColValue() {
return blobColValue;
}
public void setBlobColValue(byte[] blobColValue) {
this.blobColValue = blobColValue;
}
}
3、mybatis sql代碼如下:
<?xml version="." encoding="UTF-" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper .//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd">
<mapper namespace="com.test.dao.BlobFieldDao">
<sql id="blobFieldColumns">
a.ID AS id,
a.TAB_NAME AS tabName,
a.TAB_PKID_VALUE AS tabPkidValue,
a.BLOB_COL_NAME AS blobColName,
a.BLOB_COL_VALUE AS blobColValue
</sql>
<sql id="blobFieldJoins">
</sql>
<select id="get" resultType="blobField">
SELECT
<include refid="blobFieldColumns" />
FROM BLOB_FIELD a
<include refid="blobFieldJoins" />
WHERE a.ID = #{id}
</select>
<select id="findList" resultType="blobField">
SELECT
<include refid="blobFieldColumns" />
FROM BLOB_FIELD a
<include refid="blobFieldJoins" />
</select>
<insert id="insert">
INSERT INTO BLOB_FIELD(
ID ,
TAB_NAME ,
TAB_PKID_VALUE ,
BLOB_COL_NAME ,
BLOB_COL_VALUE
) VALUES (
#{id},
#{tabName},
#{tabPkidValue},
#{blobColName},
#{blobColValue,jdbcType=BLOB}
)
</insert>
<update id="update">
UPDATE BLOB_FIELD SET
TAB_NAME = #{tabName},
TAB_PKID_VALUE = #{tabPkidValue},
BLOB_COL_NAME = #{blobColName},
BLOB_COL_VALUE = #{blobColValue}
WHERE ID = #{id}
</update>
<delete id="delete">
DELETE FROM BLOB_FIELD
WHERE ID = #{id}
</delete>
</mapper>
3、controller代碼如下:
a、保存BLOB字段代碼
/**
* 附件上傳
*
* @param testId
* 主表Id
* @param request
* @return
* @throws UnsupportedEncodingException
*/
@RequiresPermissions("exc:exceptioninfo:feedback")
@RequestMapping(value = "attachment", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> uploadAttachment(@RequestParam(value = "testId", required = true) String testId,
HttpServletRequest request)
throws UnsupportedEncodingException {
Map<String, Object> result = new HashMap<String, Object>();
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 獲得文件
MultipartFile multipartFile = multipartRequest.getFile("Filedata");// 與前端設(shè)置的fileDataName屬性值一致
String filename = multipartFile.getOriginalFilename();// 文件名稱(chēng)
InputStream is = null;
try {
//讀取文件流
is = multipartFile.getInputStream();
byte[] bytes = FileCopyUtils.copyToByteArray(is);
BlobField blobField = new BlobField();
blobField.setTabName("testL");
blobField.setTabPkidValue(testId);
blobField.setBlobColName("attachment");
blobField.setBlobColValue(bytes);
//保存blob字段
this.testService.save(blobField, testId, filename);
result.put("flag", true);
result.put("attachmentId", blobField.getId());
result.put("attachmentName", filename);
} catch (IOException e) {
e.printStackTrace();
result.put("flag", false);
} finally {
IOUtils.closeQuietly(is);
}
return result;
}
b、讀取BLOB字段
/**
* 下載附件
*
* @param attachmentId
* @return
*/
@RequiresPermissions("exc:exceptioninfo:view")
@RequestMapping(value = "download", method = RequestMethod.GET)
public void download(@RequestParam(value = "attachmentId", required = true) String attachmentId,
@RequestParam(value = "attachmentName", required = true) String attachmentName, HttpServletRequest
request, HttpServletResponse response) {
ServletOutputStream out = null;
try {
response.reset();
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? attachmentName.getBytes() : attachmentName.getBytes("UTF-
"); // fileName.getBytes("UTF-")處理safari的亂碼問(wèn)題
String fileName = new String(bytes, "ISO--");
// 設(shè)置輸出的格式
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(attachmentName,
"UTF-"));
BlobField blobField = this.blobFieldService.get(attachmentId);
//獲取blob字段
byte[] contents = blobField.getBlobColValue();
out = response.getOutputStream();
//寫(xiě)到輸出流
out.write(contents);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
本例子將文件上傳并保存到BLOB類(lèi)型字段字段,下載的時(shí)候讀取BLOB字段,并寫(xiě)入成輸出流。
以上就是本文的全部敘述,希望對(duì)大家有所幫助。
相關(guān)文章
通過(guò)Navicat連接Oracle數(shù)據(jù)庫(kù)的詳細(xì)步驟
本文介紹如何通過(guò)Navicat 連接Oracle數(shù)據(jù)庫(kù),以往總是使用Oracle客戶(hù)端來(lái)連接Oracle數(shù)據(jù)庫(kù),但是Oracle客戶(hù)端一般有幾百M(fèi)的大小,而且安裝繁瑣配置麻煩,如果可以通過(guò)Navicat直接連接Oracle則會(huì)非常輕松方便,需要的朋友可以參考下2023-10-10
Win7 64位下PowerDesigner連接64位Oracle11g數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了Win7 64位下PowerDesigner連接64位Oracle11g數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Oracle中的定時(shí)任務(wù)實(shí)例教程
定時(shí)任務(wù)相信大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于Oracle中定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04
Oracle數(shù)據(jù)庫(kù)之PL/SQL使用流程控制語(yǔ)句
這篇文章介紹了Oracle數(shù)據(jù)庫(kù)之PL/SQL使用流程控制語(yǔ)句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
WMware redhat 5 oracle 11g 安裝方法
本文將詳細(xì)介紹WMware中redhat 5 安裝oracle 11g方法,需要的朋友可以參考下2012-12-12
Oracle SQL Developer腳本輸出中文顯示亂碼的解決方法
我們?cè)跍y(cè)試Oracle Select AI(自然語(yǔ)言查詢(xún)數(shù)據(jù)庫(kù))時(shí),發(fā)現(xiàn)Run Statement中文顯示正常,而Run Script中文顯示亂碼,所以本文給大家介紹了Oracle SQL Developer腳本輸出中文顯示亂碼的解決方法,需要的朋友可以參考下2024-05-05

