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字段,并写入成输出流。

目录
相关文章
|
9月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
4月前
|
SQL Java 数据库连接
MyBatis的配置文件中定义类型别名(type aliases)的技巧。
类型别名提供了一种便捷的方式来引用复杂的全限定类名。通过使用 `<package>`标签进行自动扫描或使用 `<typeAlias>`标签手动指定,可以在整个MyBatis配置中提高清晰度和维护性。无论是简化mapper文件中的配置,还是提高整体的配置可读性,类型别名都是一个非常有用的配置工具。
183 0
|
9月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
|
9月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】oracle dblink varchar类型查询报错记录
这篇文章主要介绍了 Oracle DBLINK 查询崖山 DB 报错的相关内容,包括 ODBC 安装配置、数据源配置、dblink 环境配置、问题原因分析及规避方法。问题原因是 dblink 连接其他数据库时 varchar 类型转换导致的,还介绍了 long 类型限制、char 等类型区别,规避方法是修改参数 MAX_STRING_SIZE 支持 32K。
|
9月前
|
存储 Oracle 关系型数据库
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
|
11月前
|
Oracle 关系型数据库 数据库
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
329 10
|
11月前
|
SQL Java 数据库连接
Mybatis拦截器实现公共字段填充
通过使用MyBatis拦截器,可以实现对公共字段的自动填充,简化代码,提高开发效率。拦截器通过拦截SQL操作,在插入和更新操作时自动填充公共字段,使得开发者不再需要手动设置这些字段。本文详细介绍了实现步骤,并通过示例代码展示了具体实现方法,希望能为您的开发工作提供实用的指导和帮助。
632 13
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
1855 5
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
568 1
|
6月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1042 1
Spring boot 使用mybatis generator 自动生成代码插件

推荐镜像

更多