hibernate4 保存及显示 blob 数据

本贴最后更新于 3769 天前,其中的信息可能已经时移世易

有时候,我们在保存用户头像的时候,想直接将图像信息保存到数据库当中,这时就要用到blob了。我就来说一下 spring4 hibernate4 struts2环境下的操作吧。

hibernate的bean是这么操作,

private Blob head_photo;  // 省略get/set方法。


User.hbm.xml 映射文件里面这样写:

<property name="head_photo" type="blob">
           <column name="head_photo" ></column>
 </property>
在hibernate3中可能会有些区别,这里主要讲hibernate4.

 

然后在struts当中,配置form表单为:

<s:form action="user_%{id==null?'add':'edit'}" method="post"        enctype="multipart/form-data">

        <s:file value="上传" name="file"></s:file>
        <br />         
        头像:    这个图像是做为回显需再定义一个 user_toStream的action

</s:form>

然后在action里面用一个定义一个File file属性

private File file;  //get、set方法省略

public String add() throws Exception {
        // 得到LobHelper
        Session session=sessionFactory.openSession();   //用 getCurrentSession()的时候,取不到session,所以用openSession,也要注意关闭
        LobHelper lobHelper = session.getLobHelper();  
        System.out.println("lobHelper:"+lobHelper);

        byte[] fileArray = org.springframework.util.FileCopyUtils.copyToByteArray(file);
        Blob blob=lobHelper.createBlob(fileArray);    //hibernate4是用这一种方式来获取blob
        model.setHead_photo(blob);   // model是采用模型驱动  ModelDriver<T>
        session.close();
        
        if (StrUtils.notNull(model.getPassword())) {
            model.setPassword(DigestUtils.md5Hex(model.getPassword()));  //md5加密
        } else {
            model.setPassword(DigestUtils.md5Hex("123456"));
        }
        if (0 == model.getUserType()) { // 0为求美者
            UserBeauty ub = new UserBeauty();
            BeanUtils.copyNotNullProperties(model, ub);
            ub.setAlipay(getRequest().getParameter("alipay"));
            String userId = (String) userBeautyService.save(ub);
            log.info("保存的用户,userId:" + userId);
        } else if (1 == model.getUserType()) { // 为医务人员
            UserDoctor doctor = new UserDoctor();
            BeanUtils.copyNotNullProperties(model, doctor);
            doctor.setTitle(getRequest().getParameter("title"));
            String userId = (String) userDoctorService.save(doctor);
            log.info("保存的用户,userId:" + userId);
        }
        return "toList";
 }

最后上一个图像回显的action

public void toStream() {
        User user = userService.getById(request.getParameter("id"));
        log.info("user"+user);
        ServletOutputStream sout;   //直接用这一个输出了
        try {
            sout = ServletActionContext.getResponse().getOutputStream();
            InputStream in = user.getHead_photo().getBinaryStream();  //取出-->流
            int i = 0;
            byte[] b=new byte[1024];    
            while((i=in.read(b))!=-1){
                 sout.write(b);
            }        
            sout.flush();
            sout.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }                
    }


另外在使用的过程当中,发现如果给bean开启二级缓存的话,是会报错的,大概是说Blob不能进行缓存。如果有更好的思路,欢迎留言!

  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 728 关注
  • blob
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 242 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 72 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 406 关注
  • 倾城之链
    23 引用 • 66 回帖 • 167 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 4 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 444 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 10 关注
  • 自由行
    2 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 93 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 2 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 344 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 1 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 648 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 2 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 465 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 351 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 2 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    413 引用 • 3591 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 1 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 18 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 226 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 121 关注