- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章深入浅析mybatis oracle BLOB类型字段保存与读取由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、BLOB字段 。
BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。BLOB通常用来保存图片、文件等二进制类型的数据.
2、使用mybatis操作blob 。
1、表结构如下:
1
2
3
4
5
6
7
8
9
|
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、实体代码如下:
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
|
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代码如下:
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字段,并写入成输出流.
以上就是本文的全部叙述,希望对大家有所帮助.
最后此篇关于深入浅析mybatis oracle BLOB类型字段保存与读取的文章就讲到这里了,如果你想了解更多关于深入浅析mybatis oracle BLOB类型字段保存与读取的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
很多朋友或许都有这个疑问,一个网站域名和网站的排名有关系吗?今天本文就从三个方面分析网站的域名与网站的排名有没有关系,希望对大家有一定的帮助。 1、全拼双拼域名 首先,我们要知道在这一点百
什么是进程 当一个程序进入内存中运行起来它就变为一个进程。因此,进程就是一个处于运行状态的程序。同时进程具有独立功能,进程是操作系统进行资源分配和调度的独立单位。 什么是线程 线程是进
最近几年,互联网络竞争异常激烈,各个企业为了增加业绩,都在网络销售中下足了功夫。要确定网站发展的方向,必须给自己的网站制定好一个发展目标,有了目标才能更好的发展。不管
一.基础知识准备: 1.层的原则: (1)每一层以接口方式供上层调用。 (2)上层只能调用下层。 (3)依赖分为松散交互和严格交互两种。 2.业务逻辑分类: (1)应
编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承、封装、多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用。 下面是服务器计算器代码:
对于策略模式的理解:当一个业务有多种需求时候,在某个时候需要使用不同的方式来计算结果。这时候不同的方式可以理解为不同的策略来解决同样的问题。 例如:商场收银系统计算价格,1:正常计算 2:商品打折计
随着 Kubernetes 在企业中应用的越来越广泛和普及,越来越多的公司在生产环境中运维多个集群。本文主要讲述一些关于多集群 Kubernetes 的思考,包括为什么选择多集群,多集群的好处以
Kubelet 出于对节点的保护,允许在节点资源不足的情况下,开启对节点上 Pod 进行驱逐的功能。最近对 Kubelet 的驱逐机制有所研究,发现其中有很多值得学习的地方,总结下来
以下分析不针对任何快递公司,纯属实说。 申通快递在快递行业中速度与费用都属于中等的水平,在国内也分布有很多投递点,一般地区都可以投递到;顺丰在国内是速度最快的快递公司之一,一般来说隔天就能够到,其
概述 流(streams)是PHP4.3版本引入的一个特性,主要是为了统一文件、sockets以及其他类似资源的工作方法。PHP4.3距今已经有很长时间了,但是很多程序员似乎都不能正确使用PHP中
Pre 很早在看 Jesse 的 Asp.net Core快速入门 的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重&q
之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下 lua的函数是一种 First-Class Value 的东西, 到底
1、什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性?首先,之前的接口是个双
信息数据传输的安全一直都是个很重要的话题,从刚开始当程序员时错以为MD5、SHA1这些哈希算法就是加密算法,到后来慢慢接触对称加密、非对称加密这些概念,再到对接各种大开发平台接口的时候看到他们通
前言 2021年,vanilla-extract 作为黑马登顶了 css-in-js 满意度榜首(虽然使用率仅为1%),号称是一个类型安全、高度兼容 TS 场景的库,国内相关讨论还很少,稍微看
(一)响应式数据 1. 简单例子 从最简单的数据绑定开始,在 Vue 2.0 中,我们这样将一个数据绑定到模板的指定位置: 在组件创建参数的 data 构造函数中返回一个用来绑定的数据对象,其
我是一名优秀的程序员,十分优秀!