一、场景
1
2
3
|
public class ordermodel {
private list<string> favorabledesclist;
}
|
订单中会存储一些优惠信息,方便页面展示时使用,如:
1、满100减50
2、参与【老会员真情回馈——精品课程体验活动】,仅需支付200.00学币
3、【oracle + pl/sql 实战】套装课程的【抢购】活动,优惠120.00学币
……等等
如图所示,我们在页面给用户展示他们参与的优惠信息:
二、分析
如上优惠信息有如下特点:
1、只用于展示,不会涉及修改;
2、一旦订单支付成功,不会再改变;
3、数据量不会很大。
三、解决方案
1、最简单的解决方案是关联表:
但这种解决方案需要连表进行查询,感觉是没有必要的,毕竟只是展示数据,用关联表有点杀鸡用牛刀的感觉。
2、json解决方案:
通过如上思路我们可以解决许多类似的问题。
3、代码示例:
1、模型类:
java代码
1
2
3
4
|
public class ordermodel {
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