各位用户为了找寻关于深入浅析mybatis oracle BLOB类型字段保存与读取的资料费劲了很多周折。这里教程网为您整理了关于深入浅析mybatis oracle BLOB类型字段保存与读取的相关资料,仅供查阅,以下为您介绍关于深入浅析mybatis oracle BLOB类型字段保存与读取的详细内容
一、BLOB字段
BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。BLOB通常用来保存图片、文件等二进制类型的数据。
二、使用mybatis操作blob
1、表结构如下:
? 1 2 3 4 5 6 7 8 9create
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、实体代码如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35package 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代码如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53<?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字段代码
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45/**
* 附件上传
*
* @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"
);
// 与前端设置的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字段
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33/**
* 下载附件
*
* @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的乱码问题
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字段,并写入成输出流。
以上就是本文的全部叙述,希望对大家有所帮助。