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>
于是大功告成,既可以显示图片,也可以实现文件下载,呵呵呵