林信良(良葛格)的专栏

http://caterpillar.onlyfun.net/

用户操作
[即时聊天] [发私信] [加为好友]
良葛格ID:caterpillar_here
241624次访问,排名286,好友0人,关注者91人。
caterpillar_here的文章
原创 51 篇
翻译 0 篇
转载 1 篇
评论 333 篇
良葛格的公告
更多文件请访问
良葛格学习笔记

最近评论
niutao0603:强悍,学习了~~
liseo1:
网络营销策划 网络公关 品牌管理 搜索引擎公关 搜索引擎排名 网站优化 软文发布 QQ:441843869
工业门
wangle100wangle:写的不错,谢谢分享。关注中。
hero0513:不错。。学习了。。
songlion112:好例子,谢谢
文章分类
收藏
    相册
    Java
    夏昕的专栏
    良葛格学习笔记
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Spring 對 Lob 的支援...收藏

    新一篇: DWR 入門與應用(一) | 旧一篇: 写作的用与趣

    如果要將 將檔案存入資料庫,我們在JDBC中可以使用CLOB與BLOB來分別針對文字檔案與二進位檔案進行儲存,Spring中可以透過JdbcTemplate來處理CLOB與BLOB。

    舉個例子來說,假設您的MySQL資料庫表格如下:
    1
    2
    3
    4
    5
    CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY,
    txt TEXT,
    image BLOB
    );


    假設我們現在分別讀進一個文字檔案與二進位檔案,並想將之儲存至資料庫中,則我們可以使用JdbcTemplate,例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            final File binaryFile = new File("c:\\workspace\\wish.jpg");
    final File txtFile = new File("c:\\workspace\\test.txt");

    final InputStream is = new FileInputStream(binaryFile);
    final Reader reader = new FileReader(txtFile);

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    final LobHandler lobHandler = new DefaultLobHandler();

    jdbcTemplate.execute("INSERT INTO test (txt, image) VALUES(?, ?)",
    new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
    protected void setValues(PreparedStatement pstmt, LobCreator lobCreator)
    throws SQLException, DataAccessException {
    lobCreator.setClobAsCharacterStream(pstmt, 1, reader, (int) txtFile.length());
    lobCreator.setBlobAsBinaryStream(pstmt, 2, is, (int) binaryFile.length());
    }
    });

    reader.close();
    is.close();


    JdbcTemplate中傳入了AbstractLobCreatingPreparedStatementCallback的實作,並傳入一 個 LobHandler,對於MySQL(MS SQL Server或Oracle 10g),這邊使用DefaultLobHandler即可,對於Oracle 9i特定的LOB處理,我們可以使用OracleLobHandler。

    如果要從資料庫中將資料讀取出來,並另存為檔案,我們可以使用以下的程式:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            final Writer writer = new FileWriter("c:\\workspace\\test_bak.txt");
    final OutputStream os = new FileOutputStream(new File("c:\\workspace\\wish_bak.jpg"));

    jdbcTemplate.query("SELECT txt,image FROM test WHERE id = ?",
    new Object[] {new Integer(1)},
    new AbstractLobStreamingResultSetExtractor() {
    protected void streamData(ResultSet rs) throws SQLException, IOException, DataAccessException {
    FileCopyUtils.copy(lobHandler.getClobAsCharacterStream(rs, 1), writer);
    FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs, 2), os);
    }
    });
    writer.close();
    os.close();
     

    在使用Spring搭配Hibernate時,可以簡化對Lob型態的處理,只要在SessionFactory建構時指定LobHandler,例如:
    * beans-config.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
    <value>jdbc:mysql://localhost:3306/demo</value>
    </property>
    <property name="username">
    <value>root</value>
    </property>
    <property name="password">
    <value>123456</value>
    </property>
    </bean>

    <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>

    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    <property name="lobHandler">
    <ref bean="lobHandler"/>
    </property>
    <property name="mappingResources">
    <list>
    <value>onlyfun/caterpillar/User.hbm.xml</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    </prop>
    </props>
    </property>
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>
    </beans>


    在這邊指定LobHandler時,對於MySQL、DB2、MS SQL Server、Oracle 10g,使用DefaultLobHandler即可,而對於Oracle 9i,則可以使用OracleLobHandler。

    接下來的操作與一般對HibernateTemplate的操作無異,例如您的資料庫表格為:
    1
    2
    3
    4
    5
    CREATE TABLE user (
    id INT auto_increment PRIMARY Key,
    txt TEXT,
    image BLOB
    );


    Spring的ClobStringType可以將CLOB映射至String,而BlobByteArrayType可以將BLOB映射至byte[],所以我們可以設計一個User類別如下:

    * User.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package onlyfun.caterpillar;
     
    public class User {
    private Integer id;
    private String txt;
    private byte[] image;

    public Integer getId() {
    return id;
    }
    public void setId(Integer id) {
    this.id = id;
    }
    public byte[] getImage() {
    return image;
    }
    public void setImage(byte[] image) {
    this.image = image;
    }
    public String getTxt() {
    return txt;
    }
    public void setTxt(String txt) {
    this.txt = txt;
    }  
    }


    Use.hbm.xml沒什麼特別的:

    * User.hbm.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping>
    <class name="onlyfun.caterpillar.User" table="user">
     
    <id name="id" column="id">
    <generator class="native"/>
    </id>
     
    <property name="txt" column="txt"/>
     
    <property name="image" column="image"/>
    </class>
    </hibernate-mapping>


    以下是個簡單的儲存與讀取Lob的程式片段示範:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
            ApplicationContext context =
    new FileSystemXmlApplicationContext("beans-config.xml");

    InputStream is = new FileInputStream(new File("c:\\workspace\\wish.jpg"));
    byte[] b = new byte[is.available()];
    is.read(b);
    is.close();

    User user = new User();
    user.setTxt("long...long...text");
    user.setImage(b);

    HibernateTemplate hibernateTemplate = (HibernateTemplate) context.getBean("hibernateTemplate");
    hibernateTemplate.save(user);

    user = (User) hibernateTemplate.execute(new HibernateCallback() {
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    User user = (User) session.load(User.class, new Integer(1));
    Hibernate.initialize(user);
    return user;
    }
    });

    System.out.println(user.getTxt());
    b = user.getImage();

    OutputStream os = new FileOutputStream(new File("c:\\workspace\\wish_bak.jpg"));
    os.write(b);
    os.close();

    发表于 @ 2006年08月14日 21:03:00|评论(loading...)|编辑

    新一篇: DWR 入門與應用(一) | 旧一篇: 写作的用与趣

    评论

    #lightersky 发表于2006-09-01 21:55:00  IP: 218.15.22.*
    过来看看,温习一下lob也算一种收获啦.
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 良葛格