用Java运行PostgreSQL

试试在Java中运行PostgreSQL。

环境

    • macOS Mojave

 

    • Eclipse 4.7.3

 

    • PostgreSQL 11.4

 

    JDBC Driver 42.2.5(postgresql-42.2.5.jar)

引入JDBC驱动程序

访问PostgreSQL关系数据库需要使用Java的标准API,需要JDBC驱动程序。

首先,從下載開始。

https://jdbc.postgresql.org/download.html#current的内容可以用以下方式进行表述:

在这里使用postgresql-42.2.5.jar。

将其放置在此次项目的任意位置(lib中可能更明确吧?)

スクリーンショット 2019-07-23 16.28.17.png

然而,由于无法确定引用的位置,所以需要设置路径。

如果是Mac的话

点击postgresql-42.2.5.jar,进入项目选项卡 –> 属性 –> Java构建路径 –> 库 –> 添加外部JAR –> 查找并打开postgresql-42.2.5.jar –> 确定并关闭窗口

如果参照库中引用了postgresql-42.2.5.jar,则表示正常。

スクリーンショット 2019-07-23 16.41.34.png

用于数据库

这次我们将全部重复利用之前使用过的东西。

用户请看以下内容:

customer=# \l
                                List of databases
   Name    |    Owner    | Encoding | Collate | Ctype |   Access privileges   
-----------+-------------+----------+---------+-------+-----------------------
 customer  | sf213471118 | UTF8     | C       | C     | 

使用客户表的表格

customer=# \d
          List of relations
 Schema |   Name   | Type  |    Owner   
--------+----------+-------+-------------
 public | customer | table | sf213471118

顾客数据表的内容如下所示。

customer=# SELECT * FROM customer;
       id        |   name   | gender | age 
-----------------+----------+--------+-----
 10001           | 田中太郎 | m       |  31
 10002           | 中村花子 | w       |  44
 10003           | 佐藤一郎 | m       |  20
 10004           | 内田彩   | w       |  18
 10005           | 高橋次郎 | m       |  56
 10006           | 中里悟   | m       |  34
(6 rows)

Java编程中重要的部分

在记录的过程中要记得留下一些不想忘记的要点。 de liú xià bù de .)

异常处理

   public static void main(String[] args) throws Exception {
      try {
          System.out.println("DB access start");
          PostgreSQL_test.dbConnect();
      } catch (Exception e) {
          System.out.println("error main()");
          e.printStackTrace();
      } finally {
          System.out.println("DB access finished");
      }
   }

在编写代码时,我们可以使用try-catch(-finally)来处理异常情况。

在这个例子中,由于将异常指定为Exception e,只能确定错误发生的位置,但通过改变catch的条件并进行并行描述,也可以立即了解错误的内容。

例如

try {
    file_reader = new FileReader(customer);
    ~
  } catch (FileNotFoundException f) {          // ファイル探索エラー
    System.out.println("cannot find file");
    f.printStackTrace();
  } catch (IOException i) {                    //ファイル入出力エラー
    System.out.println("in/out error");
    i.printStackTrace();
  } finally {
    try {
      if(file_reader != null) {
        file_reader.close();
      }
    } catch (IOException i) {                  //ファイルclose中エラー
      System.out.println(i);
      i.printStackTrace();
    }
  }

假设有这样的流程可以实现

尝试-捕捉-捕捉方面

new FileReader(customer)をしたがそのファイル名が見つからないとき

customerファイルはあるが出力できなかったとき

考虑到这两点,进行了分支。

②最终 – 尝试 – 捕获的方案

    close中のエラー

仅仅检测到。

除了FileNotFoundException和IOException之外,还存在许多其他的异常处理情况,但如果使用Exception,就可以捕捉到所有的错误(参考上述程序,除了能够定位问题的位置之外,想不出其他更好的方法)。

为了与数据库建立连接

JDBC的初始化

在连接到数据库之前,需要先初始化JDBC驱动程序。

如果是PostgreSQL的话,可以按照以下的方式来描述。

Class.forName("org.postgresql.Driver").newInstance();

建立数据库连接/断开数据库连接

