45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:mybatis oracle BLOB类型保存和读取的教程

mybatis oracle BLOB类型保存和读取的教程

2015-11-07 07:18:53 来源:www.45fan.com 【

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

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


本文地址:http://www.45fan.com/a/question/27121.html
Tags: 深入 浅析 mybatis
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部