2012年6月28日 星期四

將Java的ArrayList(串列)寫到Mysql資料庫的blob欄位

案例: 收到的request資料中一個JSON格式的資料要保存,但為何不存JSON的字串就好?因為這個資料會不斷變動的,所以收到變動只要取出這個已將JSON轉成list的添加或刪除東西就好,不用再將JSON轉成list再轉回JSON存到DB去。 在Hibernate中是設定該欄位為type="java.sql.Blob",會自動在Mysql中建成DataType為LONGBLOB
下面是把JSON轉成list後,轉成blob型態存入DB
 
ObjectMapper mapper = new ObjectMapper();//用Jackson處理JSON
  Blob blob = null;
  try {
   SongResp dto = mapper.readValue(json, SongResp.class);
   List list = dto.getSongs();
   ByteArrayOutputStream bout = new ByteArrayOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(bout);
   oos.writeObject(list);
   bout.close();
   oos.close();
   byte[] asBytes = bout.toByteArray();
   blob = Hibernate.createBlob(asBytes);
   
  } catch (JsonParseException e) {
   e.printStackTrace();
  } catch (JsonMappingException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

以下是把DB中的該欄位取出成當時寫入的list
          

List list;
  Blob b = userDao.getUserData(id, dataType);
  try {
   if (b != null) {
    InputStream in = b.getBinaryStream();

    ObjectInputStream ooi = new ObjectInputStream(in);

    in.close();
    ooi.close();

    list = (List)ooi.readObject();
    return list;
   }
    
  } catch (SQLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }

沒有留言:

張貼留言

AI 時代的影響(2026-10-24的心得)

  寫了半個世紀程式、 曾出版《Clean Code》教全世界工程師把程式碼寫乾淨的 Robert C. Martin(Uncle Bob), 最近公開表示他已經有超過 95% 的時間不再逐行閱讀 AI 寫的程式碼。 一位一生都在強調「程式碼是寫給人讀的」宗師級人物,何以敢做出...