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

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

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

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

hibernate存取json數據的代碼分析

2021-01-03 14:35動力節點 Java教程

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

一、場景

?
1
2
3
public class ordermodel {
private list<string> favorabledesclist;
}

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

1、滿100減50

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

3、【oracle + pl/sql 實戰】套裝課程的【搶購】活動,優惠120.00學幣
……等等

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

hibernate存取json數據的代碼分析

二、分析

如上優惠信息有如下特點:

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

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

3、數據量不會很大。

三、解決方案

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

hibernate存取json數據的代碼分析

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

2、json解決方案:

hibernate存取json數據的代碼分析

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

3、代碼示例: 

1、模型類:

java代碼  

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

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

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讀取數據,將其轉換為自定義類型后返回
 * (此方法要求對克能出現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方法),如果數據發生了變化(equals方法返回false),則執行對應的持久化操作
  *
  * @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)  內存:2g 

一、插入

1、json方式插入10w條

?
1
create 100000 elapsed time(millis):21031

2、關聯表插入10w條

?
1
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方式的缺點:分析統計等查詢是雞肋、大數據量是雞肋(一列存儲數據量不可能太大)。 

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

總結

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎网址 | 日本mature乱子视频 | 美女被扒开屁股进去网 | asianfemdom妍妍女王 | 日韩毛片高清在线看 | 超大阿力gaysex | 18xxxx中国| 处女摘花视频 | 999国产精品亚洲77777 | 动漫美女胸被狂揉扒开吃奶动态图 | 91久久国产成人免费观看资源 | 欧美草逼网 | 99精品国产成人一区二区在线 | 糖心在线观看网 | 成年美女黄网色大观看全 | 成人18在线观看 | 国产在线视频自拍 | 無码一区中文字幕少妇熟女网站 | 国产成人在线影院 | 男人天堂网页 | 99久久精品6在线播放 | 波多野结衣教师未删减版 | 日本精工厂网址 | 国产成人咱精品视频免费网站 | 精品欧美一区二区在线观看欧美熟 | 毛片在线播放a | 四虎在线最新永久免费 | 精品国产乱码久久久人妻 | narutotsunade全彩雏田 | 青青操在线 | 我与肥熟老妇的性事 | 国色天香社区视频在线观看免费完整版 | 小SAO货叫大声点妓女 | 九九大香尹人视频免费 | 亚洲区一| 校花在公车上被内射好舒服 | 免费在线观看中文字幕 | 视频在线观看入口一二三2021 | 小舞丝袜调教喷水沦为肉奴 | 百合互慰吃奶互揉漫画 | 红色播放器 |