一、場景
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)惠信息:
二、分析
如上優(yōu)惠信息有如下特點:
1、只用于展示,不會涉及修改;
2、一旦訂單支付成功,不會再改變;
3、數(shù)據(jù)量不會很大。
三、解決方案
1、最簡單的解決方案是關(guān)聯(lián)表:
但這種解決方案需要連表進行查詢,感覺是沒有必要的,畢竟只是展示數(shù)據(jù),用關(guān)聯(lián)表有點殺雞用牛刀的感覺。
2、json解決方案:
通過如上思路我們可以解決許多類似的問題。
3、代碼示例:
1、模型類:
java代碼
1
2
3
4
|
public class ordermodel { 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