网络编程
位置:首页>> 网络编程>> 数据库>> 深入浅析mybatis oracle BLOB类型字段保存与读取

深入浅析mybatis oracle BLOB类型字段保存与读取

作者:烟火_  发布时间:2024-01-15 02:21:26 

标签: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代码如下:


<?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字段代码


/**
   * 附件上传
   *
   * @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字段


/**
   * 下载附件
   *
   * @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字段,并写入成输出流。

0
投稿

猜你喜欢

  • Lambda函数,即Lambda 表达式(lambda expression),是一个匿名函数(不存在函数名的函数),Lambda表达式基于
  • 问题你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢?解决方案如果你可以用单个代码块处理不同的异
  • 百度语音对上传的语音要求目前必须是单声道,16K采样率,采样深度可以是16位或者8位的PCM编码。其他编码输出的语音识别不出来。语音的处理技
  • 本文实例讲述了python创建关联数组(字典)的方法。分享给大家供大家参考。具体分析如下:关联数组在python中叫字典,非常有用,下面是定
  • 除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库
  • 0、干货先写在前1、前端传值的数据必须使用JSON.stringify()传化2、后端,通过request.body接收数据,直接使用jso
  • 用DIV+CSS可以作出很多不同形状的角形;以下我只写了几个;CSS没有优化;是为了让大家看得更清一些;以下是一些小三角的形状:这是第一个小
  • 将数据写入Excel文件中,用python实现起来非常的简单,下面一步步地教大家。一、导入excel表格文件处理函数import xlwt注
  • 关于建立索引的几个准则:1、合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。2、索引越多,更新数据的速度越慢
  • 1、前言由于笔者并未系统地学习过Python,对Python某些底层的实现细节一概不清楚,以至于在实际使用的时候会写出一些奇奇怪怪的Bug(
  • 一、背景在平时的软件开发过程中常常会有这样的场景,自己负责的某个模块会依赖其他模块或者第三方的library。这时你自己的模块是一个独立的代
  • 1. 问题描述对右图进行修改:请更换图形的风格请将 x 轴的数据改为-10 到 10请自行构造一个 y 值的函数将直方图上的数字,位置改到柱
  • 一、数据降维机器学习中的维度就是特征的数量,降维即减少特征数量。降维方式有:特征选择、主成分分析。1.特征选择当出现以下情况时,可选择该方式
  • 首先以支持向量机模型为例先导入需要使用的包,我们将使用roc_curve这个函数绘制ROC曲线!from sklearn.svm impor
  • python ThreadPoolExecutor线程池的工作线程中出现异常时,主线程不会捕获异常。解决方法1:直接在需要执行的任务方法中添
  • 单下划线单下划线用作变量最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用。为了方便理解,_可以看作被丢弃的变量
  • 本文实例讲述了Python Web编程之WSGI协议。分享给大家供大家参考,具体如下:WSGI简介Web框架和Wen服务器之间需要进行通信,
  • server application error--IIS故障故障现象:Server Application Error The serve
  • 前言分析目标网站的登录方式目标地址: https://github.com/login   登录方式做出分析:
  • 在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留。对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直
手机版 网络编程 asp之家 www.aspxhome.com