全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

hibernate存取json数据的代码分析

一、场景

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

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数据的代码分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# hibernate  # json  # 数据  # 自定义  # 将在  # 我们可以  # 分页  # 购物车  # 小编  # 好于  # 的是  # 序列化  # 不可能  # 第一个  # 最多  # 在此  # 是从  # 杀鸡  # 将其  # 太大  # 给大家  # 将被  # 写了 


相关文章: 高端智能建站公司优选:品牌定制与SEO优化一站式服务  宝塔Windows建站如何避免显示默认IIS页面?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  公众号网站制作网页,微信公众号怎么制作?  网站制作需要会哪些技术,建立一个网站要花费多少?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  开封网站制作公司,网络用语开封是什么意思?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何通过免费商城建站系统源码自定义网站主题与功能?  如何在香港免费服务器上快速搭建网站?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  黑客如何通过漏洞一步步攻陷网站服务器?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何在景安服务器上快速搭建个人网站?  建设网站制作价格,怎样建立自己的公司网站?  如何在Tomcat中配置并部署网站项目?  制作网站怎么制作,*游戏网站怎么搭建?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何生成腾讯云建站专用兑换码?  表情包在线制作网站免费,表情包怎么弄?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  网站代码制作软件有哪些,如何生成自己网站的代码?  Android自定义控件实现温度旋转按钮效果  如何在IIS中配置站点IP、端口及主机头?  建站主机类型有哪些?如何正确选型  如何快速生成凡客建站的专业级图册?  网站制作软件有哪些,制图软件有哪些?  如何通过虚拟主机快速完成网站搭建?  如何用虚拟主机快速搭建网站?详细步骤解析  图册素材网站设计制作软件,图册的导出方式有几种?  如何规划企业建站流程的关键步骤?  建站之星备案是否影响网站上线时间?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何配置IIS站点权限与局域网访问?  建站之星多图banner生成与模板自定义指南  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  网站制作难吗安全吗,做一个网站需要多久时间?  小型网站建站如何选择虚拟主机?  Python多线程使用规范_线程安全解析【教程】  香港服务器租用每月最低只需15元?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  5种Android数据存储方式汇总  如何在Windows服务器上快速搭建网站?  教学网站制作软件,学习*后期制作的网站有哪些?  如何在云主机快速搭建网站站点? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。