中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

json數據怎么利用hibernate進行存取

發布時間:2020-12-04 17:23:31 來源:億速云 閱讀:241 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關json數據怎么利用hibernate進行存取,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、場景

public class OrderModel {
private List<String> favorableDescList;
}

訂單中會存儲一些優惠信息,方便頁面展示時使用,如:

1、滿100減50

2、參與【老會員真情回饋——精品課程體驗活動】,僅需支付200.00學幣

3、【Oracle + PL/SQL 實戰】套裝課程的【搶購】活動,優惠120.00學幣
……等等

如圖所示,我們在頁面給用戶展示他們參與的優惠信息:

json數據怎么利用hibernate進行存取

二、分析

如上優惠信息有如下特點:

1、只用于展示,不會涉及修改;

2、一旦訂單支付成功,不會再改變;

3、數據量不會很大。

三、解決方案

1、最簡單的解決方案是關聯表:

json數據怎么利用hibernate進行存取

 但這種解決方案需要連表進行查詢,感覺是沒有必要的,畢竟只是展示數據,用關聯表有點殺雞用牛刀的感覺。

2、JSON解決方案:

json數據怎么利用hibernate進行存取

通過如上思路我們可以解決許多類似的問題。 

3、代碼示例: 

1、模型類:

Java代碼  

public class OrderModel { 
 @Type(type = "com.bjpowernode.framework.hibernate.type.JsonType") //① 
 private List<String> favorableDescList; 
} 

 ①處使用我們自定義的Hibernate類型來進行轉換,上邊代碼只有一部分 

2、自定義JsonType

Java代碼  

package com.bjpowernode.framework.hibernate.type; 
//省略import 
public class JsonType implements UserType, Serializable { 
 private String json; 
 @Override 
 public int[] sqlTypes() { 
  return new int[] {Hibernate.STRING.sqlType()}; 
 } 
 @Override 
 public Class returnedClass() { 
  return JsonList.class; 
 } 
 @Override 
 public boolean equals(Object o, Object o1) throws HibernateException { 
  if (o == o1) { 
   return true; 
  } 
  if (o == null || o == null) { 
   return false; 
  } 
  return o.equals(o1); 
 } 
 @Override 
 public int hashCode(Object o) throws HibernateException { 
  return o.hashCode(); 
 } 
 /** 
 * 從JDBC ResultSet讀取數據,將其轉換為自定義類型后返回 
 * (此方法要求對克能出現null值進行處理) 
 * names中包含了當前自定義類型的映射字段名稱 
 * @param resultSet 
 * @param names 
 * @param owner 
 * @return 
 * @throws HibernateException 
 * @throws SQLException 
 */ 
 @Override 
 public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException { 
  String json = resultSet.getString(names[0]); 
  if(json == null || json.trim().length() == 0) { 
   return new JsonList(); 
  } 
  return JSONArray.toList(JSONArray.fromObject(json), JsonList.class); 
 } 
  /** 
 * 本方法將在Hibernate進行數據保存時被調用 
 * 我們可以通過PreparedStateme將自定義數據寫入到對應的數據庫表字段 
 * @param preparedStatement 
 * @param value 
 * @param i 
 * @throws HibernateException 
 * @throws SQLException 
 */ 
 @Override 
 public void nullSafeSet(PreparedStatement preparedStatement, Object value, int i) throws HibernateException, SQLException { 
  if(value == null) { 
   preparedStatement.setNull(i, Hibernate.STRING.sqlType()); 
  } else { 
   preparedStatement.setString(i, JSONArray.fromObject(value).toString()); 
  } 
 } 
 /** 
  * 提供自定義類型的完全復制方法 
  * 本方法將用構造返回對象 
  * 當nullSafeGet方法調用之后,我們獲得了自定義數據對象,在向用戶返回自定義數據之前, 
  * deepCopy方法將被調用,它將根據自定義數據對象構造一個完全拷貝,并將此拷貝返回給用戶 
  * 此時我們就得到了自定義數據對象的兩個版本,第一個是從數據庫讀出的原始版本,其二是我們通過 
  * deepCopy方法構造的復制版本,原始的版本將有Hibernate維護,復制版由用戶使用。原始版本用作 
  * 稍后的臟數據檢查依據;Hibernate將在臟數據檢查過程中將兩個版本的數據進行對比(通過調用 
  * equals方法),如果數據發生了變化(equals方法返回false),則執行對應的持久化操作 
  * 
  * @param o 
  * @return 
  * @throws HibernateException 
  */ 
 @Override 
 public Object deepCopy(Object o) throws HibernateException { 
  if(o == null) return null; 
  JsonList jsonList = new JsonList(); 
  jsonList.addAll((List)o); 
  return jsonList; 
 } 
 /** 
  * 本類型實例是否可變 
  * @return 
 */ 
 @Override 
 public boolean isMutable() { 
  return true; 
 } 
 /* 序列化 */ 
 @Override 
 public Serializable disassemble(Object value) throws HibernateException { 
  return ((Serializable)value); 
 } 
 /* 反序列化 */ 
 @Override 
 public Object assemble(Serializable cached, Object owner) throws HibernateException { 
  return cached; 
 } 
 @Override 
 public Object replace(Object original, Object target, Object owner) throws HibernateException { 
  return original; 
 } 
} 

JSON框架使用的是json-lib 2.1。 

3、自定義JsonList

Java代碼  

package com.bjpowernode.framework.hibernate; 
public class JsonList<T> extends ArrayList implements Cloneable { 
} 

就這么簡單,歡迎大家討論。

有人說有性能問題,我寫了個測試用例:

測試機器:CPU:p8700(雙核@2.53GHZ)  內存:2G 

一、插入

1、JSON方式插入10w條

create 100000 elapsed time(millis):21031

2、關聯表插入10w條

create 100000 elapsed time(millis):79219 

JSON性能遠遠好于關聯表,關聯表要插入兩個表。 

二、查詢

1、JSON方式分頁(100條一頁)查詢10w條

select 100000 elapsed time(millis):146047

2、關聯表分頁(100條一頁)查詢10w條

select 100000 elapsed time(millis):275375 

JSON性能遠遠好于關聯表,關聯表需要join連表查詢。

JSON方式的缺點:分析統計等查詢是雞肋、大數據量是雞肋(一列存儲數據量不可能太大)。 

關于json數據怎么利用hibernate進行存取就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邹平县| 潞城市| 佛坪县| 获嘉县| 广安市| 贡嘎县| 济源市| 广宁县| 五河县| 明星| 昌宁县| 泗水县| 平遥县| 威信县| 突泉县| 威海市| 马尔康县| 抚远县| 安化县| 喀喇沁旗| 千阳县| 缙云县| 平安县| 三都| 达日县| 积石山| 隆昌县| 攀枝花市| 玉门市| 特克斯县| 临沭县| 砀山县| 永清县| 哈密市| 大余县| 霍邱县| 辽宁省| 渭南市| 利川市| 额济纳旗| 神木县|