最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

hibernate存取json數據的代碼分析

 更新時間:2017年09月13日 09:57:01   作者:動力節(jié)點  
這篇文章主要介紹了hibernate存取json數據的代碼分析,需要的朋友可以參考下

一、場景

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

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

1、滿100減50

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

3、【Oracle + PL/SQL 實戰(zhàn)】套裝課程的【搶購】活動,優(yōu)惠120.00學幣
……等等

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

二、分析

如上優(yōu)惠信息有如下特點:

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

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

3、數據量不會很大。

三、解決方案

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

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

2、JSON解決方案:

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

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方法),如果數據發(fā)生了變化(equals方法返回false),則執(zhí)行對應的持久化操作 
  * 
  * @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方式的缺點:分析統(tǒng)計等查詢是雞肋、大數據量是雞肋(一列存儲數據量不可能太大)。 

我的應用場景:優(yōu)惠信息、購物車持久化(每個用戶購物車最多50條)。

總結

以上所述是小編給大家介紹的hibernate存取json數據的代碼分析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Admin - SpringBoot + Maven 多啟動環(huán)境配置實例詳解

    Admin - SpringBoot + Maven 多啟動環(huán)境配置實例詳解

    這篇文章主要介紹了Admin - SpringBoot + Maven 多啟動環(huán)境配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • java實現圖片縮放、旋轉和馬賽克化

    java實現圖片縮放、旋轉和馬賽克化

    這篇文章主要為大家詳細介紹了java實現圖片縮放、旋轉和馬賽克化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Mybatis延遲加載原理和延遲加載配置詳解

    Mybatis延遲加載原理和延遲加載配置詳解

    這篇文章主要介紹了Mybatis延遲加載原理和延遲加載配置詳解,MyBatis中的延遲加載,也稱為懶加載,是指在進行表的關聯查詢時,按照設置延遲規(guī)則推遲對關聯對象的select查詢,需要的朋友可以參考下
    2023-10-10
  • SpringMVC Controller解析ajax參數過程詳解

    SpringMVC Controller解析ajax參數過程詳解

    這篇文章主要介紹了SpringMVC Controller解析ajax參數過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • MyBatis-Plus標簽@TableField之fill自動填充方式

    MyBatis-Plus標簽@TableField之fill自動填充方式

    這篇文章主要介紹了MyBatis-Plus標簽@TableField之fill自動填充方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Arthas排查Kubernetes中應用頻繁掛掉重啟異常

    Arthas排查Kubernetes中應用頻繁掛掉重啟異常

    這篇文章主要為大家介紹了Arthas排查Kubernetes中應用頻繁掛掉重啟的異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2022-02-02
  • Spring動態(tài)監(jiān)聽Nacos配置中心key值變更的實現方法

    Spring動態(tài)監(jiān)聽Nacos配置中心key值變更的實現方法

    Nacos本身提供支持監(jiān)聽配置變更的操作,但在使用起來,個人感覺不是很友好,無法精確到某個key的變更監(jiān)聽,所以本文小編給大家介紹了Spring動態(tài)監(jiān)聽Nacos配置中心key值變更的實現方法,需要的朋友可以參考下
    2024-08-08
  • Java實現微信發(fā)紅包

    Java實現微信發(fā)紅包

    這篇文章主要為大家詳細介紹了Java實現微信發(fā)紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • springboot+shiro+jwtsession和token進行身份驗證和授權

    springboot+shiro+jwtsession和token進行身份驗證和授權

    最近和別的軟件集成項目,需要提供給別人接口來進行數據傳輸,發(fā)現給他token后并不能訪問我的接口,拿postman試了下還真是不行,檢查代碼發(fā)現項目的shiro配置是通過session會話來校驗信息的,修改代碼兼容token和session
    2024-06-06
  • 使用MyBatis的動態(tài)SQL注解實現實體的CRUD操作代碼

    使用MyBatis的動態(tài)SQL注解實現實體的CRUD操作代碼

    在使用MyBatis進行數據庫操作時,動態(tài)SQL注解提供了一種優(yōu)雅的方式來編寫動態(tài)SQL語句,MyBatis?3.x?版本提供了下四個CRUD的高級注解,這些注解可以幫助開發(fā)者在Mapper接口中動態(tài)地構建SQL語句,本文給大家介紹了使用MyBatis的動態(tài)SQL注解實現實體的CRUD操作
    2024-06-06

最新評論

永德县| 抚宁县| 当阳市| 象山县| 宜兰县| 裕民县| 西宁市| 周至县| 林芝县| 大港区| 江阴市| 惠安县| 松原市| 温州市| 嵊州市| 柞水县| 乌拉特后旗| 宁德市| 北川| 济阳县| 龙里县| 吉安市| 黄龙县| 三台县| 武山县| 普兰县| 福海县| 灵寿县| 朝阳县| 洞头县| 镇江市| 益阳市| 北海市| 阳新县| 修武县| 潞城市| 西和县| 永善县| 穆棱市| 千阳县| 垣曲县|