各位用户为了找寻关于深入浅析mybatis oracle BLOB类型字段保存与读取的资料费劲了很多周折。这里教程网为您整理了关于深入浅析mybatis oracle BLOB类型字段保存与读取的相关资料,仅供查阅,以下为您介绍关于深入浅析mybatis oracle BLOB类型字段保存与读取的详细内容

一、BLOB字段

  BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写。其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。BLOB通常用来保存图片、文件等二进制类型的数据。

二、使用mybatis操作blob

  1、表结构如下:

? 1 2 3 4 5 6 7 8 9 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 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代码如下:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <?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字段代码

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 /**     * 附件上传     *     * @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字段

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 /**    * 下载附件    *    * @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字段,并写入成输出流。

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