<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    Hibernate存取圖片示例

    Posted on 2007-02-06 12:43 dennis 閱讀(485) 評(píng)論(0)  編輯  收藏 所屬分類: java

    一般網(wǎng)站在處理用戶上傳圖片時(shí)通常采用兩種策略:一是直接把圖片存入數(shù)據(jù)庫(kù)中的Blob字段;二是數(shù)據(jù)庫(kù)中只存儲(chǔ)圖片的在服務(wù)器上的路徑信息?,圖片存放在分門別類的文件中,使用的時(shí)候從數(shù)據(jù)庫(kù)讀取路徑信息到頁(yè)面img元素即可.在此不討論兩種方案的優(yōu)劣,我只是寫了個(gè)hibernate的例子來(lái)實(shí)現(xiàn)第一種策略.例子很簡(jiǎn)單,t_user表主要兩個(gè)字段,name和photo,其中photo字段類型為Blob.在此例中數(shù)據(jù)庫(kù)我采用mysql, oracle的Blob字段比較特殊,你必須自定義類型,具體的請(qǐng)自行搜索,這方面的資料很多.

    //User.java  

    package com.denny_blue.hibernate;

    import java.io.Serializable;
    import java.sql.Blob;

    public class User implements Serializable{
    ?private Integer id;
    ?private String name;
    ?private Blob photo;
    ?/**
    ? * @return the id
    ? */
    ?public User(){
    ?}
    ?public Integer getId() {
    ??return id;
    ?}
    ?/**
    ? * @param id the id to set
    ? */
    ?public void setId(Integer id) {
    ??this.id = id;
    ?}
    ?/**
    ? * @return the name
    ? */
    ?public String getName() {
    ??return name;
    ?}
    ?/**
    ? * @param name the name to set
    ? */
    ?public void setName(String name) {
    ??this.name = name;
    ?}
    ?/**
    ? * @return the photo
    ? */
    ?public Blob getPhoto() {
    ??return photo;
    ?}
    ?/**
    ? * @param photo the photo to set
    ? */
    ?public void setPhoto(Blob photo) {
    ??this.photo = photo;
    ?}
    ?
    }

    類User有3個(gè)屬性,id,name,photo,相應(yīng)的getter和setter方法以及一個(gè)無(wú)參構(gòu)造函數(shù).應(yīng)該注意的是photo的類型java.sql.Blob

    相應(yīng)的user.hbm.xml應(yīng)該如下:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    ?"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    ?"<hibernate-mapping
    ?package="com.denny_blue.hibernate">

    ?<class name="com.denny_blue.hibernate.User"
    ??????? table="t_user"
    ??????? dynamic-update="true"
    ??????? dynamic-insert="true"
    ??????? batch-size="3">
    ??<id name="id"
    ????? column="id"
    ????? type="java.lang.Integer">
    ???<generator class="native"/>
    ??</id>
    ??<property name="name" column="name" type="java.lang.String" lazy="true"/>
    ??<property name="photo" column="photo" type="java.sql.Blob"/>

    ?</class>

    </hibernate-mapping>

    對(duì)應(yīng)的hibernate.cfg.xml配置文件,不再列出,請(qǐng)參照hibernate文檔自行設(shè)定.

    OK,做了這一步,我們寫個(gè)測(cè)試類來(lái)進(jìn)行單元測(cè)試:

    package com.denny_blue.test;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Blob;

    import org.hibernate.Hibernate;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;

    import com.denny_blue.hibernate.User;

    import junit.framework.TestCase;

    public class HibernateTest extends TestCase {
    ??????? private Session session;
    ?protected void setUp() throws Exception {
    ??try{
    ???Configuration config=new Configuration().configure();
    ???SessionFactory sf=config.buildSessionFactory();
    ???session=sf.openSession();
    ??}catch(HibernateException e){
    ???e.printStackTrace();
    ??}
    ?}

    ?protected void tearDown() throws Exception {
    ??try{
    ???session.close();
    ??}catch(HibernateException e){
    ???e.printStackTrace();
    ??}
    ?}
    ?
    ?public void testSave()throws FileNotFoundException,IOException{
    ??User user=new User();
    ??user.setName("jordan");
    ??FileInputStream in=new FileInputStream("C://test.gif");
    ??Blob photo=Hibernate.createBlob(in);
    ??user.setPhoto(photo);
    ??Transaction tx=null;
    ??try{
    ??tx=session.beginTransaction();
    ??session.saveOrUpdate(user);
    ??tx.commit();
    ??}catch(HibernateException e){
    ???if(tx!=null)
    ????tx.rollback();
    ???e.printStackTrace();
    ??}finally{
    ???in.close();
    ??}
    ?}
    ?public void testLoad()throws Exception{
    ??try{
    ???User user=(User)session.load(User.class, new Integer(1));
    ???Blob photo=user.getPhoto();
    ???InputStream in=photo.getBinaryStream();
    ???FileOutputStream out=new FileOutputStream("C://out//test2.gif");
    ???byte [] buf=new byte[1024];
    ???int len;
    ???while((len=in.read(buf))!=-1){
    ????out.write(buf, 0, len);
    ???}
    ???in.close();
    ???out.close();
    ??}catch(HibernateException e){
    ???e.printStackTrace();
    ??}
    ?}

    }
    我們讀取C盤目錄下的test.gif并存儲(chǔ)到數(shù)據(jù)庫(kù)中,然后再取出來(lái)寫入C:/out目錄,此時(shí)你可以查看下數(shù)據(jù)表中photo顯示為blob,表示已經(jīng)成功存入.值的注意的代碼片段就是:

    FileInputStream in=new FileInputStream("C://test.gif");
    ??Blob photo=Hibernate.createBlob(in);
    我們這里是從磁盤中讀取圖片,實(shí)際應(yīng)用中你可以利用上傳組件得到圖片的2進(jìn)制數(shù)據(jù)流,并利用Hibernate.createBlob方法來(lái)構(gòu)造相應(yīng)的Blob對(duì)象.而取圖片則使用

    InputStream in=photo.getBinaryStream();

    這只是個(gè)簡(jiǎn)單的測(cè)試類,如果我想從數(shù)據(jù)庫(kù)中取出圖片并現(xiàn)實(shí)在頁(yè)面上該如何做呢?其實(shí)也很簡(jiǎn)單,我們先要寫一個(gè)servlet,在它的service方法中取出圖片,并"畫"到指定頁(yè)面上.

    package com.easyjf.asp.action;

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.sql.Blob;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import com.denny)blue.hibernate.User;


    public class Test extends HttpServlet {

    ?/**
    ? * Destruction of the servlet. <br>
    ? */
    ?private Session session;
    ?public void destroy() {
    ??try{
    ???session.close();
    ??}catch(HibernateException e){
    ???e.printStackTrace();
    ??}
    ?}

    ?/**
    ? * Initialization of the servlet. <br>
    ? *
    ? * @throws ServletException if an error occure
    ? */
    ?public void init() throws ServletException {
    ??try{
    ???Configuration config=new Configuration().configure();
    ???SessionFactory sf=config.buildSessionFactory();
    ???session=sf.openSession();
    ??}catch(HibernateException e){
    ???e.printStackTrace();
    ??}
    ?}
    ??? public void doGet(HttpServletRequest request,HttpServletResponse response)
    ??? {
    ??? ?try{
    ???User user=(User)session.load(User.class, new Integer(1));
    ???Blob photo=user.getPhoto();
    ???InputStream in=photo.getBinaryStream();
    ???OutputStream out=response.getOutputStream();
    ???byte [] buf=new byte[1024];
    ???int len;
    ???while((len=in.read(buf))!=-1){
    ????out.write(buf, 0, len);
    ???}
    ???in.close();
    ???out.close();
    ??}catch(Exception e){
    ???e.printStackTrace();
    ??}
    ??? }

    }

    通過(guò)response.getOutputStream取得輸出流,其他就與上段代碼一致.servlet寫好了,怎么在頁(yè)面調(diào)用呢?那就更簡(jiǎn)單啦,直接在頁(yè)面的img標(biāo)簽的src屬性上調(diào)用該servlet即可,如:

    <img id="test" src="/servlet/Test"/>

    ?

    簡(jiǎn)單的例子,希望對(duì)初學(xué)者有幫助.

    附記:如果不希望在servlet(或者action之類)中進(jìn)行保存操作,希望在DAO進(jìn)行此操作,那么InputStream的關(guān)閉問(wèn)題可以通過(guò)hibernate的interceptor機(jī)制解決

    主站蜘蛛池模板: 成年女人毛片免费视频| 亚洲人成色77777| 一级毛片免费在线| 亚洲国产精品乱码一区二区| 4hu四虎最新免费地址| 色www免费视频| 亚洲特级aaaaaa毛片| 亚洲国产成人久久综合一区77| 美女在线视频观看影院免费天天看| 国产精品亚洲精品观看不卡| 亚洲国产人成中文幕一级二级| 97在线视频免费播放| 高清免费久久午夜精品| 亚洲影院在线观看| 四虎永久免费网站免费观看| 在线观看的免费网站无遮挡| 成人午夜免费视频| 亚洲午夜精品久久久久久app| 好看的电影网站亚洲一区| 国内一级一级毛片a免费| 亚洲欧洲免费视频| 又硬又粗又长又爽免费看| 亚洲人成网站日本片| 亚洲日韩激情无码一区| 国产成人精品免费直播| 亚洲视频免费观看| 黄床大片免费30分钟国产精品| 亚洲成a人片在线观看精品| 亚洲第一福利视频| 亚洲精品国产va在线观看蜜芽| 亚洲日本在线免费观看| 国产成年无码久久久免费| 国产区图片区小说区亚洲区| 亚洲自国产拍揄拍| 亚洲自偷自拍另类12p| 亚洲色偷偷狠狠综合网| 国产国产人免费视频成69大陆| 国内精品免费麻豆网站91麻豆 | 亚洲精华国产精华精华液| 久久久久亚洲AV无码观看| 亚洲国产精品无码专区|