热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

hibernate存取json数据的代码分析

这篇文章主要介绍了hibernate存取json数据的代码分析,需要的朋友可以参考下

一、场景

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


推荐阅读
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 在网页开发中,页面加载速度是一个关键的用户体验因素。为了提升加载效率,避免在PageLoad事件中进行大量数据绑定操作,可以采用异步加载和特定控件来优化页面加载过程。 ... [详细]
  • 探讨在循环中调用$.post()时,回调函数为何会在循环结束后才开始执行,并提供解决方案和优化建议。 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
author-avatar
手机用户2502939987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有