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

(0)

相关推荐

  • hibernate存取json数据的代码分析

    一.场景 public class OrderModel { private List<String> favorableDescList; } 订单中会存储一些优惠信息,方便页面展示时使用,如: 1.满100减50 2.参与[老会员真情回馈--精品课程体验活动],仅需支付200.00学币 3.[Oracle + PL/SQL 实战]套装课程的[抢购]活动,优惠120.00学币 --等等 如图所示,我们在页面给用户展示他们参与的优惠信息: 二.分析 如上优惠信息有如下特点: 1.只用于展示,不

  • Android解析json数据示例代码(三种方式)

    Json数据 复制代码 代码如下: [{"code":"110000","sheng":"11","di":"00","xian":"00","name":"北京市","level":1},{"code":"659004","sheng&q

  • app 请求服务器json数据实例代码

    请求服务器json数据格式代码,详细如下: var url=obj.serUrl; //此处为请求服务器的路径url,放上自己的请求路径: var data = {//date里面携带参数,根据服务器要求填写好参数,看清楚是字符串类型,还是整型. action:'getUser', username:loginInfowode, password:passwordwode }; //以下就是进入ajax请求服务器数据: mui.ajax({ type:"post",//请求格式,分为p

  • jquery解析JSON数据示例代码

    这里可以找到json.js的代码,后面还需要formutil.js的代码及MD5.js 用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先给出JSON字符串集,字符串集如下: 代码如下: 复制代码 代码如下: var data=" { root: [ {name:'1',value

  • jquery 获取json数据实现代码

    复制代码 代码如下: //栏目 //发送ajax请求 $.getJSON( "../../../Templet/GetInfoHandler.ashx", //产生JSON数据的服务端页面 {id: "0", sid: "1;2;3", rid: Math.round(Math.random() * 10) }, //向服务器发出的查询字符串 //对返回的JSON数据进行处理 function(json) { //循环取json中的数据,并呈现在

  • php json_encode()函数返回json数据实例代码

    json_encode()函数用法. echo json_encode(array('a'=>'bbbb','c'=>'ddddd'); 这样就会生成一个标准的json格式的数据 代码如下 <?php //需要执行的SQL语句 //单条 $sql="select id,name from tbl_user where id=1"; //多条数据 //$sql="select id,name from tbl_user"; //调用conn.php文

  • python 发送json数据操作实例分析

    本文实例讲述了python 发送json数据操作.分享给大家供大家参考,具体如下: # !/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 import urllib import cookielib import json import httplib import re import requests from lxml import etree import StringIO import time s = request

  • Android解析JSON数据的方法分析

    本文实例讲述了Android解析JSON数据的方法.分享给大家供大家参考,具体如下: JSON作为一种"轻量"的数据结构传递数据,在JS中有广泛的应用 Google公司对JSON的解析提供了gson.jar这个包,它不依赖于其他任何JAR包:自从Android3.0中已经合入了该解析器的功能,但之前的版本是没有的. findViewById(R.id.parseBtn).setOnClickListener(new OnClickListener(){ @Override public

  • MYSQL中的json数据操作代码

    目录 MYSQL中的json数据操作 1.2 基础查询操作 1.2.1 一般json查询 1.2.2 多个条件查询 1.2.3 json中多个字段关系查询 1.2.4 关联表查询 1.3 JSON函数操作 1.3.1 官方json函数 1.3.2 ->.->>区别 1.3.2.2 在where条件中使用 1.3.3 json_extract():从json中返回想要的字段 1.3.4 JSON_CONTAINS():JSON格式数据是否在字段中包含特定对象 1.3.5 SON_OBJEC

  • java读取其他服务接口返回的json数据示例代码

    前言 现在开发大部分都是服务化或者微服务,数据交换都是跨服务的,这里记录java调取其他接口的方法,下面话不多说了,来一起看看详细的介绍吧. java代码如下: /** * *<p>类描述:接口读取工具.</p> */ public class ReadUrlUtil { public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { InputStream is =

随机推荐