为了建立与数据库的连接,需要使用DriverManager类的getConnection方法,该方法在标准库中存在。

connection = DriverManager.getConnection( <URL> , <USER>, <PASSWORD>);

在URL方面,可以使用jdbc:postgresql://<位置>:<端口号>/<数据库名>来表示。

这次是根据以下设置的。

場所ポート番号DB名localhost5432customer

就断电而言,为了防患于未然,最好在最后才实施。

rs.close();    //rsはResultSetインターフェースの変数

SQL语句的描述

当将SQL发送到数据库时,首先需要使用Connection接口中定义的createStatement方法创建语句(必须与发送的SQL一起填写的内容)。

statement = con.createStatement();

结束上述内容后,进行SQL查询语句的描述。

resultset = stm.executeQuery(" <SQL文> ");

数据的输出

可以使用 ResultSet接口的 next()方法逐行进行处理。

while (rs.next()) {
   System.out.println(rs.getInt("<column>"));
     System.out.println(rs.getString("<column>"));
}

这次的Java编写代码。

package customer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class PostgreSQL_test {

   public static void main(String[] args) throws Exception {
      try {
          System.out.println("DB access start");
          PostgreSQL_test.dbConnect();
      } catch (Exception e) {
          System.out.println("error main()");
          e.printStackTrace();
      } finally {
          System.out.println("DB access finished");
      }
   }

   private static void dbConnect() throws Exception {
      Connection con = null;
      Statement stm = null;
      ResultSet rs = null;
      int num = 1;

      String url        = "jdbc:postgresql://localhost:5432/customer";
      String user       = "sf213471118";
      String password   = "";          //今回パスワードは設定していない

      try {
         Class.forName("org.postgresql.Driver").newInstance();
         con = DriverManager.getConnection(url, user, password);
         stm = con.createStatement();
         rs = stm.executeQuery("SELECT * FROM customer");
         while (rs.next()) {
             System.out.println("[" + num + " 件目]");
             num++;
             System.out.println("id     : " + rs.getString("id"));
             System.out.println("name   : " + rs.getString("name"));
             System.out.println("gender : " + rs.getString("gender"));
             System.out.println("age    : " + rs.getInt("age"));
         }
      } catch(SQLException e) {
          System.out.println("error dbConnect()");
          e.printStackTrace();
        }finally {
            try {
                if ((rs != null)||(stm != null)||(con != null)) {
                    rs.close();
                }
            } catch (Exception e) {
                 e.printStackTrace();
            }
        }
      }
}

当你运行它时,会返回以下内容。

DB access start
[1 件目]
id     : 10001         
name   : 田中太郎
gender : m  
age    : 31
[2 件目]
id     : 10002          
name   : 中村花子
gender : w  
age    : 44
[3 件目]
id     : 10003          
name   : 佐藤一郎
gender : m  
age    : 20
[4 件目]
id     : 10004          
name   : 内田彩
gender : w  
age    : 18
[5 件目]
id     : 10005          
name   : 高橋次郎
gender : m  
age    : 56
[6 件目]
id     : 10006          
name   : 中里悟
gender : m  
age    : 34
DB access finished

如果是真的,我本想用rs.next()来输出当前记录数的名称,但是因为不太清楚,所以用了一种巧妙的方法来输出…

如果有人能够告诉我如何做,我会非常高兴。

【补充】 2019年7月29日

非常感谢您的评论。我已经按照以下方式进行了修正。

使用rs.getRow()来接收循环部分的尝试次数。

    while (rs.next()) {
         System.out.println("[" + rs.getRow() + " 件目]");        /* 修正部分 */
         System.out.println("id     : " + rs.getString("id"));
         System.out.println("name   : " + rs.getString("name"));
         System.out.println("gender : " + rs.getString("gender"));
         System.out.println("age    : " + rs.getInt("age"));
    }

我已经修复了漏洞。

     try {
         if ((rs != null)||(stm != null)||(con != null)) {
             rs.close();
             stm.close();      /* 修正部分 */
             con.close();      /* 修正部分 */
          }
      } catch (Exception e) {
                 e.printStackTrace();
        }

再次感谢您。

广告
将在 10 秒后关闭
bannerAds