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

   2015-11-09 1
核心提示:本文给大家浅析mybatis oracle blob类型字段的保存与读取,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举报 0 评论 1
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • mybatis批量增、删、改(更新)操作oracle和mys
    注:本文主要用来记录oracle和mysql数据库在使用mybatis的情况下批量增、删、改(更新)的常用写法一、批量插入1、oracle写法:insert         insert into b_dbgl_zaixcs (zaixcsid, mingc, pingsyid, xinxid, fujid, jieg, pingfjg, pingf, zhuangt, s
    02-10
  • mybatis的报错总结_____2Error updating database.  Cause: java.sql.SQLSyntaxErrorException: You have an err
    mybatis的报错总结_____2Error updating databa
    在编写动态sql时 trim的属性写错了,如下图:错误示范:(接口的xml配置文件中:)1update id="modifyBill" parameterType="Bill"2 update smbms_bill3 trim suffix="set" prefixOverrides="," prefix="where id=#{id}"4 if test="billCode!=null"
    02-10
  • 关于 mybatis-generator自定义注释生成  使用DefaultCommentGenerator重写来完成
    


            
Mybatis Generator的mo
    关于 mybatis-generator自定义注释生成 使用De
    项目里新建表时model,mapper以及mapper.xml基本都是用Mybatis Generator(以下简称为MBG)自动生成的,但是MBG自动生成的model的注释实在有点非人类,至少中国人是完全接受不了的,在配置中禁用掉注释吧,倒是简单了,可是生成的model类光秃秃的,啥都没有,字段方法没
    02-10
  • 解决Oracle+Mybatis批量插入报错:SQL 命令未正
    Mybatis批量插入需要foreach元素。foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名。(2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置。(3)collection:根据传入的参数值确定。(4)open:表示该语句以什么开
    02-10
  • mysql在spring+mybatis中出现value '0000-
    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp当日期字段在数据库中可为空,并且其默认值为“0000-00-0000:00:00”,在mysql中作为一个特殊值存在。但是java日期类型不认可转换抛出以上异常。解决方法:
    02-10
  • MyBatis Mapper.xml文件中 MySql的SQL语句比较
    lt;        小于号gt;      大于号amp;    和apos;    ’单引号quot;    " 双引号           MyBatis 中的 # 和 $ 的区别如下: #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传
    02-09
  • mybatis中mysql和oracle的差异
    mybatis中mysql和oracle的差异
    1、applicationContext.xml中的配置差异:在applicationContext.xml的数据源dataSource的配置中,mysql数据库需要心跳包的配置,而oracle中不需要,否则会报错 2、mybatis模糊查询中sql语句的差异mysql在使用concat拼接字符串时可以直接将三者【%、占位符、%
    02-09
  • mybatis 控制台打印出来的sql 执行结果为空 但
    mybatis中的sql如下select airln_Cd airlnCd,city_coordinate_j cityCoordinateJ,city_coordinate_w cityCoordinateWfrom airportinfonew where iATA=#{iATA} 我在请求的时候是这样加的参数 :/airportFlight/findAirportFlight/?iATA='WDS'  在参数上加了个
    02-09
  • MyBatis实践之动态SQL及关联查询
    MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了。本文给大家介绍MyBatis实践之动态SQL及关联查询,对mybatis动态sql相关知识感兴趣的朋友一起学习吧
  • MyBatis MapperProvider MessageFormat拼接批量
    这篇文章主要介绍了MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法的相关资料,需要的朋友可以参考下
点击排行