Postgresql使用java JDBC导入数据的方法

本文介绍了在使用PostgreSQL时,针对不同场景的数据导入策略,包括通过jdbc执行insert语句、使用psql的copy命令以及CopyManager。对比了各种方式在数据量大时的效率,并特别强调了16进制分隔符的处理方法。对于大量数据导入,使用copy命令能显著提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. maven依赖

如果使用jdk7或者jdk6,需要使用其他对应的maven依赖,以下依赖支持jdk8及以上的版本。如果使用错jdk,在使用时会出现错误。

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.23</version>
        </dependency>
2. 通过java的加载方式
  1. 通过jdbc执行insert语句不断导入数据。

    通过jdbc执行insert语句这种方式是最普通,适用于各种数据库不仅仅是postgresql,但是这种方式在数据量大的情况下,插入效率低。以下只是简单的例子,执行语句的方法。

    public static void main(String[] args) {
        Class.forName("org.postgresql.Driver");
        String url = "jdbc:postgresql://localhost:port/dbname?user=***e&password=***";
        Connection connection = DriverManager.getConnection(url);
        Statement statement = connection.createStatement();
        // PreparedStatement preparedStatement = connection.prepareStatement(); 也可以使用PreparedStatement
        statement.execute(sql);
        statement.close();
        connection.close();
    }
    
  2. 通过postgresql的客户端psql执行copy命令。

    此方式需要在运行主机安装psql。win10下不想安装服务端,可以在安装包里选择只安装Command Line Tools。安装后,在相应的目录里有psql的指令。linux下可以通过命令只安装客户端,具体方法百度可以搜到的。可以参考:https://blog.youkuaiyun.com/liumiaocn/article/details/108314207

    此方式是通过Runtime类,执行psql的copy命令,导入数据到postgresql

    public static void main(String[] args) {
        Runtime.getRuntime().exec("psql -c \"\\copy postgresdb.test2 from 'D:\\testdata.txt' WITH DELIMITER ',' NULL AS ''\"  postgresql://username:password@localhost:5000/dbname?sslmode=prefer");
    }
    

    此方法中使用的copy相关命令,参考官网psql命令。

  3. 通过jdbc的CopyManager执行copy命令。

    由于通过jdbc直接执行copy是不行的。如果不想安装客户端,而直接在主机通过jdbc执行copy命令,需要用到CopyManager。

    public static void main(String[] args) {
        Class.forName("org.postgresql.Driver");
        String url = "jdbc:postgresql://localhost:port/dbname?user=***e&password=***";
        Connection connection = DriverManager.getConnection(url);
        CopyManager copyManager = new CopyManager((BaseConnection) connection);
        FileInputStream fileInputStream = new FileInputStream("D:\\testdata.txt");
        long succesNum = copyManager.copyIn("copy postgresdb.testh(id,time) from stdin WITH DELIMITER ',' NULL AS ''", fileInputStream);
    }
    
3. 16进制分隔符处理

​ 16进制分隔符需要使用E’’来处理,比如0x01作为分隔符,要写成delimeter E’\x01’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值