這篇文章將為大家詳細(xì)講解有關(guān)json數(shù)據(jù)怎么利用hibernate進(jìn)行存取,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
成都創(chuàng)新互聯(lián)主營(yíng)古藺網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,古藺h5重慶小程序開(kāi)發(fā)公司搭建,古藺網(wǎng)站營(yíng)銷推廣歡迎古藺等地區(qū)企業(yè)咨詢
一、場(chǎng)景
public class OrderModel { private ListfavorableDescList; }
訂單中會(huì)存儲(chǔ)一些優(yōu)惠信息,方便頁(yè)面展示時(shí)使用,如:
1、滿100減50
2、參與【老會(huì)員真情回饋——精品課程體驗(yàn)活動(dòng)】,僅需支付200.00學(xué)幣
3、【Oracle + PL/SQL 實(shí)戰(zhàn)】套裝課程的【搶購(gòu)】活動(dòng),優(yōu)惠120.00學(xué)幣
……等等
如圖所示,我們?cè)陧?yè)面給用戶展示他們參與的優(yōu)惠信息:
二、分析
如上優(yōu)惠信息有如下特點(diǎn):
1、只用于展示,不會(huì)涉及修改;
2、一旦訂單支付成功,不會(huì)再改變;
3、數(shù)據(jù)量不會(huì)很大。
三、解決方案
1、最簡(jiǎn)單的解決方案是關(guān)聯(lián)表:
但這種解決方案需要連表進(jìn)行查詢,感覺(jué)是沒(méi)有必要的,畢竟只是展示數(shù)據(jù),用關(guān)聯(lián)表有點(diǎn)殺雞用牛刀的感覺(jué)。
2、JSON解決方案:
通過(guò)如上思路我們可以解決許多類似的問(wèn)題。
3、代碼示例:
1、模型類:
Java代碼
public class OrderModel { @Type(type = "com.bjpowernode.framework.hibernate.type.JsonType") //① private ListfavorableDescList; }
①處使用我們自定義的Hibernate類型來(lái)進(jìn)行轉(zhuǎn)換,上邊代碼只有一部分
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讀取數(shù)據(jù),將其轉(zhuǎn)換為自定義類型后返回 * (此方法要求對(duì)克能出現(xiàn)null值進(jìn)行處理) * names中包含了當(dāng)前自定義類型的映射字段名稱 * @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進(jìn)行數(shù)據(jù)保存時(shí)被調(diào)用 * 我們可以通過(guò)PreparedStateme將自定義數(shù)據(jù)寫(xiě)入到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表字段 * @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()); } } /** * 提供自定義類型的完全復(fù)制方法 * 本方法將用構(gòu)造返回對(duì)象 * 當(dāng)nullSafeGet方法調(diào)用之后,我們獲得了自定義數(shù)據(jù)對(duì)象,在向用戶返回自定義數(shù)據(jù)之前, * deepCopy方法將被調(diào)用,它將根據(jù)自定義數(shù)據(jù)對(duì)象構(gòu)造一個(gè)完全拷貝,并將此拷貝返回給用戶 * 此時(shí)我們就得到了自定義數(shù)據(jù)對(duì)象的兩個(gè)版本,第一個(gè)是從數(shù)據(jù)庫(kù)讀出的原始版本,其二是我們通過(guò) * deepCopy方法構(gòu)造的復(fù)制版本,原始的版本將有Hibernate維護(hù),復(fù)制版由用戶使用。原始版本用作 * 稍后的臟數(shù)據(jù)檢查依據(jù);Hibernate將在臟數(shù)據(jù)檢查過(guò)程中將兩個(gè)版本的數(shù)據(jù)進(jìn)行對(duì)比(通過(guò)調(diào)用 * equals方法),如果數(shù)據(jù)發(fā)生了變化(equals方法返回false),則執(zhí)行對(duì)應(yīng)的持久化操作 * * @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; } /** * 本類型實(shí)例是否可變 * @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 JsonListextends ArrayList implements Cloneable { }
就這么簡(jiǎn)單,歡迎大家討論。
有人說(shuō)有性能問(wèn)題,我寫(xiě)了個(gè)測(cè)試用例:
測(cè)試機(jī)器:CPU:p8700(雙核@2.53GHZ) 內(nèi)存:2G
一、插入
1、JSON方式插入10w條
create 100000 elapsed time(millis):21031
2、關(guān)聯(lián)表插入10w條
create 100000 elapsed time(millis):79219
JSON性能遠(yuǎn)遠(yuǎn)好于關(guān)聯(lián)表,關(guān)聯(lián)表要插入兩個(gè)表。
二、查詢
1、JSON方式分頁(yè)(100條一頁(yè))查詢10w條
select 100000 elapsed time(millis):146047
2、關(guān)聯(lián)表分頁(yè)(100條一頁(yè))查詢10w條
select 100000 elapsed time(millis):275375
JSON性能遠(yuǎn)遠(yuǎn)好于關(guān)聯(lián)表,關(guān)聯(lián)表需要join連表查詢。
JSON方式的缺點(diǎn):分析統(tǒng)計(jì)等查詢是雞肋、大數(shù)據(jù)量是雞肋(一列存儲(chǔ)數(shù)據(jù)量不可能太大)。
關(guān)于json數(shù)據(jù)怎么利用hibernate進(jìn)行存取就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。