天天看點

mybatis mysql clob_深入淺析mybatis oracle BLOB類型字段儲存與讀取

一、BLOB字段

BLOB是指二進制大對象也就是英文Binary Large Object的所寫,而CLOB是指大字元對象也就是英文Character Large Object的所寫。其中BLOB是用來存儲大量二進制資料的;CLOB用來存儲大量文本資料。BLOB通常用來儲存圖檔、檔案等二進制類型的資料。

二、使用mybatis操作blob

1、表結構如下:

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、實體代碼如下:

package com.test.entity;

import java.sql.Clob;

public class BlobField {

private String tabName;// 表名

private String tabPkidValue;// 主鍵值

private String blobColName;// 列名

private byte[] blobColValue;// 列值 clob類型

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代碼如下:

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

SELECT

FROM BLOB_FIELD a

WHERE a.ID = #{id}

SELECT

FROM BLOB_FIELD a

INSERT INTO BLOB_FIELD(

ID ,

TAB_NAME ,

TAB_PKID_VALUE ,

BLOB_COL_NAME ,

BLOB_COL_VALUE

) VALUES (

#{id},

#{tabName},

#{tabPkidValue},

#{blobColName},

#{blobColValue,jdbcType=BLOB}

)

UPDATE BLOB_FIELD SET

TAB_NAME = #{tabName},

TAB_PKID_VALUE = #{tabPkidValue},

BLOB_COL_NAME = #{blobColName},

BLOB_COL_VALUE = #{blobColValue}

WHERE ID = #{id}

DELETE FROM BLOB_FIELD

WHERE ID = #{id}

3、controller代碼如下:

a、儲存BLOB字段代碼

@RequiresPermissions("exc:exceptioninfo:feedback")

@RequestMapping(value = "attachment", method = RequestMethod.POST)

@ResponseBody

public Map uploadAttachment(@RequestParam(value = "testId", required = true) String testId,

HttpServletRequest request)

throws UnsupportedEncodingException {

Map result = new HashMap();

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

// 獲得檔案

MultipartFile multipartFile = multipartRequest.getFile("Filedata");// 與前端設定的fileDataName屬性值一緻

String filename = multipartFile.getOriginalFilename();// 檔案名稱

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字段

@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的亂碼問題

String fileName = new String(bytes, "ISO--");

// 設定輸出的格式

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();

//寫到輸出流

out.write(contents);

out.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

本例子将檔案上傳并儲存到BLOB類型字段字段,下載下傳的時候讀取BLOB字段,并寫入成輸出流。

以上就是本文的全部叙述,希望對大家有所幫助。