当前位置: 首页 > 知识库问答 >
问题:

将java对象存储为clob并检索

郑星雨
2023-03-14

我有一张甲骨文的桌子。在该表中,列之一是存储clob数据。在clob列中,必须插入对象作为clob。

import java.sql.*;   
import java.io.*;   
import oracle.jdbc.driver.OracleResultSet;  
import oracle.sql.CLOB;  
public class TestOracleClob implements Serializable{   
 public static void main(String[] args)   
 {   

  //create table test (id integer,content clob);  
  System.out.println("-------------------insert -----------------");  
  try{  
   DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());  
Connection con = DriverManager.getConnection ("oracle server",  
   "loginid", "loginpassword");   
  //Class.forName("oracle.jdbc.driver.OracleDriver");  

  con.setAutoCommit(false);  
  //Ok 1  
  String sql="insert into test values(1,empty_clob())";  
  Statement stmt=con.createStatement();  
  ResultSet rs=stmt.executeQuery(sql);  
  System.out.println("-------------------insert -----------------");  
  String sqll="select content from test where id=1 for update";      
  ResultSet rss=stmt.executeQuery(sqll);  

  if(rss.next()){  
   //CLOB clob = ((OracleResultSet)rss).getCLOB(1);  
 oracle.sql.CLOB  clob= (oracle.sql.CLOB)rss.getClob("content");  
   clob.putString(1,"here is a string which contains more than 4000 character");  
   sql="update test set content=? where id=1";  
   PreparedStatement pstmt=con.prepareStatement(sql);  
   pstmt.setClob(1,clob);  
   pstmt.executeUpdate();  
   pstmt.close();  
  }    
  con.commit();  

  //Ok 2  
  //String sql1="insert into test values(2,empty_clob())";  
  //ResultSet rs3=stmt.executeQuery(sql1);  
  String sql12="insert into test values(?,?)";  
  PreparedStatement pstmt1=con.prepareStatement(sql12);  
  pstmt1.setInt(1,2);  
  pstmt1.setClob(2,oracle.sql.CLOB.empty_lob());  
  pstmt1.executeUpdate();  

  String sqll2="select content from test where id=2 for update";  
  ResultSet rss2=stmt.executeQuery(sqll2);  
  if(rss2.next()){  
   CLOB clob = ((OracleResultSet)rss2).getCLOB(1);  
   clob.putString(1,"affffffffffdfdfdfdddddddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddfff");  
   String sql1="update test set content=? where id=2";  
   PreparedStatement pstmt=con.prepareStatement(sql1);  
   pstmt.setClob(1,clob);  
   pstmt.executeUpdate();  
   pstmt.close();  
  }  
  con.commit();  
  rss.close();  
  rss2.close();  
  pstmt1.close();  
  rs.close();  
  stmt.close();  
  con.close();  
  System.out.println("-------------insert ok-------------");  
  }catch(Exception e){  
   System.out.println("insert:"+e);  
  }  
  System.out.println("-------------------query -----------------");  
  try{  
  String content="";  
  //Class.forName("oracle.jdbc.driver.OracleDriver");  
  DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());  
  Connection con = DriverManager.getConnection ("oracleserver",  
   "id", "pass");   

  Statement stmt=con.createStatement();  
  String sql="select content from test where id=1";  
  ResultSet rs=stmt.executeQuery(sql);  
  if(rs.next()){  
   CLOB clob = ((OracleResultSet)rs).getCLOB(1);  
   if(clob!=null){  
   Reader is=clob.getCharacterStream();  
   BufferedReader br=new BufferedReader(is);  
   String s=br.readLine();  
   while(s!=null){  
    content+=s+",";  
    s=br.readLine();  
    }  
   }  

  }  
  rs.close();  
  stmt.close();  
  con.close();  
  System.out.println("clob:"+content);  
  System.out.println("-------------query ok-------------");  
  }catch(Exception ee){  
   System.out.println("Exception:"+ee);  
  }  

 }  
 } 

但是他们在CLOB中添加了字符串。但是我想把我的对象添加到CLOB中。有可能吗?

提前感谢你的帮助。

共有1个答案

公西运良
2023-03-14

我想您可以直接将对象序列化到clob中,如下所示:

Object o = new Object(); // anything serializable
ObjectOutputStream out = new ObjectOutputStream(clob.setAsciiStream(0));
out.writeObject(o);
out.close();

反之亦然:

ObjectInputStream in = new ObjectInputStream(clob.getAsciiStream());
Object o = in.readObject();
in.close();
 类似资料:
  • 我有一个超过5000个字符的字符串,我想用MyBatis将其保存为XMLTYPE。为此,我做了以下工作: 我在将字符串转换为CLOB时遇到了问题。 如果以第一种方式进行,则创建的CLOB对象是一个SerialClob有3个字段:BUF、LENG和CLOB;但是在这三个字段中,只有两个字段被填充:BUF(buffer)和LENG,但是CLOB是null。 但是如果我用第二种方法来做,我就创建了完整的

  • 在其中一个服务中,我们执行一些操作: 更新表A-使用带注释的查询调用方法,来自存储库的方法,扩展了JParePository。 从表B中选择(repository.findone(B_PK)) 修改从点2检索的对象 将修改的对象另存为新实体(repository.save(B_Object))

  • 问题内容: 我在伪操作环境中工作,我们在收到数据后制作新图像。有时,当输入新数据时,我们需要重新打开图像并更新该图像以创建合成,添加叠加等。除了添加到图像之外,还需要修改标题,图例等。 matplotlib中有内置的东西可以让我存储和重新加载matplotlib.pyplot对象以供以后使用吗?它需要保持对所有相关对象(包括图形,线条,图例等)的访问。也许咸菜是我想要的,但我对此表示怀疑。 问题答

  • 问题内容: 这就是事情- 我想在特定键下的redis中存储本机JS(node.js)对象(闪存套接字引用)。当我简单地做到这一点时,它存储为一个字符串。当我尝试获得价值时,我得到的只是一个字符串。 有机会工作吗?这是我的代码: 问题答案: 下载者:这里的上下文是SET命令,可以存储任意对象。 不,你不能那样做。您应该接受以下事实:Redis将所有内容存储为字符串(毕竟,协议是基于文本的)。Redi

  • 问题内容: 我需要保存一个用户模型,例如: 今天,我使用一个Set:users 在这个Set中,我有一个类似于user:alan的 成员在这个成员中,我上面有哈希 这很好,但是我只是想知道是否可以使用以下方法代替上述方法: 仍使用用户集(以轻松获取用户(成员)列表) 在此集中,仅使用键/值存储,例如: 键:alan值:上述用户哈希的字符串化版本 这样,检索记录将变得更加容易(然后我将不得不使用JS