Hibernate+Spring搞定Clob、Blob的存取

来源:互联网 发布:网络歌手囚鸟唱的梦 编辑:程序博客网 时间:2024/05/05 19:23
<script type="text/javascript"><!--google_ad_client = "pub-1592932103935230";/* 336x280,csdnblogs, 创建于 08-5-10 */google_ad_slot = "8315096772";google_ad_width = 336;google_ad_height = 280;//--></script> <script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
摘要:本文通过一个实例讲述如何通过Spring2+Hibernate3来快捷操作数据库中的Lob字段。
    环境:Oracle10g、Srping2、Hibernate3、JUint4
    说明:由于时间紧迫,没有详细写出思路。运行一下例子就明白了。

    一、创建实体并添加Xdoclet的Hibernate标签
    /**
     * @author leizhimin
     * @hibernate.mapping default-lazy="false"
     * @hibernate.meta attribute="class-description" value="工作日志"
     * @hibernate.class table="rc_gzrz"
     */
    public class WorkNote {
        private Long id;                    //标识
        private Date workDate;             //日期
        private String weather;             //天气
        private String content;             //日志内容(Clob)
        private String state;               //日志状态
        private Long orgId;                 //机构id
        private Long userId;                //用户id
        private Date createDate;            //创建日期
        private byte[] image;               //图片
        public static final String WORKNOTE_BLANK = "00";         //未填写
        public static final String WORKNOTE_FULL = "11";          //已填写
        /**
         * @hibernate.id generator-class="sequence" column="BS"
         * @hibernate.meta attribute="field-description" value="标识"
         * @hibernate.generator-param name="sequence" value="SEQ_GW"
         */
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        /**
         * @hibernate.property column="workDate" not-null="false" type="timestamp"
         * @hibernate.meta attribute="field-description" value="工作日期"
         */
        public Date getWorkDate() {
            return workDate;
        }
        public void setWorkDate(Date workDate) {
            this.workDate = workDate;
        }
        /**
         * @hibernate.property column="weather" not-null="false" length="24"
         * @hibernate.meta attribute="field-description" value="天气"
         */
        public String getWeather() {
            return weather;
        }
        public void setWeather(String weather) {
            this.weather = weather;
        }
        /**
         * @hibernate.property column="content" not-null="false" type="text"
         * @hibernate.meta attribute="field-description" value="内容"
         */
        public String getContent() {
            return content;
        }
        public void setContent(String content) {
            this.content = content;
        }
        /**
         * @hibernate.property column="state" not-null="false" length="2"
         * @hibernate.meta attribute="field-description" value="状态"
         */
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
        /**
         * @hibernate.property column="orgId" type="long"
         * @hibernate.meta attribute="field-description" value="机构id"
         */
        public Long getOrgId() {
            return orgId;
        }
        public void setOrgId(Long orgId) {
            this.orgId = orgId;
        }
        /**
         * @hibernate.property column="userId" type="long"
         * @hibernate.meta attribute="field-description" value="用户id"
         */
        public Long getUserId() {
            return userId;
        }
        public void setUserId(Long userId) {
            this.userId = userId;
        }
        /**
         * @hibernate.property column="createDate" not-null="false" type="timestamp"
         * @hibernate.meta attribute="field-description" value="创建日期"
         */
        public Date getCreateDate() {
            return createDate;
        }
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
        /**
         * @hibernate.property column="image" type="blob" not-null="false"
         * @hibernate.meta attribute="field-description" value="图片"
         */
        public byte[] getImage() {
            return image;
        }
        public void setImage(byte[] image) {
            this.image = image;
        }
    }

    二、通过XDoclet生成Mapping,并修正lob映射的类型为Spring提供的类型
    <?xml version="1.0" encoding="gb2312"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping
            default-lazy="false"
    >
        <class
            name="com.topsoft.oa.routine.domain.office.entity.WorkNote"
            table="rc_gzrz"
        >
            <meta attribute="class-description">工作日志</meta>
            <id
                name="id"
                column="BS"
                type="java.lang.Long"
            >
                <meta attribute="field-description">标识</meta>
                <generator class="sequence">
                    <param name="sequence">SEQ_GW</param>
                  <!--
                      To add non XDoclet generator parameters, create a file named
                      hibernate-generator-params-WorkNote.xml
                      containing the additional parameters and place it in your merge dir.
                  -->
                </generator>
            </id>
            <property
                name="workDate"
                type="timestamp"
                update="true"
                insert="true"
                column="workDate"
                not-null="false"
            >
                <meta attribute="field-description">工作日期</meta>
            </property>
            <property
                name="weather"
                type="java.lang.String"
                update="true"
                insert="true"
                column="weather"
                length="24"
                not-null="false"
            >
                <meta attribute="field-description">天气</meta>
            </property>
            <property
                name="content"
                type="org.springframework.orm.hibernate3.support.ClobStringType"
                update="true"
                insert="true"
                column="content"
                not-null="false"
            >
                <meta attribute="field-description">内容</meta>
            </property>
            <property
                name="state"
                type="java.lang.String"
                update="true"
                insert="true"
                column="state"
                length="2"
                not-null="false"
            >
                <meta attribute="field-description">状态</meta>
            </property>
            <property
                name="orgId"
                type="long"
                update="true"
                insert="true"
                column="orgId"
            >
                <meta attribute="field-description">机构id</meta>
            </property>
            <property
                name="userId"
                type="long"
                update="true"
                insert="true"
                column="userId"
            >
                <meta attribute="field-description">用户id</meta>
            </property>
            <property
                name="createDate"
                type="timestamp"
                update="true"
                insert="true"
                column="createDate"
                not-null="false"
            >
                <meta attribute="field-description">创建日期</meta>
            </property>
            <property
                name="image"
                type="org.springframework.orm.hibernate3.support.BlobByteArrayType"
                update="true"
                insert="true"
                column="image"
                not-null="false"
            >
                <meta attribute="field-description">图片</meta>
            </property>
            <!--
                To add non XDoclet property mappings, create a file named
                    hibernate-properties-WorkNote.xml
                containing the additional properties and place it in your merge dir.
            -->
        </class>
    </hibernate-mapping>
   三、通过Mapping 用XDoclet生成数据库(Oracle)脚本,并建表
        drop table rc_gzrz cascade constraints;

        create table rc_gzrz (
            BS number(19,0) not null,
            workDate timestamp,
            weather varchar2(24 char),
            content clob,
            state varchar2(2 char),
            orgId number(19,0),
            userId number(19,0),
            createDate timestamp,
            image blob,
            primary key (BS)
        );
        comment on table rc_gzrz is
            '工作日志';
        comment on column rc_gzrz.BS is
            '标识';
        comment on column rc_gzrz.workDate is
            '工作日期';
        comment on column rc_gzrz.weather is
            '天气';
        comment on column rc_gzrz.content is
            '内容';
        comment on column rc_gzrz.state is
            '状态';
        comment on column rc_gzrz.orgId is
            '机构id';
        comment on column rc_gzrz.userId is
            '用户id';
        comment on column rc_gzrz.createDate is
            '创建日期';
        comment on column rc_gzrz.image is
            '图片';

    四、创建DAO层

    /**
     * Created by IntelliJ IDEA.
     * User: leizhimin
     * Date: 2007-11-16
     * Time: 10:55:50
     * To change this template use File | Settings | File Templates.
     */
    public interface WorkNoteDAO extends CommonDAO {
        /**
         * 根据日期查询工作日志
         *
         * @param workDate 工作日期
         * @param userId   用户id
         * @param orgId    机构id
         * @param sp       分页对象
         * @return List
         */
        public List findWorkNoteByDate(Date workDate, Long userId, Long orgId, SplitPage sp);
        /**
         * 根据状态查询工作日志
         *
         * @param state     日志状态
         * @param userId    用户id
         * @param orgId     机构id
         * @param sp        分页对象
         * @return List
         */
        public List findWorkNoteByState(String state, Long userId, Long orgId, SplitPage sp);
    }

    /**
     * Created by IntelliJ IDEA.
     * User: leizhimin
     * Date: 2007-11-16
     * Time: 10:56:00
     * To change this template use File | Settings | File Templates.
     */
    public class WorkNoteDAOImpl extends CommonDAOImpl implements WorkNoteDAO{
        public List findWorkNoteByDate(Date workDate, Long userId, Long orgId, SplitPage sp) {
            return null;
        }
        public List findWorkNoteByState(String state, Long userId, Long orgId, SplitPage sp) {
            return null;
        }
    }

    五、创建带JTA事务控制的业务service层
    /**
     * Created by IntelliJ IDEA.
     * User: leizhimin
     * Date: 2007-11-16
     * Time: 16:43:57
     * To change this template use File | Settings | File Templates.
     */
    public interface OfficeService {
        public void saveWorkNote(WorkNote workNote);
        public void updateWorkNote(WorkNote workNote);
    }

    /**
     * Created by IntelliJ IDEA.
     * User: leizhimin
     * Date: 2007-11-16
     * Time: 16:45:54
     * To change this template use File | Settings | File Templates.
     */
    public class OfficeServiceImpl implements OfficeService{
        private WorkNoteDAO workNoteDAO;
        public WorkNoteDAO getWorkNoteDAO() {
            return workNoteDAO;
        }
        public void setWorkNoteDAO(WorkNoteDAO workNoteDAO) {
            this.workNoteDAO = workNoteDAO;
        }
        public void saveWorkNote(WorkNote workNote) {
            this.workNoteDAO.saveObject(workNote);
        }
        public void updateWorkNote(WorkNote workNote) {
            this.workNoteDAO.updateObject(workNote);
        }
    }
    六、书写单元测试,并运行
    /**
     * Created by IntelliJ IDEA.
     * User: leizhimin
     * Date: 2007-11-16
     * Time: 16:49:17
     * To change this template use File | Settings | File Templates.
     */
    public class TestOffice extends TestCase {
        public void test_worknote_save(){
            OfficeService officeService = (OfficeService) ContextHelper.getContext().getBean("officeServiceProxy");
            WorkNote workNote=new WorkNote();
            workNote.setContent("http://lavasoft.blog.51cto.com/");
            workNote.setOrgId(Long.parseLong("999"));
            workNote.setCreateDate(new Date());
            byte[] b="lavasoft".getBytes();
            workNote.setImage(b);
            officeService.saveWorkNote(workNote);
        }
    }
    看看测试结果:





看到了吧,存进去了,各位周末愉快!