欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

hibernate存取json数据的代码分析

程序员文章站 2024-02-29 19:15:34
一、场景 public class ordermodel { private list favorabledesclist; }...

一、场景

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代码  

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

 ①处使用我们自定义的hibernate类型来进行转换,上边代码只有一部分 

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读取数据,将其转换为自定义类型后返回 
 * (此方法要求对克能出现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代码  

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

就这么简单,欢迎大家讨论。

有人说有性能问题,我写了个测试用例:

测试机器:cpu:p8700(双核@2.53ghz)  内存:2g 

一、插入

1、json方式插入10w条

create 100000 elapsed time(millis):21031

2、关联表插入10w条

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数据的代码分析,希望对大家有所帮助