
# 通过JDBC连接RDS for PostgreSQL实例
#### 操作场景
通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种，其中使用SSL证书连接通过了加密功能，具有更高的安全性。
#### 前提条件
用户需要具备以下技能：
- 熟悉计算机基础知识。
- 了解java编程语言。
- 了解JDBC基础知识。
 
#### 驱动获取及使用
- JDBC驱动下载地址：<https://jdbc.postgresql.org/download/>
- JDBC接口使用指南请参考：<https://jdbc.postgresql.org/documentation/>
 
#### 连接实例
- [使用SSL证书连接]
  ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
  该方式属于SSL连接模式，需要下载SSL证书，通过证书校验并连接数据库。
  您可以在"实例管理"页面，单击实例名称进入"概览"页面，单击"SSL"处的"下载"，下载根证书或捆绑包。
  1. 通过JDBC连接PostgreSQL数据库，代码中的JDBC连接格式如下： 
     ```
     jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-ca&sslrootcert=<ca.pem>
     ```
     表1参数说明 
     | 参数                  | 说明                                                                                                                                                                                                                     |
     |:---|:---|
     | *\<instance_ip\>*   | 如果通过弹性云服务器连接，"instance_ip"是主机IP，即"概览"页面该实例的"内网地址"。                                                                                                                                                                     |
     | *\<instance_ip\>*   | 如果通过连接了公网的设备访问，"instance_ip"为该实例已绑定的"弹性公网IP"。                                                                                                                                                                          |
     | *\<instance_port\>* | 端口，默认5432，即"概览"页面该实例的"数据库端口"。                                                                                                                                                                                          |
     | *\<database_name\>* | 数据库名，即需要连接的数据库名（默认的管理数据库是postgres）。                                                                                                                                                                                    |
     | sslmode             | SSL连接模式。 verify-ca：表示我想要对数据加密，并且我接受因此带来的负荷。我想要确保我连接到的是我信任的服务器。 其他可选项请参考：<https://jdbc.postgresql.org/documentation/use/#connection-parameters/>。 |
     | sslrootcert         | SSL连接CA证书路径，参数详情请参考<https://jdbc.postgresql.org/documentation/use/#connection-parameters/>。                                                                                                                            |
        
     连接PostgreSQL数据库的java代码，可参考以下示例：
     ```
     // 认证用的用户名和密码直接写到代码中有很大的安全风险，建议在配置文件或者环境变量中存放(密码应密文存放，使用时解密)，确保安全。
     // 本示例以用户名和密码保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
     import java.sql.Connection;
     import java.sql.DriverManager;
     import java.sql.ResultSet;
     import java.sql.Statement;
     public class MyConnTest {
     final public static void main(String[] args) {
     Connection conn = null;
     // set sslmode here.
     // with ssl certificate and path.
     String url = "jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-ca&sslrootcert=/home/Ruby/ca.pem";
     String userName = System.getenv("EXAMPLE_USERNAME_ENV");
     String password = System.getenv("EXAMPLE_PASSWORD_ENV");
     try {
     Class.forName("org.postgresql.Driver");
     conn = DriverManager.getConnection(url, userName, password);
     System.out.println("Database connected");
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
     while (rs.next()) {
     System.out.println(rs.getString(1));
     }
     rs.close();
     stmt.close();
     conn.close();
     } catch (Exception e) {
     e.printStackTrace();
     System.out.println("Test failed");
     } finally {
     // release resource ....
     }
     }
     }
     ```
     
     
   
- [无证书连接]
  ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/note_3.0-zh-cn.png)
  该方式属于SSL连接模式，但不对服务端进行证书校验，用户无需下载SSL证书。
  1. 通过JDBC连接RDS for PostgreSQL数据库实例，代码中的JDBC连接格式如下： 
     ```
     jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=disable
     ```
     表2参数说明 
     | 参数                  | 说明                                                                                                                                                                                             |
     |:---|:---|
     | *\<instance_ip\>*   | 如果通过弹性云服务器连接，"instance_ip"是主机IP，即"概览"页面该实例的"内网地址"。                                                                                                                                             |
     | *\<instance_ip\>*   | 如果通过连接了公网的设备访问，"instance_ip"为该实例已绑定的"弹性公网IP"。                                                                                                                                                  |
     | *\<instance_port\>* | 端口，默认5432，即"概览"页面该实例的"数据库端口"。                                                                                                                                                                  |
     | *\<database_name\>* | 数据库名，即需要连接的数据库名（默认的管理数据库是postgres）。                                                                                                                                                            |
     | sslmode             | ssl连接模式。 disable：表示我不关心安全性，也不想为加密支付开销。 其他可选项请参考：<https://jdbc.postgresql.org/documentation/use/#connection-parameters/>。 |
        
     连接PostgreSQL数据库的java代码，可参考以下示例：
     ```
     // 认证用的用户名和密码直接写到代码中有很大的安全风险，建议在配置文件或者环境变量中存放(密码应密文存放，使用时解密)，确保安全。
     // 本示例以用户名和密码保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
     import java.sql.Connection;
     import java.sql.DriverManager;
     import java.sql.ResultSet;
     import java.sql.Statement;
     public class MyConnTest {
     final public static void main(String[] args) {
     Connection conn = null;
     // set sslmode here.
     // no ssl certificate, so do not specify path.
     String url = "jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=disable";
                     String userName = System.getenv("EXAMPLE_USERNAME_ENV");
     String password = System.getenv("EXAMPLE_PASSWORD_ENV");
     try {
     Class.forName("org.postgresql.Driver");
     conn = DriverManager.getConnection(url, userName, password);
     System.out.println("Database connected");
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
     while (rs.next()) {
     System.out.println(rs.getString(1));
     }
     rs.close();
     stmt.close();
     conn.close();
     } catch (Exception e) {
     e.printStackTrace();
     System.out.println("Test failed");
     } finally {
     // release resource ....
     }
     }
     }
     ```
     
     
   
