一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - hibernate存取json數(shù)據(jù)的代碼分析

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

2021-01-03 14:35動力節(jié)點 Java教程

這篇文章主要介紹了hibernate存取json數(shù)據(jù)的代碼分析,需要的朋友可以參考下

一、場景

?
1
2
3
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)惠信息:

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

二、分析

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

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

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

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

三、解決方案

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

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

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

2、json解決方案:

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

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

3、代碼示例: 

1、模型類:

java代碼  

?
1
2
3
4
public class ordermodel {
 @type(type = "com.bjpowernode.framework.hibernate.type.jsontype") //①
 private list<string> favorabledesclist;
}

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

2、自定義jsontype

java代碼  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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值進行處理)
 * 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進行數(shù)據(jù)保存時被調(diào)用
 * 我們可以通過preparedstateme將自定義數(shù)據(jù)寫入到對應的數(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());
  }
 }
 /**
  * 提供自定義類型的完全復制方法
  * 本方法將用構(gòu)造返回對象
  * 當nullsafeget方法調(diào)用之后,我們獲得了自定義數(shù)據(jù)對象,在向用戶返回自定義數(shù)據(jù)之前,
  * deepcopy方法將被調(diào)用,它將根據(jù)自定義數(shù)據(jù)對象構(gòu)造一個完全拷貝,并將此拷貝返回給用戶
  * 此時我們就得到了自定義數(shù)據(jù)對象的兩個版本,第一個是從數(shù)據(jù)庫讀出的原始版本,其二是我們通過
  * deepcopy方法構(gòu)造的復制版本,原始的版本將有hibernate維護,復制版由用戶使用。原始版本用作
  * 稍后的臟數(shù)據(jù)檢查依據(jù);hibernate將在臟數(shù)據(jù)檢查過程中將兩個版本的數(shù)據(jù)進行對比(通過調(diào)用
  * equals方法),如果數(shù)據(jù)發(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代碼  

?
1
2
3
package com.bjpowernode.framework.hibernate;
public class jsonlist<t> extends arraylist implements cloneable {
}

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

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

測試機器:cpu:p8700(雙核@2.53ghz)  內(nèi)存:2g 

一、插入

1、json方式插入10w條

?
1
create 100000 elapsed time(millis):21031

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

?
1
create 100000 elapsed time(millis):79219

json性能遠遠好于關(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性能遠遠好于關(guān)聯(lián)表,關(guān)聯(lián)表需要join連表查詢。

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

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

總結(jié)

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

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wvqd.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美成末人一区二区三区 | 天天摸日日舔 | 国产拍拍拍免费专区在线观看 | 色先锋 影音先锋a 资源站 | 成年人视频在线免费观看 | 99久久一香蕉国产线看观看 | 色婷婷久久综合中文久久一本` | 91大片淫黄大片在线天堂 | 女人狂吮男人命根gif视频 | 歪歪漫画a漫入口 | 亚洲欧美日韩另类精品一区二区三区 | 爽新片xxxxxxx | 波多野结衣之双方调教在线观看 | 齐天大性之七仙女欲春迅雷链接 | 97导航| 国产真实一区二区三区 | 2021国产精品露脸在线 | 黑人粗长大战亚洲女 | 亚洲天堂视频在线免费观看 | 艹b视频在线观看 | 亚洲H成年动漫在线观看不卡 | a级黄色视屏 | 精品欧美男同同性videos | 黄德维| xxxxxx性受 | 免费高清特黄a 大片 | 日本高清va不卡视频在线观看 | 午夜亚洲精品久久久久久 | 激情乱文| 青青国产在线观看 | 四虎影视免费观看免费观看 | 欧美成人精品福利在线视频 | 国色天香论坛社区在线视频 | 星空无限传媒xk8129 | brazzersvideo欧美最新 | 久久aa毛片免费播放嗯啊 | 性生大片免费看 | 美女林柏欣21p人体之仓之梦 | caopren免费视频国产 | 美女露尿口 | 青青在线 |