热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

深入浅析mybatisoracleBLOB类型字段保存与读取

本文给大家浅析mybatisoracleblob类型字段的保存与读取,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代码如下:

 <&#63;xml version="." encoding="UTF-" &#63;>
 
 
   
     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
   
   
   
   
    
   
     INSERT INTO BLOB_FIELD(
     ID ,
     TAB_NAME ,
     TAB_PKID_VALUE ,
     BLOB_COL_NAME ,
     BLOB_COL_VALUE
     ) VALUES (
     #{id},
     #{tabName},
     #{tabPkidValue},
     #{blobColName},
     #{blobColValue,jdbcType=BLOB}
     )
   
   
     UPDATE BLOB_FIELD SET
     TAB_NAME = #{tabName},
     TAB_PKID_VALUE = #{tabPkidValue},
     BLOB_COL_NAME = #{blobColName},
     BLOB_COL_VALUE = #{blobColValue}
     WHERE ID = #{id}
   
   
     DELETE FROM BLOB_FIELD 
     WHERE ID = #{id}
   
 

  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 uploadAttachment(@RequestParam(value = "testId", required = true) String testId, 
 
 HttpServletRequest request)
       throws UnsupportedEncodingException {
     Map result = new HashMap();
 
     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") &#63; 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字段,并写入成输出流。

以上就是本文的全部叙述,希望对大家有所帮助。


推荐阅读
  • 使用原生 AJAX 处理文件下载与 IE 浏览器图片显示问题
    本文探讨了如何利用原生 AJAX 实现文件的 POST 或 GET 请求下载,并监控下载状态。同时,针对 IE 浏览器及部分移动设备浏览器因路径问题导致图片无法正常显示的情况,提供了有效的解决方案。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
  • 本文基于作者使用Flask框架处理后端逻辑和原生JavaScript及jQuery进行前端开发的经验,详细介绍了如何在前后端之间高效地传输JSON数据。文章不仅涵盖了技术实现细节,还提供了实用的代码示例。 ... [详细]
  • 探索PWA H5 Web App优化之路(Service Worker与Lighthouse的应用)
    本文探讨了如何通过Service Worker和Lighthouse工具来优化PWA H5 Web App,旨在提升用户体验,包括提高加载速度、增强离线访问能力等方面。 ... [详细]
author-avatar
mobiledu2502881513
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有