<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
這裡我使用的是TimescaleDB,加了一個時間戳欄位,不過沒差。關於PostgreSQL中Json資料型別的操作,可以參考官網。
將TCP發過來的封包(通過訊息佇列發過來)解析出資料(一個資料包含有多幀,一幀中含有多條資訊),並和本地規則表的格式對應起來。以JsonLineMsg
實體類代表對應的一幀資料:
package tsdb.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import java.sql.Timestamp; @Data @AllArgsConstructor @NoArgsConstructor @ToString public class JsonLineMsg { private Timestamp timeStamp; // 時間戳 private String keyAndRuleData; // key value,key為根據規則表生成的唯一標識,value為TCP解析出的對應的資料。這個欄位對應資料庫中的Json型別欄位,String型別進入資料庫還需轉換為Json格式。 }
對應psql的表結構為:
上面JsonLineMsg
實體類的一個物件就代表的一幀中的所有資料項many(key:value)
,keyAndRuleData
欄位用來儲存所有資料項,在psql
中對應一個型別為json
(或jsonb
)的欄位。
為了查詢JSON中的欄位,在insert的過程中有些注意事項,如果插入時JSON格式不正確,查詢JSON欄位是總返回null
。
記錄一下:為了降低資料庫開啟關閉的耗時,每積累20幀持久化一次。
note:
一幀中包含多條資訊,一條資訊對應一個key:value
,所以每次從規則表生成的key和TCP解析出的value都要加到一個代表一幀所有資料的JSON串中。
要注意的程式碼如下:
// 儲存一幀的所有key:value StringBuilder json = new StringBuilder(); json.append("{"); // frmLen 幀中資訊個數 for (int j = 0; j < frmLen; j++) { StatRule stat = frm.getStat(j); assert stat != null; // 一條stat的key和value int key = stat.getKey(); long value = System.nanoTime(); // String value = ParseStat.Parse(datas, stat); json.append("""); // key左右必須加引號,key必為String型別 json.append(key); json.append("""); json.append(":"); // json.append("""); json.append(value); // value左右不是必須加引號,若是String則加 // json.append("""); if ((j != statLen - 1)) { json.append(","); } } json.append("}"); JsonLineMsg jsonLineMsg = new JsonLineMsg(new Timestamp(System.currentTimeMillis()), json.toString());
要注意的就是這個key
和value
加入資料庫的型別如果為text(即java字串)就要加引號
,所以key
兩頭必須加,value
看情況。
對應的XML中的語句:
<insert id="batchInsertJsonLineMsg" useGeneratedKeys="true" > insert into jsonlinemsg (timestamp ,keyandruledata ) values <foreach item="item" collection="list" separator="," close=";"> (#{item.timeStamp},(#{item.keyAndRuleData})::json) </foreach> </insert>
這個::json
就是將非json型別轉為json型別,否則JAVA中String型別會對應其他的資料庫欄位型別,插入會報錯。
note: psql 4種型別轉換 https://www.postgresql.org/docs/14/sql-syntax-lexical.html
type 'string'
只能用於字面常數轉換、且不能用於陣列中typename ( 'string' )
可用於執行時型別轉換'string'::type
可用於陣列,可用於執行時型別轉換CAST ( 'string' AS type )
可用於陣列,可用於執行時型別轉換插入後用Navicat檢視:
如果檢視到類似於 "{"1":"1_234"}"
、{"1":"1_123"}
這樣,格式就是不正確的,查詢JSON中欄位會返回null。
<select id="selectValueData" resultType="String"> select keyandruledata::json ->>#{key} from jsonlinemsg where timestamp = (#{time}::timestamp) </select>
要注意的就是這個::json
,至於 ->
還是 ->>
可以參考開頭的官網連結。
ps: timescaledb官網推薦用jsonb,但是我測試發現jsonb查詢插入都比不上json,不知道為啥
ps: 發現了,原來是轉換為tsdb時,索引沒建立起來,重新建表又測試了一遍,確實jsonb讀取快。
// 獲取連線的方法,設定ExecutorType.BATCH以及關閉自動提交 public static SqlSession getSessionForBatch(String xmlPath, Properties properties) throws IOException { return MybatisUtil.getSqlSessionFactory(xmlPath, properties).openSession(ExecutorType.BATCH,false); }
public void update(List<PropUrl> propUrlLst) throws IOException { // ExecutorType.BATCH try (SqlSession session = MybatisUtil.getSessionForBatch(myBatisConfigXmlPath)) { InitTsdbUrlTableMapper mapper = (InitTsdbUrlTableMapper) session.getMapper(mapperClazz); for (int i = 0; i < propUrlLst.size(); i++) { mapper.updatePropMatchRule(propUrlLst.get(i)); // 每50次提交一次防止記憶體溢位 if ((i+1) % 50 == 0) { session.commit(); session.clearCache(); } } session.commit(); session.clearCache(); log.info("update successfully ->{}", propUrlLst); } }
到此這篇關於利用Mybatis向PostgreSQL中插入並查詢JSON欄位的文章就介紹到這了,更多相關Mybatis查詢JSON欄位內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45