首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

webwork+spring+ibatis成功的存取BLOB字段

2012-10-10 
webwork+spring+ibatis顺利的存取BLOB字段分两步走的:1,先把文件拿到webwork的action里面。这个我想了许多

webwork+spring+ibatis顺利的存取BLOB字段
分两步走的:

1,先把文件拿到webwork的action里面。

这个我想了许多办法,多半是因为自己无知吧,先是给文件的属性设置为byte[],页面上则是<input type="file" name="report.data">,这样提交到action里面时,通过request死活拿不到文件数据,伤心了一会,上网google,终于找到一段有价值的文字,可能是robbin的原话,在action里面定义一个 java.io.File类型的变量,名字对应你的页面中的HTML标记<input type="file" name="XXX" />,这样在Action中就可以直接通过这个File对象进行文件内容的读取了,这可以用webwork自带的 FileUploadInterceptor来实现,要注意的是需要在action中配置一下,而且fileUpload拦截器要放在parameter 拦截器前面。嗯,喜滋滋的配之。大问题来了!!uploadManager业务类总是不能实例化,一点提交按钮,就会毫不犹豫的抛出一个 nullPointException出来,更伤心了,检查了约有2-3个小时,eclipse重启n遍,脾气也火爆起来了……最后,在同事的提醒下,很不好意思的发现,在配置了FileUploadInterceptor和parameter拦截器之后,以前action共用的自动装配拦截器就给屏蔽了,这样spring就不会帮我把uploadManager给实例化……晕倒,加上autowire拦截器之后,ok,文件数据顺利到达action。

<action name="submitReport"
   method="submit">
   <result name="success" type="redirect">
    /pages/intoReport.action
   </result>
   <interceptor-ref name="fileUpload"></interceptor-ref>
   <interceptor-ref name="params"></interceptor-ref>
   <interceptor-ref name="autowireDefault"></interceptor-ref>
  </action>

2,然后就要想办法把文件送到数据库了。

这里我先是参考http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+use+a+Custom+Type+Handler+with+a+BLOB+or+CLOB%3F这里提供的方法试了一下,发现上传的文件大小果然有限制,最大为4k!!My god!赶紧放弃了……看来pojo里文件的属性不能设置为byte[]了……还是改oracle.sql.BLOB吧……

这样就出现了oracle.sql.BLOB+ibatis如何实现大文件存取的问题。我的POJO为
  /**
     * 主键ID
     */
    private String id;

  /**
     * 取得主键
     * @return Returns the id.
     */
    public String getId() {
        return id;
    }
   
  /**
     * 设置主键
     * @param id The id to set.
     */
    public void setId(String id) {
        this.id = id;
    }

  /**
     * 二进制文件数据
     */
    private BLOB data;


/**
    * 获得二进制文件数据
    * @return
    */
   public BLOB getData() {
       return this.data;
   }
  
  /**
    * 设置二进制文件数据
    * @param data
    */
   public void setData(BLOB data) {
       this.data = data;
   }

先是参考http://blog.csdn.net/rosen/archive/2005/02/18/293151.aspx里提到的方法。对应的sql-map写成了

<resultMap id="ReportResult">
         <result column="id" property="id" />
         <result column="name" property="name" />
         <result column="data" property="data"         typeHandler="com.ibatis.sqlmap.engine.type.BlobTypeHandlerCallback"/>
</resultMap>
来源:(http://blog.sina.com.cn/s/blog_48ca818701000825.html) - webwork+spring+ibatis顺利的存取BLOB字段(转)_别问我是谁_新浪博客

<select id="findReportById" parameterresultMap="ReportResult">
         SELECT  * FROM  TEST_REPORT
         WHERE id = #value#
         FOR UPDATE
</select>

<insert id="insertReportWithEmptyData" parametertype="stream">
    <param name="filename">${fileName}</param>
    <param name="contentDisposition">filename=${fileName}</param>
</result>

于是大功告成,既可以显示图片,也可以实现文件下载,呵呵呵

热点排行