隨筆-72  評論-63  文章-0  trackbacks-0

          Hibernate SQL Server BLOB

          BLOB 數據在 SQL Server 數據庫中主要由 IMAGE 類型體現,最大容量為 2GB 。其存儲方式不同于普通的數據類型,對于普通類型的數據系統直接在用戶定義的字段上存儲數據值,而對于 IMAGE 類型數據,系統開辟新的存儲頁面來存放這些數據,表中 IMAGE 類型數據字段存放的僅是一個 16 字節的指針,該指針指向存放該條記錄的 IMAGE 數據的頁面。如果 你對 Hibernate 還不熟息,請看 這里

          ?

          新建名為 “BLOB_TEST” 的表,字段分別是 INT 類型的 “ID” IMAGE 類型的 “MYBLOB” 。從文件系統讀取 “sample.jpg” 并轉換成字節數組再放進 BlobTest 對象實例。 寫入程序如下:

          ?

          import java.io.*;

          import net.sf.hibernate.*;
          import net.sf.hibernate.cfg.*;

          import bo.*;

          public class Tester {

          ?public void DoTest() {
          ??InputStream in = null;
          ??BlobTest blobTest = null;
          ??Configuration cfg = null;
          ??SessionFactory sessions = null;
          ??Session session = null;
          ??Transaction tx = null;
          ??try {
          ???//begin InputStream
          ???in = new FileInputStream("d:/sample.jpg");
          ???byte[] b = new byte[in.available()];
          ???in.read(b);
          ???in.close();

          ???//begin BlobTest
          ???blobTest = new BlobTest();
          ???blobTest.setMyblob(b);

          ???//begin Hibernate Session
          ???cfg = new Configuration().configure();
          ???sessions = cfg.buildSessionFactory();
          ???session = sessions.openSession();
          ???tx = session.beginTransaction();
          ???session.save(blobTest);
          ???tx.commit();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????session.close();
          ???} catch (Exception e1) {
          ????e1.printStackTrace();
          ???}
          ??}
          ?}
          }

          ?

          取出 程序如下:

          ?

          import java.io.*;

          import net.sf.hibernate.*;
          import net.sf.hibernate.cfg.*;

          import bo.*;

          public class Tester {

          ?public void DoTest() {
          ??OutputStream out = null;
          ??BlobTest blobTest = null;
          ??Configuration cfg = null;
          ??SessionFactory sessions = null;
          ??Session session = null;
          ??try {
          ???//begin Hibernate Session
          ???cfg = new Configuration().configure();
          ???sessions = cfg.buildSessionFactory();
          ???session = sessions.openSession();

          ???//begin BlobTest
          ???blobTest = new BlobTest();
          ???blobTest = (BlobTest) session.load(BlobTest.class, new Integer(23));

          ???//begin OutputStream
          ???out = new FileOutputStream("d:/sample.jpg");
          ???out.write(blobTest.getMyblob());
          ???out.flush();
          ???out.close();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????session.close();
          ???} catch (Exception e1) {
          ????e1.printStackTrace();
          ???}
          ??}
          ?}
          }

          ?

          Hibernate MySQL BLOB

          ??? MySQL 中的 BLOB 數據由四種類型體現,分別是 TINYBLOB 其容量為 256 字節、 BLOB 其容量為 64KB MEDIUMBLOB 其容量為 16MB LONGBLOB 其容量為 4GB

          ?

          新建名為 “BLOB_TEST” 的表,字段分別是 INTEGER 類型的 “ID” MEDIUMBLOB 類型的 “MYBLOB” 。從文件系統讀取 “sample.jpg” 并轉換成字節數組再放進 BlobTest 對象實例。 寫入、 取出 程序和上面的 SQL Server 一樣。

          ?

          Hibernate Oracle BLOB

          ??? 為了不使用 “for update” 鎖住數據庫,遂打算讓 Oracle LONG RAW 類型保存大對象,最大容量 2GB 。經過測試后發現,直接寫 JDBC 代碼可以保存,但 Hibernate 只能保存 4K 大小內容,換成 Hibernate 3.0 beta3 也未能成功。偶然的機會在郵件列表上發現這是 JDBC Driver 的問題,換成 Oracle 10g 的驅動后問題解決。

          ?

          新建名為 “BLOB_TEST” 的表,字段分別是 NUMBER 類型的 “ID” LONG RAW 類型的 “MYBLOB” 。從文件系統讀取 “sample.jpg” 并轉換成字節數組再放進 BlobTest 對象實例。 寫入、 取出 程序和 SQL Server 一樣。

          ?

          如果你一定要用 Oracle BLOB 類型,接著往下看:

          ??? Hibernate 處理 Oracle BLOB 類型較特殊 從文件系統讀取 “sample.jpg” 放進 BlobTest 對象實例的是 java.sql.Blob 類型,而不是字節數組。

          ?

          import java.io.*;

          import net.sf.hibernate.*;
          import net.sf.hibernate.cfg.*;
          import oracle.sql.*;

          import bo.*;

          public class Tester {

          ?public void DoTest() {
          ??BLOB blob = null;
          ??InputStream in = null;
          ??OutputStream out = null;
          ??BlobTest blobTest = null;
          ??Configuration cfg = null;
          ??SessionFactory sessions = null;
          ??Session session = null;
          ??Transaction tx = null;
          ??try {
          ???//begin InputStream
          ???in = new FileInputStream("d:/sample.jpg");
          ???byte[] b = new byte[in.available()];
          ???in.read(b);
          ???in.close();
          ???
          ???//begin BlobTest
          ???blobTest = new BlobTest();
          ???blobTest.setMyblob(BLOB.empty_lob());
          ???
          ???//begin Hibernate Session
          ???cfg = new Configuration().configure();
          ???sessions = cfg.buildSessionFactory();
          ???session = sessions.openSession();
          ???tx = session.beginTransaction();
          ???session.save(blobTest);
          ???session.flush();
          ???session.refresh(blobTest, LockMode.UPGRADE);
          ???blob = (BLOB) blobTest.getMyblob();
          ???out = blob.getBinaryOutputStream();
          ???out.write(b);
          ???out.close();
          ???session.flush();
          ???tx.commit();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????session.close();
          ???} catch (Exception e1) {
          ????e1.printStackTrace();
          ???}
          ??}
          ?}
          }

          ?

          取出 程序和其他兩種數據庫操作幾乎一樣。

          ?

          iBATIS SQL Maps SQL Server BLOB

          ??? 建表過程和 Hibernate 操作 SQL Server 一樣,如果 你對 iBATIS SQL Maps 還不熟息,請看 這里

          ?

          映射文件如下:

          ?

          <?xml version="1.0" encoding="UTF-8"?>

          <!DOCTYPE sqlMap
          ??? PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
          ??? "
          http://www.ibatis.com/dtd/sql-map-2.dtd ">

          <sqlMap>

          ??? <insert id="insertBlob" parameterClass="bo.BlobTest">
          ????? <![CDATA[
          ??????? insert into blob_test (myblob) values (#myblob#)
          ????? ]]>
          ????? <selectKey resultClass="java.lang.Integer" keyProperty="id">
          ??????? <![CDATA[
          ????????? SELECT @@IDENTITY AS ID
          ??????? ]]>
          ????? </selectKey>
          ??? </insert>

          ??? <resultMap id="get-blob-result" class="bo.BlobTest">
          ????? <result property="id" column="id"/>
          ????? <result property="myblob" column="myblob"/>
          ??? </resultMap>

          ??? <select id="getBlob" resultMap="get-blob-result" parameterClass="bo.BlobTest">
          ????? <![CDATA[
          ??????? select * from blob_test where id=#id#
          ????? ]]>
          ??? </select>
          ???????
          </sqlMap>

          ?

          寫入程序如下:

          ?

          import java.io.*;

          import com.ibatis.sqlmap.client.*;
          import com.ibatis.common.resources.*;

          import bo.*;

          public class Tester {

          ?public void DoTest() {
          ??byte[] b=null;
          ??Reader reader = null;
          ??InputStream in = null;
          ??BlobTest blobTest = null;
          ??SqlMapClient sqlMap = null;
          ??String resource = "SqlMapConfig.xml";
          ??try {
          ???//begin InputStream
          ???in = new FileInputStream("d:/sample.jpg");
          ???b = new byte[in.available()];
          ???in.read(b);
          ???in.close();

          ???//begin BlobTest
          ???blobTest = new BlobTest();
          ???blobTest.setMyblob(b);

          ???//begin SqlMapClient
          ???reader = Resources.getResourceAsReader(resource);
          ???sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
          ???sqlMap.startTransaction();
          ???sqlMap.insert("insertBlob", blobTest);
          ???sqlMap.commitTransaction();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????sqlMap.endTransaction();
          ???} catch (Exception e1) {
          ????e1.printStackTrace();
          ???}
          ??}
          ?}
          }

          ?

          取出 程序如下:

          ?

          import java.io.*;

          import com.ibatis.sqlmap.client.*;
          import com.ibatis.common.resources.*;

          import bo.*;

          public class Tester {

          ?public void DoTest() {
          ??Reader reader = null;
          ??OutputStream out = null;
          ??BlobTest blobTest = null;
          ??SqlMapClient sqlMap = null;
          ??String resource = "SqlMapConfig.xml";
          ??try {
          ???//begin BlobTest
          ???blobTest = new BlobTest();
          ???blobTest.setId(new Integer(21));

          ???//begin SqlMapClient
          ???reader = Resources.getResourceAsReader(resource);
          ???sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
          ???blobTest = (BlobTest) sqlMap.queryForObject("getBlob", blobTest);

          ???//begin OutputStream
          ???out = new FileOutputStream("d:/sample.jpg");
          ???out.write(blobTest.getMyblob());
          ???out.close();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????sqlMap.endTransaction();
          ???} catch (Exception e1) {
          ????e1.printStackTrace();
          ???}
          ??}
          ?}
          }

          ?

          iBATIS SQL Maps MySQL BLOB

          ??? 這個主題很簡單,需要注意映射文件 insert 元素主鍵生成方式, 寫入、 取出 程序和上面的 SQL Server 一樣

          ?

          ??? <insert id="insertBlob" parameterClass="bo.BlobTest">
          ????? <![CDATA[
          ??????? insert into blob_test (myblob) values (#myblob#)
          ????? ]]>
          ????? <selectKey resultClass="java.lang.Integer" keyProperty="id">
          ??? <![CDATA[
          ????????? select last_insert_id();
          ??? ]]>
          ????? </selectKey>
          ? </insert>
          ?

          iBATIS SQL Maps Oracle BLOB

          ??? 使用 Oracle LONG RAW 類型, 注意映射文件 insert 元素主鍵生成方式, 寫入、 取出 程序和上面的 SQL Server 一樣

          ?

          ??? <insert id="insertBlob" parameterClass="bo.BlobTest">
          ????? <selectKey resultClass="int" keyProperty="id">
          ??????? <![CDATA[
          ????????? select hibernate_sequence.nextval from dual
          ??????? ]]>
          ????? </selectKey>
          ????? <![CDATA[
          ??????? insert into blob_test (id,myblob) values (#id#,#myblob#)
          ????? ]]>
          ??? </insert>
          ?

          如果你一定要用 Oracle BLOB 類型,接著往下看:

          ??? iBATIS 2.0.9 以前,處理 Oracle BLOB 類型相當麻煩,要自己實現 TypeHandlerCallback 接口。 iBATIS 2.0.9 的出現使一切都簡單了,寫入、 取出 程序和上面的 SQL Server 一樣。

          http://java.ccidnet.com/art/297/20051117/374459_1.html

          posted on 2006-06-18 15:07 船長 閱讀(1177) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 延长县| 得荣县| 靖远县| 普兰店市| 宣武区| 长海县| 武汉市| 新邵县| 田林县| 平阴县| 宜昌市| 宝清县| 延边| 巩留县| 固始县| 平阴县| 建昌县| 宁远县| 敦煌市| 遂川县| 永昌县| 包头市| 宾阳县| 台东市| 宿州市| 许昌县| 昌吉市| 互助| 江西省| 洛阳市| 平乐县| 修武县| 临沂市| 虹口区| 温州市| 行唐县| 渭南市| 安溪县| 车险| 梧州市| 桐乡市|