侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

数据库  /  管理员 发布于 6年前   226

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

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


  • 上一条:
    oracle数据库优化辅助SQL语句
    下一条:
    oracle适配器连接不上的解决办法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客