怎么利用Mybatis向PostgreSQL中插入并查询JSON字段
这篇文章主要介绍“怎么利用Mybatis向PostgreSQL中插入并查询JSON字段”,在日常操作中,相信很多人在怎么利用Mybatis向PostgreSQL中插入并查询JSON字段问题写入上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用Mybatis向PostgreSQL中插入并查询JSON字段”的疑惑有所帮助!接下来,mybatis作用,请跟着小编一起来学习吧!
应用场景介绍
将TCP发过来的数据包(通过消息队列发过来)解析出数据(一个数据包含有多帧,一帧中含有多条信息),并和本地规则表的格式对应起来,mybatis怎么实现的,介绍一下mybatis。以JsonLineMsg
实体类代表对应的一帧详解查询数据PostgreSQL:
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
中对应一个类型为mybatisbatchjson
(或jsonb
)的字段。
数据insert
为了查询JSON中的字段,在insert的过程中关联有些注意事项菜鸟,如果插入时JSON格式不正确,查询JSON字段是总返回null
。
记录一下:为了降低数据库关联打开关闭的自动生成耗时,如何引入mybatis,每积累20帧持久化一次。
note:
foreach批量插入 、 mybatis ExecutorType.BATCH模式理解插入 、 for循环引入insert
其实实际意义上来说一对一,包括在程序里面for循环还是在sql里面for循环都不算是批量操作。只有将ExecutorType设置为BATCH模式才是真正意义上的批量操作。 并且事实证明在sql循环时设置batch与否其实执行时间差别不是很大,几乎可以忽略不计。所以其实如果不是特别要求性能。可以直接在sql中使用for循环即可 。谨慎使用batch,如果需要使用batch,请在需要的函数上面设置batch,不要全局使用。因为batch也是有副作用的。 比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,;此外,对于update、delete无法返回更新、插入条数。这在某型情形下是不符合业务要求的。上面的是搬运的,不过后来有看了看,还是应该用BATCH的Executor来批量导入,实际项目中foreach不可控,mybatis怎么跟spring整合的,指不定啥时候就报错了,文章最后记录了ExecutorType为BATCH写法的关键部分) foreach的xml拼接sql是最不推荐的方式,使用时有大段的xml和sql语句要写,很容易详解出错,工作效率你对很低。更关键点是,虽然效率尚可,但是真正需要效率的时候批量中你挂字段了,要你何用? 批处理执行Mybatis是有大数据流程量插入时方式推荐的做法,使用起来也比较方便。
关于批处理的语法方式的具体说明,可以参考推文强烈推荐MyBatis 三种批量插入详解方式的比较或者去StackOverFlow查一下,讲解的比较全面,总之,还是控制用ExecutorType为BATCH写法比较靠谱。
一帧中包含多条方式信息,一条信息对应一个key:value
,所以批量每次从规则表生成的key和TCP解析出的value都要加到控制一个代表字段一帧JSON所有数据的JSON串中。
要注意的代码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=";"> (#PostgreSQL{item.mybatisbatchtimeStamp},(#{item.keyAndRuleData})::json) </foreach> </insert>
这个::json
就语法mybatis是将非json类型转为json类型,否则JAVA中String类型会对应其他的数据库写入字段类型,插入会报错。
note: psql 4种类型转换 https://www.postgresql.org/docs/14/sql-syntax-lexical.html
type 'string'
只能用于字面常量转换、且不能用于数组介绍中spring连接谈谈利用typename ( 'string' )
可用插入于运行时类型控制用法转换代码'string'::type
可用于数组,可用插入于运行时类型控制用法转换代码数据数据CAST ( 'string' AS type )
可用于数组,可用插入于运行时类型控制用法转换代码
插入方式谈谈后用控制理解流程利用Navicat查看:
如果查看到菜鸟类似于 理解"{"1":"1_234"}"
、关联{\"1\":\"1_123\"}
这样,格式就是不正确的,利用mybatis插件自动生成代码,查询JSON中字段会返回null。
数据select
<select id="selectValueData" resultType="String"> select keyandruledata::json -一对一mybatis>>#作用谈谈{key} from jsonlinemsg where timestamp = (#{time}::timestamp) </select>
要注意的教程就是这个批量::json
,至于 ->
还是 ->>
可以参考开头mybatisbatch的官网链接。
ps: timescaledb官网推荐用jsonb,但是我测试发现jsonb查询插入都比不上json,不知道为啥
ps: 发现了,原来是转换为tsdb时,索引没建立起来,重新建表又测试了一遍,确实jsonb读取快。
BATCH 批量插入
// 获取插入连接的方法,mybatis怎么管理连接,设置ExecutorType.查询BATCH以及mybatis关闭自动提交 public static SqlSession getSessionForBatch(String xmlPath, Properties properties) throws IOException { return MybatisUtil.getSqlSessionFactory(xmlPath, properties).openSession(ExecutorType.BATCH,mybatis的关联查询方式有哪些,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字段”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注蜗牛博客网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱写入:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论