【云小课】EI第53课 快使用JDBC连接GaussDB(DWS),来一起玩转数据库~

举报
Hello EI 发表于 2022/11/30 17:42:34 2022/11/30
【摘要】 GaussDB(DWS)支持在Linux或Windows环境下使用JDBC应用程序连接数据库。可在华为云平台环境的弹性云服务器中,或者互联网环境中连接。

云小课插图.jpg

JDBC开发流程

6.png

前提条件

  • 已安装JDK 1.6或以上版本,并配置环境变量。
  • 已下载JDBC驱动。 JDB驱动是用于连接GaussDB(DWS)集群,用户可以在控制台下载GaussDB(DWS)提供的JDBC驱动,也可以使用开源的JDBC驱动程序,例如PostgreSQL JDBC驱动程序3-1103或更高版本。

         在控制台左侧导航栏中单击“连接管理”。在“下载驱动程序”区域,选择“DWS JDBC Driver”驱动,然后单击“下载”就可以下载与现有集群版本匹配的JDBC驱动。

       下载的驱动包名为“dws_8.1.x_jdbc_driver.zip”,解压后有两个JDBC的驱动jar包,分别为“gsjdbc4.jar”“gsjdbc200.jar”

    • gsjdbc4.jar:与PostgreSQL保持兼容,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统中使用。
    • gsjdbc200.jar:如果同一JVM进程内需要同时访问PostgreSQLGaussDB(DWS) 请使用该驱动包。该包主类名为“com.huawei.gauss200.jdbc.Driver”(即将“org.postgresql”替换为“com.huawei.gauss200.jdbc” ,数据库连接的URL前缀为“jdbc:gaussdb”,其余与gsjdbc4.jar相同。
  • 下载SSL证书文件。

          GaussDB(DWS)管理控制台提供了自签的证书供用户下载。在控制台左侧导航栏中单击“连接管理”。在“下载SSL证书”区域进行下载。使用该证书,用户需要 配置客户端程序使证书可用,此过程依赖于openssl工具以及java自带的keytool工具。

使用JDBC连接数据库

LinuxWindows环境下操作方法相同,以下步骤以Windows环境为例。

步骤一:用户通过JDBC连接GaussDB(DWS)集群时,可以选择是否采用SSL认证方式。SSL认证用于加密客户端和服务器之间的通讯数据,为敏感数据在Internet上的传输提供了一种安全保障手段。SSL模式安全性高于普通模式,建议在使用JDBC连接GaussDB(DWS)集群时采用SSL模式。

  • 是,单击指定集群名称,切换至“安全设置”页签,在“SSL连接”区域开启SSL连接,默认为开启。执行步骤三
  • 否,关闭SSL连接,执行步骤四

步骤二(可选)如果使用Linux环境,使用WinScp工具将SSL证书上传到Linux环境上11.png

步骤三配置证书以使用SSL加密连接。OpenSSL工具下载地址:https://slproweb.com/products/Win32OpenSSL.html

    SSL证书.png

          1. 打开命令提示符程序,切换到“C:\dws_ssl_cert\sslcert”路径下,执行以下两条命令,转化根证书并导入到trustStore中。

    openssl x509 -in cacert.pem -out cacert.crt.der -outform der
    keytool -keystore mytruststore -alias cacert -import -file cacert.crt.der

    SSL2.png


         2. 请用户根据提示信息输入自定义的可信库密码并确认密码,然后输入“y”确认信任证书。

          3. 执行以下命令转化客户端私钥。

    openssl pkcs12 -export -out client.pkcs12 -in client.crt -inkey client.key

    9.png需要输入客户端私钥的密码“Gauss@MppDB”,然后输入并确认用户自定义的私钥密码。

           4. 执行以下命令,将私钥导入到keyStore中。

    keytool -importkeystore -deststorepass Gauss@MppDB -destkeystore client.jks -srckeystore client.pkcs12 -srcstorepass password -srcstoretype PKCS12 -alias 1
    • 命令中password为示例自定义密码,具体请根据用户实际输入密码为准。
    • 回显如下类似信息且没有报错,则表示导入成功。此时“C:\dws_ssl_cert\sslcert”下会生成目标密钥文件:client.jks


    步骤四下载包名为dws_8.1.x_jdbc_driver.zip的驱动包,解压后有两个JDBC的驱动jar包“gsjdbc4.jar”和“gsjdbc200.jar”,用户可根据需求选择。

    步骤五:在应用程序的工程中,设置引用Jar包。

    • Eclipse工程为例,先将jar包存放在工程目录下,例如将jar包放在工程目录的lib目录下,然后在Eclipse工程中,右键单击lib目录下的该jar包,再选择菜单“Build Path”,即可引用此jar包。


    • 您也可以使用另一种方式,在Maven工程中,可以直接将GaussDB(DWS) JDBC驱动作为依赖项添加进POM文件,配置如下所示:
    • gsjdbc4.jar
    <dependency>
    
        <groupId>com.huaweicloud.dws </groupId>
    
        <artifactId>huaweicloud-dws-jdbc</artifactId>
    
        <version>8.1.0</version>
    
    </dependency>
    •  gsjdbc200.jar
    <dependency>
    
        <groupId>com.huaweicloud.dws</groupId>
    
        <artifactId>huaweicloud-dws-jdbc</artifactId>
    
        <version>8.1.1.1-200</version>
    
    </dependency> 

    步骤六加载驱动。支持以下两种方法加载:

    • 在代码中隐含装载Class.forName("org.postgresql.Driver");
    • JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest

    步骤七:调用JDBC的数据库连接方法DriverManager.getConnection()连接GaussDB(DWS)数据库。

    JDBC接口不提供重试连接的能力,您需要在业务代码中实现重试处理。

    DriverManager.getConnection()方法支持以下重载:

    • DriverManager.getConnection(String url);
    • DriverManager.getConnection(String url, Properties info);
    • DriverManager.getConnection(String url, String user, String password);

    1 数据库连接参数

    参数

    描述

    url

    数据库连接描述符,可在控制台左侧导航栏中单击“连接管理”。在“数据仓库连接信息”区域选择一个可用集群查看。

    url的格式如下:

    • jdbc:postgresql:database
    • jdbc:postgresql://host/database
    • jdbc:postgresql://host:port/database
    • jdbc:postgresql://host:port[,host:port][...]/database

    3.png

    info

    数据库连接属性。常用的属性如下:

    • user:String类型。表示创建连接的数据库用户。
    • password:String类型。表示数据库用户的密码。
    • ssl:Boolean类型。表示是否使用SSL连接。
    • loggerLevel:string类型。为LogStreamLogWriter设置记录进DriverManager当前值的日志信息量。目前支持"OFF""DEBUG""TRACE"。 值为"DEBUG"时,表示只打印DEBUG级别以上的日志,将记录非常少的信息。值等于TRACE时,表示打印DEBUGTRACE级别的日志,将产生详细的日志信息。默认值为OFF,表示不打印日志。
    • prepareThreshold:integer类型。用于确定在转换为服务器端的预备语句之前,要求执行方法PreparedStatement的次数。缺省值是5
    • batchMode : boolean类型,用于确定是否使用batch模式连接。
    • fetchsize : integer类型,用于设置数据库链接所创建statement的默认fetchsize
    •  ApplicationName:string类型。应用名称,在不做设置时,缺省值为PostgreSQL JDBC Driver
    • allowReadOnly:boolean类型,用于设置connection是否允许设置readonly模式,默认为false,若该参数不被设置为true,则执行connection.setReadOnly不生效。
    • blobMode:string类型,用于设置setBinaryStream方法为不同的数据类型赋值,设置为on时表示为blob数据类型赋值,设置为off时表示为bytea数据类型赋值,默认为on
    • connectionExtraInfo:Boolean类型。表示驱动是否上报当前驱动的部署路径、进程属主用户到数据库。 

    4.png

    user

    数据库用户。

    password

    数据库用户的密码。

    SSL证书方式加密连接样例代码如下:

    //以下代码将获取数据库SSL连接操作封装为一个接口。
    public static Connection GetConnection(String username, String passwd)
        {
            //定义驱动类。
            String driver = "org.postgresql.Driver";
            //设置keystore。
            System.setProperty("javax.net.ssl.trustStore", "mytruststore");
            System.setProperty("javax.net.ssl.keyStore", "client.jks");
            System.setProperty("javax.net.ssl.trustStorePassword", "password");
            System.setProperty("javax.net.ssl.keyStorePassword", "password");
            Properties props = new Properties();
            props.setProperty("user", username);
            props.setProperty("password", passwd);
            props.setProperty("ssl", "true");
            String  url = "jdbc:postgresql://" + "10.10.0.13" + ':'
                        + "8000" + '/'
                        + "postgresgaussdb";
            Connection conn = null;
            
            try
            {
                //加载驱动。
                Class.forName(driver);
            }
            catch( Exception e )
            {
                e.printStackTrace();
                return null;
            }
            
            try
            {
                 //创建连接。
                conn = DriverManager.getConnection(url, props );
                System.out.println("Connection succeed!");
            }
            catch(Exception e)
            {
                e.printStackTrace();
                return null;
            }
            
            return conn;
        }
    

    步骤八执行SQL语句。

    1. 创建语句对象。

    Statement stmt = con.createStatement();

    2. 执行语句对象。

    int rc = stmt.executeUpdate("CREATE TABLE tab1(id INTEGER, name VARCHAR(32));");

    3. 释放语句对象。

    stmt.close();

    步骤九:调用方法close()关闭连接。

    示例代码

    此示例将演示如何基于GaussDB(DWS) 提供的JDBC接口开发应用程序。

    9.png在完成以下示例前,用户需要先创建存储过程哦~

    create or replace procedure testproc
    
    (
    
        psv_in1 in integer,
    
        psv_in2 in integer,
    
        psv_inout in out integer
    
    )
    
    as
    
    begin
    
        psv_inout := psv_in1 + psv_in2 + psv_inout;
    
    end;
    
    /
    //DBtest.java
    
    //以下用例以gsjdbc4.jar为例,如果要使用gsjdbc200.jar,请替换驱动类名(将代码中的“org.postgresql”替换成“com.huawei.gauss200.jdbc”)与连接URL串前缀(将“jdbc:postgresql”替换为“jdbc:gaussdb”)。
    
    //演示基于JDBC开发的主要步骤,会涉及创建数据库、创建表、插入数据等。
    
    import java.sql.Connection;
    
    import java.sql.DriverManager;
    
    import java.sql.PreparedStatement;
    
    import java.sql.SQLException;
    
    import java.sql.Statement;
    
    import java.sql.CallableStatement;
    
    import java.sql.Types;
    
    public class DBTest {
    
      //创建数据库连接,以下IP地址和database替换为对应的数据库连接地址和数据库名称。
    
      public static Connection GetConnection(String username, String passwd) {
    
        String driver = "org.postgresql.Driver";
    
        String sourceURL = "jdbc:postgresql://10.10.0.13:8000/database";
    
        Connection conn = null;
    
        try {
    
          //加载数据库驱动。
    
          Class.forName(driver).newInstance();
    
        } catch (Exception e) {
    
          e.printStackTrace();
    
          return null;
    
        }
    
        try {
    
          //创建数据库连接。
    
          conn = DriverManager.getConnection(sourceURL, username, passwd);
    
          System.out.println("Connection succeed!");
    
        } catch (Exception e) {
    
          e.printStackTrace();
    
          return null;
    
        }
    
        return conn;
    
      };
    
      //执行普通SQL语句,创建customer_t1表。
    
      public static void CreateTable(Connection conn) {
    
        Statement stmt = null;
    
        try {
    
          stmt = conn.createStatement();
    
          //执行普通SQL语句。
    
          int rc = stmt
    
              .executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));");
    
          stmt.close();
    
        } catch (SQLException e) {
    
          if (stmt != null) {
    
            try {
    
              stmt.close();
    
            } catch (SQLException e1) {
    
              e1.printStackTrace();
    
            }
    
          }
    
          e.printStackTrace();
    
        }
    
      }
    
      //执行预处理语句,批量插入数据。
    
      public static void BatchInsertData(Connection conn) {
    
        PreparedStatement pst = null;
    
        try {
    
          //生成预处理语句。
    
          pst = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?,?)");
    
          for (int i = 0; i < 3; i++) {
    
            //添加参数。
    
            pst.setInt(1, i);
    
            pst.setString(2, "data " + i);
    
            pst.addBatch();
    
          }
    
          //执行批处理。
    
          pst.executeBatch();
    
          pst.close();
    
        } catch (SQLException e) {
    
          if (pst != null) {
    
            try {
    
              pst.close();
    
            } catch (SQLException e1) {
    
            e1.printStackTrace();
    
            }
    
          }
    
          e.printStackTrace();
    
        }
    
      }
    
      //执行预编译语句,更新数据。
    
      public static void ExecPreparedSQL(Connection conn) {
    
        PreparedStatement pstmt = null;
    
        try {
    
          pstmt = conn
    
              .prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1");
    
          pstmt.setString(1, "new Data");
    
          int rowcount = pstmt.executeUpdate();
    
          pstmt.close();
    
        } catch (SQLException e) {
    
          if (pstmt != null) {
    
            try {
    
              pstmt.close();
    
            } catch (SQLException e1) {
    
              e1.printStackTrace();
    
            }
    
          }
    
          e.printStackTrace();
    
        }
    
      }
    
    //执行存储过程。
    
      public static void ExecCallableSQL(Connection conn) {
    
        CallableStatement cstmt = null;
    
        try {
    
         
    
          cstmt=conn.prepareCall("{? = CALL TESTPROC(?,?,?)}");
    
          cstmt.setInt(2, 50);
    
          cstmt.setInt(1, 20);
    
          cstmt.setInt(3, 90);
    
          cstmt.registerOutParameter(4, Types.INTEGER);  //注册out类型的参数,类型为整型。
    
          cstmt.execute();
    
          int out = cstmt.getInt(4);  //获取out参数
    
          System.out.println("The CallableStatment TESTPROC returns:"+out);
    
          cstmt.close();
    
        } catch (SQLException e) {
    
          if (cstmt != null) {
    
            try {
    
              cstmt.close();
    
            } catch (SQLException e1) {
    
              e1.printStackTrace();
    
            }
    
          }
    
          e.printStackTrace();
    
        }
    
      }
    
     
    
      /**
    
       * 主程序,逐步调用各静态方法。
    
       * @param args
    
      */
    
      public static void main(String[] args) {
    
        //创建数据库连接,以下User、Password替换为实际连接的数据库用户和密码。
    
        Connection conn = GetConnection("User", "Password");
    
        //创建表。
    
        CreateTable(conn);
    
        //批插数据。
    
        BatchInsertData(conn);
    
        //执行预编译语句,更新数据。
    
        ExecPreparedSQL(conn);
    
        //执行存储过程。
    
        ExecCallableSQL(conn);
    
        //关闭数据库连接。
    
        try {
    
          conn.close();
    
        } catch (SQLException e) {
    
          e.printStackTrace();
    
        }
    
      }
    
    }

     

                                                     20200820-164316(eSpace).png了解更多数据仓库服务内容,猛戳此处!!!


    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    举报
    请填写举报理由
    0/200