Hibernate+Spring完全搞定Clob、Blob的存取

Hibernate+Spring完全搞定Clob、Blob的存取
 
 
摘要:本文經過一個實例講述如何經過Spring2+Hibernate3來快捷操做數據庫中的Lob字段。
環境:Oracle10g、Srping二、Hibernate三、JUint4
 
說明:因爲時間緊迫,沒有詳細寫出思路。運行一下例子就明白了。
 
 
1、建立實體並添加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[] p_w_picpath;               //圖片
 
    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="p_w_picpath" type="blob" not-null="false"
     * @hibernate.meta attribute="field-description" value="圖片"
     */
    public byte[] getImage() {
        return p_w_picpath;
    }
 
    public void setImage(byte[] p_w_picpath) {
        this.p_w_picpath = p_w_picpath;
    }
}
 
2、經過XDoclet生成Mapping,並修正lob映射的類型爲Spring提供的類型
 
<?xml version="1.0" encoding="gb2312"?>
 
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 
<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="p_w_picpath"
            type="org.springframework.orm.hibernate3.support.BlobByteArrayType"
            update="true"
            insert="true"
            column="p_w_picpath"
            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>
 
 
 
3、經過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,
        p_w_picpath 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.p_w_picpath is
        '圖片';
 
 
 
4、建立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; 
    }
}
 
 
5、建立帶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);
    }
}
 
 
6、書寫單元測試,並運行
/**
 * 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(" [url]http://lavasoft.blog.51cto.com/[/url]");
        workNote.setOrgId(Long.parseLong("999"));
        workNote.setCreateDate(new Date());
        byte[] b="lavasoft".getBytes();
        workNote.setImage(b);
        officeService.saveWorkNote(workNote);
    }
}
 
看看測試結果:
 
 
看到了吧,存進去了,各位週末愉快~~
相關文章
相關標籤/搜索