首页 > 数据库 >java insert数组到postgres数据库

java insert数组到postgres数据库

时间:2024-06-20 16:13:41浏览次数:16  
标签:insert rows java String series json 数组 report postgres

数组格式在数据库中并不是常用操作,比较常用的是字符串存储后,使用时再进行数据加工.这里记录下直接操作postgres insert数组的数据操作.

表结构

CREATE TABLE schema.table(
	report_rows json NULL,
	series _varchar NULL
)

实际存在两种数组结构:1 字符串数组 2 json数组. json数组使用json进行存储,也可以是jsonb二进制存储方式,但是二进制数据虽然更快,但在数据库中不直观,这里就使用了json.

方式1: 指定数组数据类型

    @Data
    public static class SelfData {
        public String[] series;
        public JsonNode report_rows;
    }

    public void insertArrayTopostgres() {
        String dataStr="{\"series\":[\"2024/06/18 00:00:00\"],\"rows\":[{\"sum\":[34517],\"values\":[[204],[132]],\"byValue\":[\"i am robot\"]}]}";
        SelfData selfData = JsonUtils.parseStr(dataStr, SelfData.class);

        String url2 = "jdbc:postgresql://localhost:5432/mydatabase";
        String user = "myuser";
        String password = "mypassword";

        try (Connection connection = DriverManager.getConnection(url2, user, password)) {
            // json存储要求是json字符串格式
            String jsonRows = objectMapper.writeValueAsString(selfData.getReport_rows());
            // 这里是数据库数组类型(java.sql.Array)的关键处理. "varchar"用于指定数组内的数据类型 selfData.getSeries()是实际的数据
            Array series = connection.createArrayOf("varchar", selfData.getSeries());
            String sql = "INSERT INTO schema.table (report_rows, series) VALUES(?, ?)";
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
                preparedStatement.setObject(1, jsonRows);
                preparedStatement.setArray(2, series);
                preparedStatement.executeUpdate();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

数据库实际存储效果

方式2: sql中直接指定数据类型,不在代码中进行类型指定

     Object execute = jdbcTemplatePostgres.execute("INSERT INTO schema.table (report_rows, series) VALUES(?::json, ?::_varchar);", new PreparedStatementCallback<Object>() {
          @Override
          public Object doInPreparedStatement(PreparedStatement ps) throws SQLException {
              String[] split = "report_rows, series".split(",");
              for (int i = 0; i < split.length; i++) {
                  ps.setObject(i + 1, ReflectUtils.getFieldValue(data, split[i].trim()));
              }
              return ps.executeUpdate();
          }
      });

代码实现上很简单.sql语句才是精髓: INSERT INTO schema.table (report_rows, series) VALUES(?::json, ?::_varchar);

标签:insert,rows,java,String,series,json,数组,report,postgres
From: https://www.cnblogs.com/chengmuyu/p/18258852

相关文章

  • 【AOP问题处理】:AopContext.currentProxy()方法异常处理:java.lang.IllegalStateExcept
    原因是代理对象内部方法的调用不会触发AOP代理。先看代码:自定义了一个注解:importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;//使用元注解......
  • 构建网络图 (JavaScript)
    前序:在工作中难免有一些千奇百怪的需求,如果你遇到构建网络图,或者学习应对未来,请看这边文章,本文以代码为主。网络图是数据可视化中实用而有效的工具,特别适用于说明复杂系统内的关系和连接。这些图表有助于理解各种背景下的结构,从社交网络到企业层级。在本教程中,我们将深入研究......
  • JavaScript工具函数助力高效开发
    JavaScript工具函数助力高效开发前言日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率1.校验数据类型export const typeOf = function(obj) {  return Object.prototype.toString.call(obj).sl......
  • 深入理解AQS:Java并发编程中的核心组件
    目录AQS简介AQS的设计思路AQS的核心组成部分状态(State)同步队列(SyncQueue)条件队列(ConditionQueue)AQS的内部实现节点(Node)锁的获取与释放独占锁共享锁条件变量AQS的应用案例ReentrantLockCountDownLatchSemaphore总结参考文献AQS简介AbstractQueuedSynchronizer(AQ......
  • 理解 Java 中的 Future 及其底层实现
    目录什么是Future?Future的基本用法Future的局限性及改进Future的底层实现小结什么是Future?Future是Java中一个用于表示异步计算结果的接口。它主要用于处理那些可能需要较长时间运行的任务,使得主线程可以继续执行其他工作,而无需等待任务完成。Future的定义Fut......
  • Leedcode【222】. 完全二叉树的节点个数——Java解法(递归)
    Problem: 222.完全二叉树的节点个数题目思路解题方法复杂度Code效果题目给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的......
  • Leedcode【146】. LRU 缓存——Java实现
    Problem: 146.LRU缓存思路解题方法复杂度Code效果思路使用一个双向链表来维护缓存的访问顺序,最近使用的节点在链表头部,最久未使用的节点在链表尾部。使用一个哈希表来存储缓存中的键值对,哈希表中的键对应双向链表中的节点。解题方法Node类:表示双向链表的节点,每......
  • Leedcode【62】. 不同路径——Java解法(动态规划)
    Problem: 62.不同路径题目思路解题方法复杂度Code效果题目一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例1:......
  • 在JavaScript中如何获取时间戳?
    在JavaScript中,你可以通过几种方式获取时间戳。最常见的方式是使用Date对象的getTime()方法,这会返回自1970年1月1日00:00:00UTC(世界标准时间)以来的毫秒数。下面是一个简单的例子:javascript//创建一个Date对象,表示当前的时间和日期letnow=newDate();//使用getTime()......
  • 只听过 Python 做爬虫?不瞒你说 Java 也很强
    网络爬虫技术,早在万维网诞生的时候,就已经出现了,今天我们就一起来揭开它神秘的面纱!一、摘要说起网络爬虫,相信大家都不陌生,又俗称网络机器人,指的是程序按照一定的规则,从互联网上抓取网页,然后从中获取有价值的数据,随便在网上搜索一下,排在前面基本都是pyhton教程介绍。的确,pyhto......