- 浏览: 668183 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (364)
- quick start (57)
- bboss aop (43)
- bboss mvc (48)
- bboss persistent (96)
- bboss taglib (30)
- bboss event (10)
- bbossgroups (52)
- bboss (32)
- bboss会话共享 (17)
- bboss rpc (7)
- bboss 国际化 (5)
- bboss 序列化 (9)
- bboss cxf webservice (8)
- bboss hessian (3)
- bboss 安全认证SSO (15)
- bboss 工作流 (6)
- 平台 (18)
- bboss quartz (3)
- 杂谈 (5)
- 大数据 (1)
- bboss elastic (24)
- bboss http (1)
- bboss kafka (1)
- Elasticsearch Scroll和Slice Scroll查询API使用案例 (1)
最新评论
-
qianhao123:
...
采用gradle构建和发布bboss方法介绍 -
qianhao123:
[img][/img]
采用gradle构建和发布bboss方法介绍 -
yin_bp:
欢迎大家参与working
高性能elasticsearch ORM开发库使用介绍 -
qq641879434:
万分感谢
bboss 持久层sql xml配置文件编写和加载方法介绍 -
yin_bp:
qq641879434 写道怎么设置配置文件 可以查看执行的S ...
bboss 持久层sql xml配置文件编写和加载方法介绍
在上一篇文章《bboss mvc文件上传下载实战演练》
http://yin-bp.iteye.com/blog/1130035
中介绍了采用bboss mvc、aop/ioc、persistent组合完成文件上传、存储到数据库、从数据库中下载文件的基本功能,我们看到了如何通过MultipartHttpServletRequest获取上传文件,如何通过SQLExecutor/ConfigSQLExecutor中操作blob字段的api存储和读取文件的基本功能:
FieldRowHandler(获取blob为文件的字段行处理器)
NullRowHandler
本文作为上篇的进阶补充,介绍直接绑定MultipartFile对象或者MultipartFile数组到控制其方法参数或者po对象属性的案例。
对应的eclipse工程和运行demo可在本文的附件中下载:
http://dl.iteye.com/topics/download/c7393bc6-b8ee-3dd5-b4b3-e969ea63dbc0
demo工程中包含了derby数据库文件目录database,部署到tomcat中运行之前需要修改/src/poolman.xml文件中dburl路径为相应物理路径的下的database/cimdb,编译后即可。
启动tomcat, 访问的地址还是:
http://localhost:8080/bbossupload/upload/main.page
第一部分 本文的技术要点:
1. 控制器方法参数绑定机制增加MultipartFile、MultipartFile[]类型绑定支持,可以和RequestParam注解一起使用,也可以直接使用(默认获取第一个input[file]域对应的附件),使用方法如下:
public String uploadFileWithMultipartFile(@RequestParam(name="upload1") MultipartFile file,
ModelMap model)
public String uploadFileWithMultipartFiles(@RequestParam(name="upload1") MultipartFile[] files,
ModelMap model)
public String uploadFileWithMultipartFile( MultipartFile file,
ModelMap model)
public String uploadFileWithMultipartFiles(MultipartFile[] files,
ModelMap model)
2. PO对象属性数据绑定机制增加MultipartFile、MultipartFile[]类型绑定支持,可以和RequestParam注解一起使用,也可以直接与属性名称直接绑定,使用方法如下:
public String uploadFileWithFileBean(FileBean files)
FileBean是一个自定义的java bean,结构如下:
3. 改进的SQLParams api,可以直接对MultipartFile对象存入clob或者blob列。
sqlparams.addSQLParam("FILECONTENT", multipartfile,SQLParams.BLOBFILE);
对于大字段的处理建议采用以下方法:
sqlparams.addSQLParam("FILECONTENT", multipartfile,SQLParams.BLOBFILE);//直接传递MultipartFile对象进行插入
sqlparams.addSQLParam("FILECONTENT", inputStream, size,SQLParams.BLOBFILE);//直接传递InputStream对象以及流大小Size属性进行插入
一个完整的插入大字段的实例:
或者
4. FieldRowHandler处理器,实现从blob/clob中获取单个字段文件对象的处理,其他类似类型数据也可以使用FieldRowHandler,使用示例如下:
第二部分 相关的实现细节
由于上篇文章已经详细介绍了上传下载的代码详细情况,本文中只介绍MultipartFile控制器方法绑定和存储到数据库中部分实现以及下载方法实例,完整的代码请下载附件中的eclipse工程直接运行demo就可以了。
1.控制器方法
2.持久层dao实现部分:
代码都很简单,也非常容易理解,这里不做过多的解释。有问题可以留言讨论,也可以加入群组:
21220580
3625720
154752521
官方网站:
http://www.bbossgroups.com/
http://yin-bp.iteye.com/blog/1130035
中介绍了采用bboss mvc、aop/ioc、persistent组合完成文件上传、存储到数据库、从数据库中下载文件的基本功能,我们看到了如何通过MultipartHttpServletRequest获取上传文件,如何通过SQLExecutor/ConfigSQLExecutor中操作blob字段的api存储和读取文件的基本功能:
FieldRowHandler(获取blob为文件的字段行处理器)
NullRowHandler
本文作为上篇的进阶补充,介绍直接绑定MultipartFile对象或者MultipartFile数组到控制其方法参数或者po对象属性的案例。
对应的eclipse工程和运行demo可在本文的附件中下载:
http://dl.iteye.com/topics/download/c7393bc6-b8ee-3dd5-b4b3-e969ea63dbc0
demo工程中包含了derby数据库文件目录database,部署到tomcat中运行之前需要修改/src/poolman.xml文件中dburl路径为相应物理路径的下的database/cimdb,编译后即可。
启动tomcat, 访问的地址还是:
http://localhost:8080/bbossupload/upload/main.page
第一部分 本文的技术要点:
1. 控制器方法参数绑定机制增加MultipartFile、MultipartFile[]类型绑定支持,可以和RequestParam注解一起使用,也可以直接使用(默认获取第一个input[file]域对应的附件),使用方法如下:
public String uploadFileWithMultipartFile(@RequestParam(name="upload1") MultipartFile file,
ModelMap model)
public String uploadFileWithMultipartFiles(@RequestParam(name="upload1") MultipartFile[] files,
ModelMap model)
public String uploadFileWithMultipartFile( MultipartFile file,
ModelMap model)
public String uploadFileWithMultipartFiles(MultipartFile[] files,
ModelMap model)
2. PO对象属性数据绑定机制增加MultipartFile、MultipartFile[]类型绑定支持,可以和RequestParam注解一起使用,也可以直接与属性名称直接绑定,使用方法如下:
public String uploadFileWithFileBean(FileBean files)
FileBean是一个自定义的java bean,结构如下:
public class FileBean { private MultipartFile upload1; @RequestParam(name="upload1") private MultipartFile[] uploads; @RequestParam(name="upload1") private MultipartFile anupload; //省略属性的get/set方法 }
3. 改进的SQLParams api,可以直接对MultipartFile对象存入clob或者blob列。
sqlparams.addSQLParam("FILECONTENT", multipartfile,SQLParams.BLOBFILE);
对于大字段的处理建议采用以下方法:
sqlparams.addSQLParam("FILECONTENT", multipartfile,SQLParams.BLOBFILE);//直接传递MultipartFile对象进行插入
sqlparams.addSQLParam("FILECONTENT", inputStream, size,SQLParams.BLOBFILE);//直接传递InputStream对象以及流大小Size属性进行插入
一个完整的插入大字段的实例:
String sql = ""; try { sql = "INSERT INTO filetable (FILENAME,FILECONTENT,fileid,FILESIZE) VALUES(#[filename],#[FILECONTENT],#[FILEID],#[FILESIZE])"; SQLParams sqlparams = new SQLParams(); sqlparams.addSQLParam("filename", filename, SQLParams.STRING); sqlparams.addSQLParam("FILECONTENT", inputStream, size,SQLParams.BLOBFILE); sqlparams.addSQLParam("FILEID", UUID.randomUUID().toString(),SQLParams.STRING); sqlparams.addSQLParam("FILESIZE", size,SQLParams.LONG); SQLExecutor.insertBean(sql, sqlparams); } catch (Exception ex) { ex.printStackTrace(); result = false; throw new Exception("上传附件关联临控指令布控信息附件失败:" + ex); } finally { if(inputStream != null){ inputStream.close(); } }
或者
public void uploadClobFile(MultipartFile file) throws Exception { String sql = ""; try { sql = "INSERT INTO CLOBFILE (FILENAME,FILECONTENT,fileid,FILESIZE) VALUES(#[filename],#[FILECONTENT],#[FILEID],#[FILESIZE])"; SQLParams sqlparams = new SQLParams(); sqlparams.addSQLParam("filename", file.getOriginalFilename(), SQLParams.STRING); sqlparams.addSQLParam("FILECONTENT", file,SQLParams.CLOBFILE); sqlparams.addSQLParam("FILEID", UUID.randomUUID().toString(),SQLParams.STRING); sqlparams.addSQLParam("FILESIZE", file.getSize(),SQLParams.LONG); SQLExecutor.insertBean(sql, sqlparams); } catch (Exception ex) { throw new Exception("上传附件关联临控指令布控信息附件失败:" + ex); } }
4. FieldRowHandler处理器,实现从blob/clob中获取单个字段文件对象的处理,其他类似类型数据也可以使用FieldRowHandler,使用示例如下:
public File getDownloadClobFile(String fileid) throws Exception { try { return SQLExecutor.queryTField( File.class, new FieldRowHandler<File>() { @Override public File handleField( Record record) throws Exception { // 定义文件对象 File f = new File("d:/",record.getString("filename")); // 如果文件已经存在则直接返回f if (f.exists()) return f; // 将blob中的文件内容存储到文件中 record.getFile("filecontent",f); return f; } }, "select * from CLOBFILE where fileid=?", fileid); } catch (Exception e) { throw e; } }
第二部分 相关的实现细节
由于上篇文章已经详细介绍了上传下载的代码详细情况,本文中只介绍MultipartFile控制器方法绑定和存储到数据库中部分实现以及下载方法实例,完整的代码请下载附件中的eclipse工程直接运行demo就可以了。
1.控制器方法
public class UploadController { ............... /** * 直接使用MultipartHttpServletRequest 获取附件信息的方法 * @param request * @param model * @param idNum * @param type * @param des * @param byid * @return */ public String uploadFile(MultipartHttpServletRequest request, ModelMap model) { Iterator<String> fileNames = request.getFileNames(); // 根据服务器的文件保存地址和原文件名创建目录文件全路径 try { while (fileNames.hasNext()) { String name = fileNames.next(); MultipartFile[] files = request.getFiles(name); // file.transferTo(dest) for(MultipartFile file:files) { String filename = file.getOriginalFilename(); if (filename != null && filename.trim().length() > 0) { uploadService.uploadFile(file.getInputStream(), file .getSize(), filename); } } } } catch (Exception ex) { ex.printStackTrace(); } return "path:ok"; } /** * RequestParam注解和MultipartFile结合绑定参数方法,将参数upload1对应的附件直接以MultipartFile对象传入控制方法,简单又便捷,附件将被存储到derby数据库的blob字段中。 * @param request * @param model * @param idNum * @param type * @param des * @param byid * @return */ public String uploadFileWithMultipartFile(@RequestParam(name="upload1") MultipartFile file, ModelMap model) { // 根据服务器的文件保存地址和原文件名创建目录文件全路径 try { String filename = file.getOriginalFilename(); if (filename != null && filename.trim().length() > 0) { uploadService.uploadFile(file.getInputStream(), file .getSize(), filename); } } catch (Exception ex) { ex.printStackTrace(); } return "path:ok"; } /** * RequestParam注解和MultipartFile结合绑定参数方法,将参数upload1对应的附件直接以MultipartFile对象传入控制方法,简单又便捷,附件将被存储到derby数据库的clob字段中。 * @param request * @param model * @param idNum * @param type * @param des * @param byid * @return */ public String uploadFileClobWithMultipartFile(@RequestParam(name="upload1") MultipartFile file, ModelMap model) { // 根据服务器的文件保存地址和原文件名创建目录文件全路径 try { uploadService.uploadClobFile(file); } catch (Exception ex) { ex.printStackTrace(); } return "path:ok"; } /** * RequestParam注解和MultipartFile[]结合绑定参数方法,将参数upload1(页面上有多个upload1 file input元素)对应的附件直接以MultipartFile[]对象传入控制方法,简单又便捷,附件将被存储到derby数据库的blob字段中。 * @param request * @param model * @param idNum * @param type * @param des * @param byid * @return */ public String uploadFileWithMultipartFiles(@RequestParam(name="upload1") MultipartFile[] files, ModelMap model) { // 根据服务器的文件保存地址和原文件名创建目录文件全路径 try { { // file.transferTo(dest) for(MultipartFile file:files) { String filename = file.getOriginalFilename(); if (filename != null && filename.trim().length() > 0) { uploadService.uploadFile(file.getInputStream(), file .getSize(), filename); } } } } catch (Exception ex) { ex.printStackTrace(); } return "path:ok"; } /** * 本方法演示了po对象中绑定MultipartFile属性的功能。FileBean的结构如下: private MultipartFile upload1; @RequestParam(name="upload1") private MultipartFile[] uploads; @RequestParam(name="upload1") private MultipartFile anupload; 上面的结构展示了不同属性绑定方式。 * @param request * @param model * @param idNum * @param type * @param des * @param byid * @return */ public String uploadFileWithFileBean(FileBean files, ModelMap model) { try { //进行相应的处理 } catch (Exception ex) { ex.printStackTrace(); } return "path:ok"; } /** * 查询数据库的操作也只好放在控制器中处理 * @param fileid * @param request * @param response * @throws Exception */ public void downloadFileFromBlob( @RequestParam(name = "fileid") String fileid, HttpServletRequest request, HttpServletResponse response) throws Exception { uploadService.downloadFileFromBlob(fileid, request, response); } /** * 直接将blob对应的文件内容以相应的文件名响应到客户端,需要提供request和response对象 * 这个方法比较特殊,因为derby数据库的blob字段必须在statement有效范围内才能使用,所以采用了空行处理器,来进行处理 * 查询数据库的操作也只好放在控制器中处理 * @param fileid * @param request * @param response * @throws Exception */ public void downloadFileFromClob( @RequestParam(name = "fileid") String fileid, HttpServletRequest request, HttpServletResponse response) throws Exception { uploadService.downloadFileFromClob(fileid, request, response); } /** * 将数据库中存储的文件内容转储到应用服务器文件目录中,然后将转储的文件下载,无需提供response和request对象 * * @param fileid * @return * @throws Exception */ public @ResponseBody File downloadFileFromFile(@RequestParam(name = "fileid") String fileid) throws Exception { return uploadService.getDownloadFile(fileid); } public @ResponseBody File downloadFileFromClobFile(@RequestParam(name = "fileid") String fileid) throws Exception { return uploadService.getDownloadClobFile(fileid); } ......
2.持久层dao实现部分:
public class UpLoadDaoImpl implements UpLoadDao { @Override /** * CREATE TABLE CLOBFILE ( FILEID VARCHAR(100), FILENAME VARCHAR(100), FILESIZE BIGINT, FILECONTENT CLOB(2147483647) ) */ public void uploadClobFile(MultipartFile file) throws Exception { String sql = ""; try { sql = "INSERT INTO CLOBFILE (FILENAME,FILECONTENT,fileid,FILESIZE) VALUES(#[filename],#[FILECONTENT],#[FILEID],#[FILESIZE])"; SQLParams sqlparams = new SQLParams(); sqlparams.addSQLParam("filename", file.getOriginalFilename(), SQLParams.STRING); sqlparams.addSQLParam("FILECONTENT", file,SQLParams.CLOBFILE); sqlparams.addSQLParam("FILEID", UUID.randomUUID().toString(),SQLParams.STRING); sqlparams.addSQLParam("FILESIZE", file.getSize(),SQLParams.LONG); SQLExecutor.insertBean(sql, sqlparams); } catch (Exception ex) { throw new Exception("上传附件关联临控指令布控信息附件失败:" + ex); } } /** * 上传附件 * @param inputStream * @param filename * @return * @throws Exception */ public boolean uploadFile(InputStream inputStream,long size, String filename) throws Exception { boolean result = true; String sql = ""; try { sql = "INSERT INTO filetable (FILENAME,FILECONTENT,fileid,FILESIZE) VALUES(#[filename],#[FILECONTENT],#[FILEID],#[FILESIZE])"; SQLParams sqlparams = new SQLParams(); sqlparams.addSQLParam("filename", filename, SQLParams.STRING); sqlparams.addSQLParam("FILECONTENT", inputStream, size,SQLParams.BLOBFILE); sqlparams.addSQLParam("FILEID", UUID.randomUUID().toString(),SQLParams.STRING); sqlparams.addSQLParam("FILESIZE", size,SQLParams.LONG); SQLExecutor.insertBean(sql, sqlparams); } catch (Exception ex) { ex.printStackTrace(); result = false; throw new Exception("上传附件关联临控指令布控信息附件失败:" + ex); } finally { if(inputStream != null){ inputStream.close(); } } return result; } public File getDownloadFile(String fileid) throws Exception { try { return SQLExecutor.queryTField( File.class, new FieldRowHandler<File>() { @Override public File handleField( Record record) throws Exception { // 定义文件对象 File f = new File("d:/",record.getString("filename")); // 如果文件已经存在则直接返回f if (f.exists()) return f; // 将blob中的文件内容存储到文件中 record.getFile("filecontent",f); return f; } }, "select * from filetable where fileid=?", fileid); } catch (Exception e) { throw e; } } public File getDownloadClobFile(String fileid) throws Exception { try { return SQLExecutor.queryTField( File.class, new FieldRowHandler<File>() { @Override public File handleField( Record record) throws Exception { // 定义文件对象 File f = new File("d:/",record.getString("filename")); // 如果文件已经存在则直接返回f if (f.exists()) return f; // 将blob中的文件内容存储到文件中 record.getFile("filecontent",f); return f; } }, "select * from CLOBFILE where fileid=?", fileid); } catch (Exception e) { throw e; } } @Override public void deletefiles() throws Exception { SQLExecutor.delete("delete from filetable "); SQLExecutor.delete("delete from CLOBFILE "); } @Override public List<HashMap> queryfiles() throws Exception { return SQLExecutor.queryList(HashMap.class, "select FILENAME,fileid,FILESIZE from filetable"); } @Override public List<HashMap> queryclobfiles()throws Exception { return SQLExecutor.queryList(HashMap.class, "select FILENAME,fileid,FILESIZE from CLOBFILE"); } @Override public void downloadFileFromBlob(String fileid, final HttpServletRequest request, final HttpServletResponse response) throws Exception { try { SQLExecutor.queryByNullRowHandler(new NullRowHandler() { @Override public void handleRow(Record record) throws Exception { StringUtil.sendFile(request, response, record .getString("filename"), record .getBlob("filecontent")); } }, "select * from filetable where fileid=?", fileid); } catch (Exception e) { throw e; } } @Override public void downloadFileFromClob(String fileid, final HttpServletRequest request, final HttpServletResponse response) throws Exception { try { SQLExecutor.queryByNullRowHandler(new NullRowHandler() { @Override public void handleRow(Record record) throws Exception { StringUtil.sendFile(request, response, record .getString("filename"), record .getClob("filecontent")); } }, "select * from CLOBFILE where fileid=?", fileid); } catch (Exception e) { throw e; } } }
代码都很简单,也非常容易理解,这里不做过多的解释。有问题可以留言讨论,也可以加入群组:
21220580
3625720
154752521
官方网站:
http://www.bbossgroups.com/
- bbossupload.zip (9 MB)
- 下载次数: 35
发表评论
-
bboss 持久层数据源引用外部属性配置介绍
2018-12-29 21:47 983bboss 持久层数据源外部属性配置引用介绍 bboss持久 ... -
bboss mvc控制器方法跳转地址设置方法介绍
2017-12-09 21:52 851bboss mvc控制器方法跳转地址设置方法介绍 1.直接指 ... -
bboss持久层开启和关闭自带主键机制
2017-08-17 11:56 689bboss持久层开启和关闭自带主键机制 请访问文档: bbos ... -
bboss高性能db批处理功能使用方法介绍
2017-05-14 21:28 2057bboss持久层在v5.0.3.5中新增简单的高效的db批处理 ... -
bboss持久层公共sql片段定义和引用方法说明
2017-03-03 13:05 1058bboss持久层公共sql片段定义和引用方法说明 在配置sq ... -
bboss mvc json插件设置日期类型格式方法
2017-02-28 11:33 674bboss mvc json插件设置日期类型格式方法 一般的 ... -
最新版本mysql jdbc驱动包获取表定义信息空指针异常处理方法
2016-12-15 10:24 1271在使用最新的mysql-connector-java 6.0. ... -
bboss mvc控制器实现etag和last modify两种http缓存机制
2016-09-07 23:48 1205bboss mvc控制器实现etag和last modify两 ... -
bboss wordpdf构建部署介绍
2016-09-02 15:47 517bboss wordpdf构建部署介绍 下载 源码下载地址: ... -
持久层快速入门系列一
2016-08-19 13:00 1203持久层快速入门 先在应用中导入bboss 持久层(bboss ... -
bboss与spring中配置和引用bboss数据源和bboss dao组件方法说明
2016-08-10 16:04 862首先在项目中导入bboss 持久层包: maven坐标 & ... -
bboss 持久层sql xml配置文件编写和加载方法介绍
2016-04-05 13:14 1529bboss 持久层sql xml配置文件编写和加载方法介绍 通 ... -
解决tomcat stop报Illegal access: this web application instance has been stopped异常方法
2015-12-26 23:41 5818解决tomcat stop报Illegal access: t ... -
bboss持久层设置数据库查询fetchsize参数方法
2015-11-06 11:54 959bboss持久层设置数据库查询fetchsize参数方法 j ... -
bboss持久层快速入门教程
2015-09-19 13:49 1521bboss持久层快速入门教程,快速搭建bboss持久层的开 ... -
bboss mvc文件上传实例
2015-06-08 11:13 37本文着重介绍bboss mvc文件上传功能,切入正题 功能点 ... -
bboss持久层数据库适配器编写和注册方法
2015-02-06 15:21 920bboss持久层数据库适配器编写和注册方法 bboss持久层默 ... -
bboss模糊查询、动态sql、批处理资料荟萃
2015-01-30 12:03 2265bboss模糊查询、动态sql、批处理资料荟萃 bboss持 ... -
bboss持久层查询元数据缓存机制开启方法
2014-11-18 12:03 965bboss持久层为了提升数据库查询操作性能,提供了对查 ... -
bboss mvc @RequestBody注解使用说明
2014-10-23 15:53 992@RequestBody可以将客户端请求报文体通过数据类型转换 ...
相关推荐
NULL 博文链接:https://yin-bp.iteye.com/blog/926166
NULL 博文链接:https://yin-bp.iteye.com/blog/1528721
官方版本,亲测可用
自动代码生成器是针对bboss框架和bboss开发平台的自动代码生成工具,可以根据模板,自动生成给定表的增,删,改,分页查询,列表查询,国际化功能对应的程序和配置文件: 1.mvc控制器 2.业务组件 3.实体类 4.jsp文件...
NULL 博文链接:https://yin-bp.iteye.com/blog/2325602
bboss会话共享培训文档,学习bboss不可多得的资料,值得拥有。
bboss es特点请访问: https://www.oschina.net/p/bboss-elastic
企业级 J2EE 开源框架:bboss
bboss+es基本操作示例,elasticsearch,bboss,java使用demo
官方版本,亲测可用
springboot集成ElasticsearchBboss调用Elasticsearch的案例分享
资源目录: 项目源码(eshelloword.rar) bboss elasticsearch开发入门教程.wmv 搭建bboss elasticsearch开发环境.wmv 说明.txt
本实例是一个基于bboss es spring boot starter的demo maven工程,可供spring boot项目集成bboss elasticsearch rest client参考 展示了通过spring boot管理单集群功能和管理多集群功能 单集群测试用例:...
官方版本,亲测可用
bboss功能涵盖ioc,mvc,jsp自定义标签库,持久层,全局事务托管,安全认证,SSO,web会话共享,cxfwebservice服务发布和管理,hessian服务发布和管理等功能。另外还提供了符合中国式自由流的bboss activiti工作流...
Elasticsearch rest client bboss介绍-Elastic2018中国开发者大会演讲稿