Java: чтение BLOB-объектов из Oracle - PullRequest
1 голос
/ 09 декабря 2011

У меня есть этот код, который преобразует Treemap в байты и сохраняет их в базе данных (Oracle 11g). Теперь это хранилище работает нормально. Я хочу получить карту сейчас, но она находится в байтах в поле BLOB-объектов. Как я могу получить и восстановить карту?

Код для хранения карты:

 public void StoreMapDB(TreeMap<DateTime, Integer> map) throws
        IOException, FileNotFoundException{

       try {
          Connection con = null;

          Class.forName("oracle.jdbc.driver.OracleDriver");
          con=DriverManager.getConnection(
            "jdbc:oracle:thin:@dsds",
            "dsdsd",
            "XXdsdsX");
          con.setAutoCommit(false);
          ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
          ObjectOutputStream out = new ObjectOutputStream(bos);
          out = new ObjectOutputStream(bos) ;
          out.writeObject(map);
          out.close();

          byte[] buf = bos.toByteArray();
          PreparedStatement prepareStatement = con.prepareStatement("INSERT INTO 
           SMD_DATESTREEMAP VALUES(?,?)");
          prepareStatement.setLong(1, 2);
          prepareStatement.setBinaryStream(2, new ByteArrayInputStream(buf),
           buf.length);
          prepareStatement.executeUpdate();


         // insertMap.executeUpdate();
          con.commit();
    } catch(Exception e){
        System.err.print(e);
    }
}

P.S. Я отредактировал этот код, но не думаю, что он работает, потому что он отображает размер найденной карты как 0, где он должен быть 366.

  public TreeMap<DateTime, Integer> retrieveMapDB()throws IOException,
        SQLException{

    try {
        Connection con = null;

        Class.forName("oracle.jdbc.driver.OracleDriver");
        con=DriverManager.getConnection(
            "jdbc:oracle:thin:@oradbfdfdt05:f:fdfd",
            "cxcx",
            "hpdbcxcxsmb");
        con.setAutoCommit(false);
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        String query = "SELECT TREEMAP FROM SMD_DATESTREEMAP WHERE id = ?";
        try {
            pstmt = con.prepareStatement(query);
            int id = 1;
            pstmt.setInt(1, id);

            rs = pstmt.executeQuery();
            while(rs.next()){
                ByteArrayInputStream bos = new 
           ByteArrayInputStream(rs.getBytes("TREEMAP")) ;
                ObjectInputStream out = new ObjectInputStream(bos);
                retrievedmap=(TreeMap<DateTime, Integer>)out.readObject();
            }


        }catch(IOException ioe){
            System.err.print(ioe);
        }
    }catch(ClassNotFoundException cnfe){
        System.err.print(cnfe);
    }
  return retrievedmap;
}

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Вы можете получить объект InputStream с помощью метода ResultSet.getBinaryStream().

PreparedStatement prepareStatement = con.prepareStatement("select * from SMD_DATESTREEMAP");
ResultSet rs=prepareStatement.executeQuery();

while(rs.next())
      {
       oracle.jdbc.driver.OracleBlobInputStream bos=(oracle.jdbc.driver.OracleBlobInputStream) rs.getBinaryStream(2) ;

       ObjectInputStream out = new ObjectInputStream(bos);

       map=(TreeMap<DateTime, Integer>)out.readObject();
       ...
      }

Вы можете записать байтовый массив вместо двоичного потока.

      ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
      ObjectOutputStream out = new ObjectOutputStream(bos);
      out.writeObject(map);
      out.flush();
      out.close();
      byte[] buf = bos.toByteArray();

      PreparedStatement prepareStatement = con.prepareStatement("INSERT INTO SMD_DATESTREEMAP VALUES(?,?)");
      prepareStatement.setInt(1, 1);
      prepareStatement.setBytes(2, buf);
      prepareStatement.executeUpdate();
      prepareStatement.close();

и прочитать байтовый массив:

     while(rs.next())
      { 
       byte []buf=rs.getBytes(2);
       ByteArrayInputStream bos=new ByteArrayInputStream(buf);
       ObjectInputStream out = new ObjectInputStream(bos);
       map=(TreeMap<DateTime, Integer>)out.readObject();
       ..
       }
1 голос
/ 10 декабря 2011

спасибо AVD за большую поддержку, а также это больше всего сработало с моим кодом / вопросом.Таким образом, ответ здесь ... BLOB от Oracle

И фрагмент, который работал в дополнение к ответу AVD:и если кому-то понадобятся разъяснения, я буду более чем счастлив: D

...