真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

json數(shù)據(jù)怎么利用hibernate進(jìn)行存取

這篇文章將為大家詳細(xì)講解有關(guān)json數(shù)據(jù)怎么利用hibernate進(jìn)行存取,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

成都創(chuàng)新互聯(lián)主營(yíng)古藺網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,古藺h5重慶小程序開(kāi)發(fā)公司搭建,古藺網(wǎng)站營(yíng)銷推廣歡迎古藺等地區(qū)企業(yè)咨詢

一、場(chǎng)景

public class OrderModel {
private List favorableDescList;
}

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

1、滿100減50

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

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

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

json數(shù)據(jù)怎么利用hibernate進(jìn)行存取

二、分析

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

1、只用于展示,不會(huì)涉及修改;

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

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

三、解決方案

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

json數(shù)據(jù)怎么利用hibernate進(jìn)行存取

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

2、JSON解決方案:

json數(shù)據(jù)怎么利用hibernate進(jìn)行存取

通過(guò)如上思路我們可以解決許多類似的問(wèn)題。 

3、代碼示例: 

1、模型類:

Java代碼  

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

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

就這么簡(jiǎn)單,歡迎大家討論。

有人說(shuō)有性能問(wèn)題,我寫(xiě)了個(gè)測(cè)試用例:

測(cè)試機(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)表要插入兩個(gè)表。 

二、查詢

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

select 100000 elapsed time(millis):146047

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

select 100000 elapsed time(millis):275375 

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

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

關(guān)于json數(shù)據(jù)怎么利用hibernate進(jìn)行存取就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


文章標(biāo)題:json數(shù)據(jù)怎么利用hibernate進(jìn)行存取
文章鏈接:http://weahome.cn/article/peeojs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部