mybatis oracle BLOB类型字段保存与读取

简介: 一、BLOB字段   BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。

一、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、实体代码如下:

 1 package com.test.entity;
 2 
 3 import java.sql.Clob; 
 4 
 5 /**
 6  * 大字段 
 7  */
 8 public class BlobField { 
 9 
10     private String tabName;// 表名
11     private String tabPkidValue;// 主键值
12     private String blobColName;// 列名
13     private byte[] blobColValue;// 列值 clob类型
14 
15     public String getTabName() {
16         return tabName;
17     }
18 
19     public void setTabName(String tabName) {
20         this.tabName = tabName;
21     }
22 
23     public String getTabPkidValue() {
24         return tabPkidValue;
25     }
26 
27     public void setTabPkidValue(String tabPkidValue) {
28         this.tabPkidValue = tabPkidValue;
29     }
30 
31     public String getBlobColName() {
32         return blobColName;
33     }
34 
35     public void setBlobColName(String blobColName) {
36         this.blobColName = blobColName;
37     }
38 
39     public byte[] getBlobColValue() {
40         return blobColValue;
41     }
42 
43     public void setBlobColValue(byte[] blobColValue) {
44         this.blobColValue = blobColValue;
45     }
46 
47 }

  3、mybatis sql代码如下:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.test.dao.BlobFieldDao">
 4 
 5     <sql id="blobFieldColumns">
 6         a.ID AS id,
 7         a.TAB_NAME AS tabName,
 8         a.TAB_PKID_VALUE AS tabPkidValue,
 9         a.BLOB_COL_NAME AS blobColName,
10         a.BLOB_COL_VALUE AS blobColValue
11     </sql>
12 
13     <sql id="blobFieldJoins">
14     </sql>
15 
16     <select id="get" resultType="blobField">
17         SELECT
18         <include refid="blobFieldColumns" />
19         FROM BLOB_FIELD a
20         <include refid="blobFieldJoins" />
21         WHERE a.ID = #{id}
22     </select>
23 
24     <select id="findList" resultType="blobField">
25         SELECT
26         <include refid="blobFieldColumns" />
27         FROM BLOB_FIELD a
28         <include refid="blobFieldJoins" />
29     </select> 
30 
31     <insert id="insert">
32         INSERT INTO BLOB_FIELD(
33         ID ,
34         TAB_NAME ,
35         TAB_PKID_VALUE ,
36         BLOB_COL_NAME ,
37         BLOB_COL_VALUE
38         ) VALUES (
39         #{id},
40         #{tabName},
41         #{tabPkidValue},
42         #{blobColName},
43         #{blobColValue,jdbcType=BLOB}
44         )
45     </insert>
46 
47     <update id="update">
48         UPDATE BLOB_FIELD SET
49         TAB_NAME = #{tabName},
50         TAB_PKID_VALUE = #{tabPkidValue},
51         BLOB_COL_NAME = #{blobColName},
52         BLOB_COL_VALUE = #{blobColValue}
53         WHERE ID = #{id}
54     </update>
55     <delete id="delete">
56         DELETE FROM BLOB_FIELD 
57         WHERE ID = #{id}
58     </delete>
59     
60 </mapper>

  3、controller代码如下:

  a、保存BLOB字段代码

 1 /**
 2      * 附件上传
 3      * 
 4      * @param testId
 5      *            主表Id
 6      * @param request
 7      * @return
 8      * @throws UnsupportedEncodingException
 9      */
10     @RequiresPermissions("exc:exceptioninfo:feedback")
11     @RequestMapping(value = "attachment", method = RequestMethod.POST)
12     @ResponseBody
13     public Map<String, Object> uploadAttachment(@RequestParam(value = "testId", required = true) String testId, 
14 
15 HttpServletRequest request)
16             throws UnsupportedEncodingException {
17         Map<String, Object> result = new HashMap<String, Object>();
18 
19         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
20         // 获得文件
21         MultipartFile multipartFile = multipartRequest.getFile("Filedata");// 与前端设置的fileDataName属性值一致
22         String filename = multipartFile.getOriginalFilename();// 文件名称
23         InputStream is = null;
24         try {
25             //读取文件流
26             is = multipartFile.getInputStream();
27             byte[] bytes = FileCopyUtils.copyToByteArray(is);
28             BlobField blobField = new BlobField();
29             blobField.setTabName("testL");
30             blobField.setTabPkidValue(testId);
31             blobField.setBlobColName("attachment");
32             blobField.setBlobColValue(bytes);
33             //保存blob字段
34             this.testService.save(blobField, testId, filename);
35             result.put("flag", true);
36             result.put("attachmentId", blobField.getId());
37             result.put("attachmentName", filename);
38         } catch (IOException e) {
39             e.printStackTrace();
40             result.put("flag", false);
41         } finally {
42             IOUtils.closeQuietly(is);
43         }
44         return result;
45     }    

  b、读取BLOB字段

 1 /**
 2      * 下载附件
 3      * 
 4      * @param attachmentId
 5      * @return
 6      */
 7     @RequiresPermissions("exc:exceptioninfo:view")
 8     @RequestMapping(value = "download", method = RequestMethod.GET)
 9     public void download(@RequestParam(value = "attachmentId", required = true) String attachmentId,
10             @RequestParam(value = "attachmentName", required = true) String attachmentName, HttpServletRequest 
11 
12 request, HttpServletResponse response) {
13         ServletOutputStream out = null;
14         try {
15             response.reset();
16             String userAgent = request.getHeader("User-Agent");
17             byte[] bytes = userAgent.contains("MSIE") ? attachmentName.getBytes() : attachmentName.getBytes("UTF-
18 
19 8"); // fileName.getBytes("UTF-8")处理safari的乱码问题
20             String fileName = new String(bytes, "ISO-8859-1");
21             // 设置输出的格式
22             response.setContentType("multipart/form-data");
23             response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(attachmentName, 
24 
25 "UTF-8"));
26             BlobField blobField = this.blobFieldService.get(attachmentId);
27             //获取blob字段
28             byte[] contents = blobField.getBlobColValue();
29             out = response.getOutputStream();
30             //写到输出流
31             out.write(contents);
32             out.flush();
33         } catch (IOException e) {
34             e.printStackTrace();
35         }
36     }                                

  本例子将文件上传并保存到BLOB类型字段字段,下载的时候读取BLOB字段,并写入成输出流。

目录
相关文章
|
3月前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
63 0
|
1天前
|
分布式计算 Oracle 关系型数据库
实时计算 Flink版产品使用问题之获取Oracle的数据时无法获取clob类型的数据,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
29天前
|
存储 Oracle 关系型数据库
|
1月前
|
SQL Oracle 关系型数据库
关系型数据库Oracle备份类型
【7月更文挑战第18天】
33 2
|
1月前
|
Oracle 关系型数据库 Java
mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
|
2月前
|
SQL 数据采集 Oracle
实时计算 Flink版产品使用问题之如何读取oracle中的blob类型的数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
|
3月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在 DataWorks 中,使用Oracle作为数据源进行数据映射和查询,如何更改数据源为MaxCompute或其他类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
49 1
|
3月前
|
Oracle 关系型数据库 数据安全/隐私保护
oracle 19c 密码字段
oracle 19c 密码字段
43 0
|
4天前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。