Mysql和Oracle在对clob和blob字段的处理

  1. 一、MySQL与Oracle数据库如何处理Clob,Blob数据类型  
  2.   
  3. (1)不通数据库中对应clob,blob的类型如下:  
  4.    MySQL中:clob对应text,blob对应blob  
  5.    DB2/Oracle中:clob对应clob,blob对应blob  
  6.   
  7. (2)domain中对应的类型:  
  8.    clob对应String,blob对应byte[]  
  9.    clob对应java.sql.Clob,blob对应java.sql.Blob  
  10.   
  11. (3)hibernate配置文件中对应类型:  
  12.    clob-->clob ,blob-->binary  
  13.    也可以直接使用数据库提供类型,例如:oracle.sql.Clob,oracle.sql.Blob  
  14.   
  15. 二、jdbc操作clob(以oracle为例)  
  16. 首先操作clob/blob不像操作varchar类型那样简单,插入步骤一般分为两步:第一步插入一个空值,第二步锁住此行,更新clob/blob字段。  
  17.   
  18. //插入空值  
  19. conn.setAutoCommit(false);  
  20. String sql = "INSERT INTO T_FILE(NAME, FILE_CONTENT) VALUES ('Jambhala', EMPTY_CLOB())";  
  21. PreparedStatement pstmt = conn.prepareStatement(sql);   
  22. pstmt.executeUpdate();  
  23. //锁住此行  
  24. String sql_lockstr = "SELECT FILE_CONTENT FROM T_FILE WHERE NAME='Jambhala' FOR UPDATE";  
  25. pstmt = conn.prepareStatement(sql_lockstr);   
  26. ResultSet rs = pstmt.executeQuery();   
  27. oracle.sql.Clob clob = (oracle.sql.Clob)rs.getClob(1);  
  28. java.io.OutputStream writer = clob.getAsciiOutputStream();   
  29. byte[] temp = newFileContent.getBytes();   
  30. writer.write(temp);   
  31. writer.flush();   
  32. writer.close();  
  33. pstmt.close();  
  34.   
  35. 读取内容:  
  36. oracle.sql.Clob clob = rs.getClob("FILE_CONTENT");  
  37. if(clob != null){  
  38.     Reader is = clob.getCharacterStream();  
  39.     BufferedReader br = new BufferedReader(is);  
  40.     String s = br.readLine();  
  41.     while(s != null){  
  42.         content += s+"
    "
    ;  
  43.         s = br.readLine();  
  44.     }  
  45. }  
  46.   
  47. 三、jdbc操作blob  
  48. conn.setAutoCommit(false);  
  49. String sql = "INSERT INTO T_PHOTO(NAME, PHOTO) VALUES ('Jambhala', EMPTY_BLOB())";  
  50. pstmt = conn.prepareStatement(sql);   
  51. pstmt = conn.executeUpdate();  
  52. sql = "SELECT PHOTO FROM T_PHOTO WHERE NAME='Jambhala'";  
  53. pstmt = conn.prepareStatement(sql);   
  54. rs = pstmt.executeQuery(sql);  
  55. if(rs.next()){  
  56.    oracle.sql.Blob blob = (oracle.sql.Blob)rs.getBlob(1);  
  57. }  
  58. //write to a file  
  59. File file=new File("C:\\test.rar");  
  60. FileInputStream fin = new FileInputStream(file);  
  61. OutputStream out = blob.getBinaryOutputStream();  
  62. int count=-1,total=0;  
  63. byte[] data = new byte[blob.getBufferSize()];  
  64. while((count=fin.read(data)) != -1){  
  65.    total += count;  
  66.    out.write(data, 0, count);  
  67. }   
  68.   
  69. 四、hibernate处理clob  
  70. MyFile file = new MyFile();  
  71. file.setName("Jambhala");  
  72. file.setContent(Hibernate.createClob(""));  
  73. session.save(file);  
  74. session.flush();  
  75. session.refresh(file, LockMode.UPGRADE);  
  76. oracle.sql.Clob clob = (oracle.sql.Clob)file.getContent();  
  77. Writer pw = clob.getCharacterOutputStream();  
  78. pw.write(longText);   //写入长文本  
  79. pw.close();  
  80. session.close();  
  81.   
  82. 五、使用hibernate处理blob  
  83. 原理基本相同:  
  84. Photo photo = new Photo();  
  85. photo.setName("Jambhala");  
  86. photo.setPhoto(Hibernate.createBlob(""));  
  87. session.save(photo);  
  88. session.flush();  
  89.   
  90. session.refresh(photo, LockMode.UPGRADE);  //锁住此对象  
  91. oracle.sql.Blob blob = photo.getPhoto();   //取得此blob的指针  
  92. OutputStream out = blob.getBinaryOutputStream();  
  93. //写入一个文件  
  94. File f = new File("C:\\test.rar");  
  95. FileInputStream fin = new FileInputStream(f);  
  96. int count=-1,total=0;  
  97. byte[] data = new byte[(int)fin.available()];  
  98. out.write(data);  
  99. fin.close();  
  100. out.close();  
  101. session.flush();  
  102.   
  103.   
  104. String DRIVER = "oracle.jdbc.driver.OracleDriver";  
  105. //Oracle连接用URL  
  106. private static final String URL = "jdbc:oracle:thin:@testora:1521:orac";  
  107. //用户名  
  108. private static final String USER = "scott";  
  109. //密码  
  110. private static final String PASSWORD = "pswd";  
  111. //数据库连接  
  112. private static Connection conn = null;  
  113. //SQL语句对象  
  114. private static Statement stmt = null;  
  115. //@roseuid 3EDA089E02BC  
  116. public LobPros(){}  
  117.   
  118. //往数据库中插入一个新的Clob对象  
  119. //@param infile  数据文件  
  120. //@throws java.lang.Exception  
  121. //@roseuid 3EDA089E02BC  
  122. public static void clobInsert(String infile) throws Exception {  
  123.    //设定不自动提交  
  124.    boolean defaultCommit = conn.getAutoCommit();   
  125.    conn.setAutoCommit(false);  
  126.    try{  
  127.     //插入一个空的Clob对象  
  128.         stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");  
  129.         //查询此Clob对象并锁定  
  130.         ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");  
  131.         while(rs.next()){  
  132.        //取出此Clob对象  
  133.            oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
  134.            //向Clob对象中写入数据  
  135.            BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());   
  136.            BufferedReader in = new BufferedReader(new FileReader(infile));  
  137.            int c;  
  138.            while((c=in.read()) != -1){  
  139.           out.write(c);  
  140.            }  
  141.            in.close();  
  142.            out.close();  
  143.         }  
  144.         //正式提交  
  145.         conn.commit();  
  146.    }catch(Exception e){  
  147.       //出错回滚  
  148.       conn.rollback();  
  149.       throw e;  
  150.    }  
  151.   
  152.    //恢复原提交状态  
  153.    conn.setAutoCommit(defaultCommit);  
  154. }  
  155.   
  156. //修改Clob对象(是在原Clob对象基础上进行覆盖式的修改)  
  157. //@param infile  数据文件  
  158. //@throws java.lang.Exception  
  159. //@roseuid 3EDA089E02BC  
  160. public static void clobModify(String infile) throws Exception {  
  161.    //设定不自动提交  
  162.    boolean defaultCommit = conn.getAutoCommit();   
  163.    conn.setAutoCommit(false);  
  164.    try{  
  165.     //查询Clob对象并锁定  
  166.         ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");  
  167.         while(rs.next()){  
  168.        //获取此Clob对象  
  169.            oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
  170.            //进行覆盖式修改  
  171.            BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());   
  172.            BufferedReader in = new BufferedReader(new FileReader(infile));   
  173.            int c;  
  174.            while ((c=in.read())!=-1) {   
  175.               out.write(c);   
  176.            }   
  177.            in.close();   
  178.            out.close();   
  179.         }  
  180.         //正式提交  
  181.         conn.commit();  
  182.    }catch(Exception e){  
  183.       //出错回滚  
  184.       conn.rollback();  
  185.       throw e;  
  186.    }  
  187.    //恢复原提交状态  
  188.    conn.setAutoCommit(defaultCommit);  
  189. }  
  190.   
  191. //替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象  
  192. //@param infile  数据文件  
  193. //@throws java.lang.Exception  
  194. //@roseuid 3EDA04BF01E1  
  195. public static void clobReplace(String infile) throws Exception {  
  196.    //设定不自动提交  
  197.    boolean defaultCommit = conn.getAutoCommit();  
  198.    conn.setAutoCommit(false);  
  199.    try{  
  200.     //清空原CLOB对象  
  201.         stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");  
  202.         //查询CLOB对象并锁定  
  203.         ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");  
  204.         while (rs.next()) {  
  205.        //获取此CLOB对象  
  206.            oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
  207.            //更新数据  
  208.            BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());  
  209.            BufferedReader in = new BufferedReader(new FileReader(infile));   
  210.            int c;  
  211.            while ((c=in.read())!=-1) {   
  212.           out.write(c);   
  213.        }   
  214.        in.close();   
  215.        out.close();  
  216.         }  
  217.     //正式提交  
  218.     conn.commit();  
  219.    }catch(Exception e){  
  220.     //出错回滚  
  221.     conn.rollback();   
  222.     throw e;  
  223.    }  
  224.    //恢复原提交状态  
  225.    conn.setAutoCommit(defaultCommit);  
  226. }  
  227.   
  228. //CLOB对象读取  
  229. //@param outfile  输出文件名  
  230. //@throws java.lang.Exception  
  231. //@roseuid 3EDA04D80116  
  232. public static void clobRead(String outfile) throws Exception {  
  233.    //设定不自动提交  
  234.    boolean defaultCommit = conn.getAutoCommit();  
  235.    conn.setAutoCommit(false);  
  236.    try{  
  237.         //查询CLOB对象  
  238.         ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");  
  239.         while (rs.next()) {  
  240.        //获取CLOB对象  
  241.            oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
  242.            //以字符形式输出  
  243.            BufferedReader in = new BufferedReader(clob.getCharacterStream());   
  244.            BufferedWriter out = new BufferedWriter(new FileWriter(outfile));   
  245.            int c;  
  246.            while ((c=in.read())!=-1) {  
  247.               out.write(c);  
  248.            }  
  249.        out.close();   
  250.        in.close();  
  251.         }  
  252.    }catch(Exception e){  
  253.        conn.rollback();   
  254.        throw e;  
  255.    }  
  256.    //恢复原提交状态  
  257.    conn.setAutoCommit(defaultCommit);  
  258. }  
  259.   
  260. //向数据库中插入一个新的BLOB对象   
  261. //@param infile  数据文件   
  262. //@throws java.lang.Exception   
  263. //@roseuid 3EDA04E300F6  
  264. public static void blobInsert(String infile) throws Exception {   
  265.    //设定不自动提交  
  266.    boolean defaultCommit = conn.getAutoCommit();   
  267.    conn.setAutoCommit(false);   
  268.    try {   
  269.     //插入一个空的BLOB对象   
  270.     stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())");   
  271.     //查询此BLOB对象并锁定   
  272.     ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");   
  273.     while (rs.next()) {   
  274.        //取出此BLOB对象   
  275.        oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
  276.        //向BLOB对象中写入数据   
  277.        BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());   
  278.        BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));   
  279.        int c;   
  280.        while ((c=in.read())!=-1) {   
  281.         out.write(c);   
  282.        }   
  283.        in.close();   
  284.        out.close();   
  285.     }   
  286.     //正式提交   
  287.     conn.commit();   
  288.     } catch (Exception e) {   
  289.     //出错回滚   
  290.     conn.rollback();   
  291.     throw e;   
  292.     }   
  293.     //恢复原提交状态   
  294.     conn.setAutoCommit(defaultCommit);   
  295. }   
  296.   
  297. //修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改)   
  298. //@param infile  数据文件   
  299. //@throws java.lang.Exception   
  300. //@roseuid 3EDA04E90106   
  301. public static void blobModify(String infile) throws Exception {   
  302.     //设定不自动提交   
  303.     boolean defaultCommit = conn.getAutoCommit();   
  304.     conn.setAutoCommit(false);   
  305.     try {   
  306.     //查询BLOB对象并锁定   
  307.     ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");   
  308.     while (rs.next()) {   
  309.        //取出此BLOB对象   
  310.        oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
  311.        //向BLOB对象中写入数据   
  312.        BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());   
  313.        BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));   
  314.        int c;   
  315.        while ((c=in.read())!=-1) {   
  316.           out.write(c);   
  317.        }   
  318.        in.close();   
  319.        out.close();   
  320.     }   
  321.     //正式提交   
  322.     conn.commit();   
  323.     } catch (Exception e) {   
  324.     //出错回滚   
  325.     conn.rollback();   
  326.     throw e;   
  327.     }   
  328.     //恢复原提交状态   
  329.     conn.setAutoCommit(defaultCommit);   
  330. }   
  331.   
  332. //替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象)   
  333. //@param infile  数据文件   
  334. //@throws java.lang.Exception   
  335. //@roseuid 3EDA0505000C   
  336. public static void blobReplace(String infile) throws Exception {   
  337.    //设定不自动提交   
  338.    boolean defaultCommit = conn.getAutoCommit();   
  339.    conn.setAutoCommit(false);   
  340.    try {   
  341.     //清空原BLOB对象   
  342.     stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'");   
  343.     //查询此BLOB对象并锁定   
  344.     ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");   
  345.     while (rs.next()) {   
  346.        //取出此BLOB对象   
  347.        oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
  348.        //向BLOB对象中写入数据   
  349.        BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());   
  350.        BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));   
  351.        int c;   
  352.        while ((c=in.read())!=-1) {   
  353.           out.write(c);   
  354.        }   
  355.        in.close();   
  356.        out.close();   
  357.         }   
  358.     //正式提交   
  359.     conn.commit();   
  360.    } catch (Exception e) {   
  361.     //出错回滚   
  362.     conn.rollback();   
  363.     throw e;   
  364.    }   
  365.    //恢复原提交状态   
  366.    conn.setAutoCommit(defaultCommit);   
  367. }   
  368.   
  369. //BLOB对象读取   
  370. //@param outfile  输出文件名   
  371. //@throws java.lang.Exception   
  372. //@roseuid 3EDA050B003B   
  373. public static void blobRead(String outfile) throws Exception {   
  374.    //设定不自动提交   
  375.    boolean defaultCommit = conn.getAutoCommit();   
  376.    conn.setAutoCommit(false);   
  377.    try {   
  378.          //查询BLOB对象   
  379.      ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'");   
  380.      while (rs.next()) {   
  381.         //取出此BLOB对象   
  382.         oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
  383.         //以二进制形式输出   
  384.         BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));   
  385.         BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());   
  386.         int c;   
  387.         while ((c=in.read())!=-1) {   
  388.            out.write(c);   
  389.             }   
  390.         in.close();   
  391.         out.close();   
  392.          }   
  393.      //正式提交   
  394.          conn.commit();   
  395.    } catch (Exception e) {   
  396.     //出错回滚   
  397.     conn.rollback();   
  398.     throw e;   
  399.    }   
  400.    //恢复原提交状态   
  401.    conn.setAutoCommit(defaultCommit);   
  402. }   
  403.   
  404. //建立测试用表格   
  405. //@throws Exception   
  406. public static void createTables() throws Exception {   
  407.    try {   
  408.     stmt.executeUpdate("CREATE TABLE TEST_CLOB (ID NUMBER(3), CLOBCOL CLOB)");   
  409.     stmt.executeUpdate("CREATE TABLE TEST_BLOB (ID NUMBER(3), BLOBCOL BLOB)");   
  410.    } catch (Exception e) { }   
  411. }   
  412.   
  413. //@param args - 命令行参数   
  414. //@throws java.lang.Exception   
  415. //@roseuid 3EDA052002AC   
  416. public static void main(String[] args) throws Exception {   
  417.    //装载驱动,建立数据库连接   
  418.    Class.forName(DRIVER);   
  419.    conn = DriverManager.getConnection(URL,USER,PASSWORD);   
  420.    stmt = conn.createStatement();   
  421.    //建立测试表格   
  422.    createTables();   
  423.    //CLOB对象插入测试   
  424.    clobInsert("c:/clobInsert.txt");   
  425.    clobRead("c:/clobInsert.out");   
  426.    //CLOB对象修改测试   
  427.    clobModify("c:/clobModify.txt");   
  428.    clobRead("c:/clobModify.out");   
  429.    //CLOB对象替换测试   
  430.    clobReplace("c:/clobReplace.txt");   
  431.    clobRead("c:/clobReplace.out");   
  432.    //BLOB对象插入测试   
  433.    blobInsert("c:/blobInsert.doc");   
  434.    blobRead("c:/blobInsert.out");   
  435.    //BLOB对象修改测试   
  436.    blobModify("c:/blobModify.doc");   
  437.    blobRead("c:/blobModify.out");   
  438.    //BLOB对象替换测试   
  439.    blobReplace("c:/blobReplace.doc");   
  440.    blobRead("c:/bolbReplace.out");   
  441.    //关闭资源退出   
  442.    conn.close();   
  443.    System.exit(0);   
  444. }  

你可能感兴趣的:(java,转载)