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

hibernate存取json數(shù)據(jù)的代碼分析

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

一、場景

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

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

1、滿100減50

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

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

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

二、分析

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

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

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

3、數(shù)據(jù)量不會很大。

三、解決方案

1、最簡單的解決方案是關(guān)聯(lián)表:

 但這種解決方案需要連表進(jìn)行查詢,感覺是沒有必要的,畢竟只是展示數(shù)據(jù),用關(guān)聯(lián)表有點殺雞用牛刀的感覺。

2、JSON解決方案:

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

3、代碼示例: 

1、模型類:

Java代碼  

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

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

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讀取數(shù)據(jù),將其轉(zhuǎn)換為自定義類型后返回 
 * (此方法要求對克能出現(xiàn)null值進(jìn)行處理) 
 * names中包含了當(dāng)前自定義類型的映射字段名稱 
 * @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進(jìn)行數(shù)據(jù)保存時被調(diào)用 
 * 我們可以通過PreparedStateme將自定義數(shù)據(jù)寫入到對應(yīng)的數(shù)據(jù)庫表字段 
 * @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()); 
  } 
 } 
 /** 
  * 提供自定義類型的完全復(fù)制方法 
  * 本方法將用構(gòu)造返回對象 
  * 當(dāng)nullSafeGet方法調(diào)用之后,我們獲得了自定義數(shù)據(jù)對象,在向用戶返回自定義數(shù)據(jù)之前, 
  * deepCopy方法將被調(diào)用,它將根據(jù)自定義數(shù)據(jù)對象構(gòu)造一個完全拷貝,并將此拷貝返回給用戶 
  * 此時我們就得到了自定義數(shù)據(jù)對象的兩個版本,第一個是從數(shù)據(jù)庫讀出的原始版本,其二是我們通過 
  * deepCopy方法構(gòu)造的復(fù)制版本,原始的版本將有Hibernate維護(hù),復(fù)制版由用戶使用。原始版本用作 
  * 稍后的臟數(shù)據(jù)檢查依據(jù);Hibernate將在臟數(shù)據(jù)檢查過程中將兩個版本的數(shù)據(jù)進(jìn)行對比(通過調(diào)用 
  * equals方法),如果數(shù)據(jù)發(fā)生了變化(equals方法返回false),則執(zhí)行對應(yīng)的持久化操作 
  * 
  * @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 { 
} 

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

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

測試機(jī)器:CPU:p8700(雙核@2.53GHZ)  內(nèi)存:2G 

一、插入

1、JSON方式插入10w條

create 100000 elapsed time(millis):21031

2、關(guān)聯(lián)表插入10w條

create 100000 elapsed time(millis):79219 

JSON性能遠(yuǎn)遠(yuǎn)好于關(guān)聯(lián)表,關(guān)聯(lián)表要插入兩個表。 

二、查詢

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

select 100000 elapsed time(millis):146047

2、關(guān)聯(lián)表分頁(100條一頁)查詢10w條

select 100000 elapsed time(millis):275375 

JSON性能遠(yuǎn)遠(yuǎn)好于關(guān)聯(lián)表,關(guān)聯(lián)表需要join連表查詢。

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

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

總結(jié)

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

相關(guān)文章

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

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

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

    java實現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化

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

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

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

    SpringMVC Controller解析ajax參數(shù)過程詳解

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

    MyBatis-Plus標(biāo)簽@TableField之fill自動填充方式

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

    Arthas排查Kubernetes中應(yīng)用頻繁掛掉重啟異常

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

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

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

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

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

    springboot+shiro+jwtsession和token進(jìn)行身份驗證和授權(quán)

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

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

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

最新評論

胶南市| 荃湾区| 昭平县| 台湾省| 洮南市| 班戈县| 锡林浩特市| 平昌县| 凌海市| 津市市| 桂阳县| 古丈县| 鄄城县| 淮南市| 上杭县| 绥化市| 西盟| 叶城县| 延庆县| 沙湾县| 托克逊县| 澄江县| 田阳县| 海盐县| 滨海县| 灵武市| 博罗县| 溧阳市| 岐山县| 长寿区| 兰西县| 双流县| 图片| 红原县| 穆棱市| 吴忠市| 东辽县| 琼海市| 定日县| 永修县| 灵石县|