暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 EDB JDBC 执行数据库查询

新智锦绣 2025-01-20
163

点击蓝字关注我们


上篇我们介绍了使用EPRS(EDB Postgres Replication Server)实现数据库在线升级,EPRS与库的连接就是通过EDB JDBC进行连接的,本篇我们专门介绍一下EDB JDBC连接EPAS数据库。

EDB JDBC 连接器将 Java 应用程序连接到 Postgres 数据库.


 JDBC 驱动程序类型


目前有四种类型的 JDBC 驱动程序,每种都有自己的实现、使用和限制。EDB JDBC 连接器是类型 4 驱动程序。

Type 1 driver

  • 该驱动程序类型是JDBC-ODBC桥。

  • 它仅限于本地运行。

  • 计算机上必须安装 ODBC。

  • 算机上必须安装特定数据库的ODBC驱动程序。

  • 由于本机方法调用,通常无法在applet内运行。

Type 2 driver

  • 这是本地数据库库驱动程序。

  • 使用计算机上的本机数据库library来访问数据库。

  • 由于本机方法调用,通常无法在applet内运行。

  • 客户端必须安装数据库。

Type 3 driver

  • 100% Java 驱动程序,非本地的(native)方法。

  • 不需要在客户端上预安装。

  • 可以像任何 Java 类文件一样即时下载和配置。

  • 使用专有协议与中间件服务器通信。

  • 中间件服务器将专有调用转换为 DBMS 特定调用。

Type 4 driver

  • 100% Java 驱动程序,非本地的(native)方法。

  • 不需要在客户端上预安装。

  • 可以像任何 Java 类文件一样即时下载和配置。

  • 与 Type 3 驱动程序不同,它直接与 DBMS 服务器对话。

  • 将 JDBC 调用直接转换为数据库特定的调用。


 JDBC 接口


下图显示了 JDBC 规范中的核心 API 接口以及它们之间的关系。这些接口在java.sql包中实现。


 JDBC 类和接口


核心API由类和接口组成。这些类和接口协同工作,如图所示:


 JDBC 驱动管理器


下图描述了DriverManager类在典型JDBC应用程序中的角色。DriverManager充当Java应用程序和后端数据库之间的桥梁,并确定用于目标数据库的JDBC驱动程序。


 EDB Postgres Advanced Server JDBC连接器兼容性


EDB jdbc Connector v42.7.3.2是目前的jdbc版本。除非有特殊要求(运行旧应用程序或JVM),否则应该使用此驱动程序。该驱动程序支持PostgreSQL 10或更高版本,并需要Java 8或更高版本。它包含对SSL和 javax.sql 包的支持。

Note:当前版本不再支持 Java 1.6 和 1.7。之前版本的EDB JDBC Connector v42.2.12.3将继续支持Java 1.6和1.7版本。


 安装 Java 和 EDB JDBC


    sudo dnf -y install java
    sudo dnf -y install edb-jdbc
    sudo dnf -y install java-11-openjdk
    sudo dnf -y install java-devel
    [nuser@epas-1 ~]$ java -version
      openjdk version "11.0.22" 2024-01-16 LTS
      OpenJDK Runtime Environment (Red_Hat-11.0.22.0.7-2.0.1) (build 11.0.22+7-LTS)
      OpenJDK 64-Bit Server VM (Red_Hat-11.0.22.0.7-2.0.1) (build 11.0.22+7-LTS, mixed mode, sharing)

      如果显示是1.8.0

      可以通过以下命令修改系统所有java版本。

        sudo update-alternatives --config java
          # select 2),java-11-openjdk.x86_64

          以下示例是使用以下OS、Java 和 EDB JDBC 包执行的:

            [nuser@epas-1 ~]$ cat etc/oracle-release
              Oracle Linux Server release 8.5


                [nuser@epas-1 ~]$ sudo dnf list installed |grep "java\|jdbc"
                  edb-jdbc.noarch                      42.7.3.2-1.el8                               @enterprisedb-enterprise-noarch
                  java-1.8.0-openjdk.x86_64            1:1.8.0.432.b06-2.0.1.el8                    @ol8_appstream                
                  java-1.8.0-openjdk-headless.x86_64   1:1.8.0.432.b06-2.0.1.el8                    @ol8_appstream                
                  java-11-openjdk.x86_64               1:11.0.22.0.7-2.0.1.el8                      @ol8_appstream                
                  java-11-openjdk-devel.x86_64         1:11.0.22.0.7-2.0.1.el8                      @ol8_appstream                
                  java-11-openjdk-headless.x86_64      1:11.0.22.0.7-2.0.1.el8                      @ol8_appstream                
                  javapackages-filesystem.noarch       5.3.0-2.module+el8+5206+de031079             @ol8_codeready_builder        
                  tzdata-java.noarch                   2024b-4.0.1.el8                              @ol8_appstream              


                    [nuser@epas-15 bin]$ java -version
                      openjdk version "1.8.0_432"
                      OpenJDK Runtime Environment (build 1.8.0_432-b06)
                      OpenJDK 64-Bit Server VM (build 25.432-b06, mixed mode)


                       select 示例


                      7.1 创建 Java 文件


                        $ vi jdbc_select.java
                          import java.sql.*;


                          public class JDBC_select {
                             public static void main(String[] args) {
                                 try {
                                     // 加载 EDB JDBC 驱动
                                     Class.forName("com.edb.Driver");


                                     // 数据库连接参数
                                     String url      = "jdbc:edb://192.168.31.101:5444/edb";
                                     String user     = "enterprisedb";
                                     String password = "enterprisedb";


                                     // 建立连接
                                     Connection con  = DriverManager.getConnection(url, user, password);


                                     // 创建 SQL 语句
                                     Statement stmt  = con.createStatement();


                                     // 执行查询
                                     ResultSet rs    = stmt.executeQuery("SELECT * FROM emp");


                                     // 获取列数和列名
                                     ResultSetMetaData rsMetaData = rs.getMetaData();
                                     int columnCount = rsMetaData.getColumnCount();


                                     // 打印列名
                                     for (int i = 1; i <= columnCount; i++) {
                                         System.out.print(rsMetaData.getColumnName(i) + "\t");
                                     }
                                     System.out.println();


                                     // 遍历结果集并打印每行数据
                                     while (rs.next()) {
                                         for (int i = 1; i <= columnCount; i++) {
                                                             System.out.print(rs.getString(i) + "\t");
                                         }
                                         System.out.println();
                                     }


                                     // 关闭资源
                                     rs.close();
                                     stmt.close();
                                     con.close();


                                     System.out.println("Command successfully executed");
                                 } catch (ClassNotFoundException e) {
                                     System.out.println("Class Not Found: " + e.getMessage());
                                 } catch (SQLException exp) {
                                     System.out.println("SQL Exception: " + exp.getMessage());
                                     System.out.println("SQL State:     " + exp.getSQLState());
                                     System.out.println("Vendor Error:  " + exp.getErrorCode());
                                 }
                             }
                          }

                          其中的连接信息不必多说,一看就明白。

                          编辑 ResultSet rs ,将 SQL 查询SELECT * FROM emp替换为所需的查询。


                          7.2 查找.jar文件位置


                            $ find usr /opt -type f -name 'edb-jdbc*.jar'
                              /usr/edb/jdbc/edb-jdbc18.jar


                              7.3 执行EDB JDBC程序


                              运行以下命令,插入 .jar 路径:

                                [nuser@epas-1 jdbc]$ java -cp /usr/edb/jdbc/edb-jdbc.jar jdbc_select.java
                                  empno  ename  job  mgr  hiredate  sal  comm  deptno  
                                  7369  SMITH  CLERK  7902  1980-12-17 00:00:00  800.00  null  20  
                                  7499  ALLEN  SALESMAN  7698  1981-02-20 00:00:00  1600.00  300.00  30
                                  7521  WARD  SALESMAN  7698  1981-02-22 00:00:00  1250.00  500.00  30
                                  7566  JONES  MANAGER  7839  1981-04-02 00:00:00  2975.00  null  20  
                                  7654  MARTIN  SALESMAN  7698  1981-09-28 00:00:00  1250.00  1400.00  30
                                  7698  BLAKE  MANAGER  7839  1981-05-01 00:00:00  2850.00  null  30  
                                  7782  CLARK  MANAGER  7839  1981-06-09 00:00:00  2450.00  null  10  
                                  7788  SCOTT  ANALYST  7566  1987-04-19 00:00:00  3000.00  null  20  
                                  7839  KING  PRESIDENT  null  1981-11-17 00:00:00  5000.00  null  10
                                  7844  TURNER  SALESMAN  7698  1981-09-08 00:00:00  1500.00  0.00  30
                                  7876  ADAMS  CLERK  7788  1987-05-23 00:00:00  1100.00  null  20  
                                  7900  JAMES  CLERK  7698  1981-12-03 00:00:00  950.00  null  30  
                                  7902  FORD  ANALYST  7566  1981-12-03 00:00:00  3000.00  null  20  
                                  7934  MILLER  CLERK  7782  1982-01-23 00:00:00  1300.00  null  10  
                                  Command successfully executed


                                   Update示例


                                  8.1 创建java程序


                                    $ vi jdbc_update.java
                                      import java.sql.*;
                                      public class JDBC_update {
                                         public static void main(String[] args) {
                                             try {
                                                 // 加载 EDB JDBC 驱动
                                                 Class.forName("com.edb.Driver");
                                                 // 数据库连接参数
                                                 String url      = "jdbc:edb://192.168.31.101:5444/edb";
                                                 String user     = "enterprisedb";
                                                 String password = "enterprisedb";
                                                 // 建立连接
                                                 Connection con  = DriverManager.getConnection(url, user, password);
                                                 // 更新语句
                                                 String updateQuery = "UPDATE emp SET sal = ? WHERE empno = ? AND sal = ?";
                                                 // 创建 PreparedStatement
                                                 PreparedStatement pstmt = con.prepareStatement(updateQuery);
                                                 // 设置参数
                                                 pstmt.setDouble(1, 2300);  // 新薪水
                                                 pstmt.setInt(2, 7934);     // 员工编号
                                                 pstmt.setDouble(3, 1300);  // 当前薪水
                                                 // 执行更新
                                                 int rowsUpdated = pstmt.executeUpdate();
                                                 // 检查更新结果
                                                 if (rowsUpdated > 0) {
                                                     System.out.println("Employee's salary updated successfully.");
                                                 } else {
                                                     System.out.println("No matching record found, or salary is not
                                                     1300.");
                                                 }
                                                 // 关闭资源
                                                 pstmt.close();
                                                 con.close();
                                             } catch (ClassNotFoundException e) {
                                                 System.out.println("Class Not Found: " + e.getMessage());
                                             } catch (SQLException exp) {
                                                 System.out.println("SQL Exception: " + exp.getMessage());
                                                 System.out.println("SQL State:     " + exp.getSQLState());
                                                 System.out.println("Vendor Error:  " + exp.getErrorCode());
                                             }
                                         }
                                      }

                                      修改 empno 号为7934的员工薪水为2300


                                      8.2 执行java程序


                                      运行以下命令,插入 .jar 路径:

                                        [nuser@epas-1 jdbc]$ java -cp /usr/edb/jdbc/edb-jdbc.jar jdbc_update.java
                                          Employee's salary updated successfully.


                                           alter 数据


                                          9.1 创建java程序


                                          该文件会更改数据库中的数据,从而更改用户的密码。

                                            $ vi jdbc_alter.java
                                              import java.sql.Connection;
                                              import java.sql.DriverManager;
                                              import java.sql.Statement;


                                              public class jdbc_alter {
                                                 public static void main(String[] args) {
                                                     Connection c = null;
                                                     Statement stmt = null;
                                                     try {
                                                         // 加载 EDB 驱动
                                                         Class.forName("com.edb.Driver");


                                                         // 连接到数据库
                                                        c
                                                        DriverManager.getConnection("jdbc:edb://192.168.31.101:5444/edb",
                                              "enterprisedb",  "enterprisedb");
                                                         // 设置自动提交为 false
                                                         c.setAutoCommit(false);
                                                         System.out.println("Successfully Connected.");
                                                         // 创建 Statement
                                                         stmt = c.createStatement();
                                                         // 执行 ALTER ROLE 语句
                                                         String sql = "ALTER ROLE test PASSWORD 'test4321'";
                                                         stmt.executeUpdate(sql);
                                                         // 提交事务
                                                         c.commit();
                                                         System.out.println("Password updated successfully.");
                                                     } catch (Exception e) {
                                                         // 捕获异常并打印错误信息
                                                         System.err.println(e.getClass().getName() + ": " + e.getMessage());
                                                         // 如果发生异常,回滚事务
                                                         try {
                                                             if (c != null) {
                                                                 c.rollback();
                                                             }
                                                         } catch (Exception rollbackEx) {
                                                             System.err.println("Rollback failed: " + rollbackEx.getMessage());
                                                         }
                                                     } finally {
                                                         try {
                                                             // 关闭资源
                                                             if (stmt != null) stmt.close();
                                                             if (c != null) c.close();
                                                         } catch (Exception closeEx) {
                                                             System.err.println("Failed to close resources: " + closeEx.getMessage());
                                                         }
                                                     }
                                                 }
                                              }


                                              9.2 设置 CLASSPATH


                                              为什么使用EDB JDBC,我们设置CLASSPATH环境变量。

                                                export CLASSPATH=/usr/edb/jdbc/edb-jdbc18.jar:.
                                                echo $CLASSPATH

                                                验证设置生效。


                                                9.3 编译


                                                执行javac对java程序进行编译

                                                  javac jdbc_alter.java

                                                  生成编译类文件jdbc_alter.class


                                                  9.4 执行文件


                                                  在当前目录下执行

                                                    [nuser@epas-1 jdbctest]$ java jdbc_alter
                                                      Successfully Connected.
                                                      Password updated successfully.


                                                      关于公司

                                                      感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。


                                                      欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!

                                                      Elastic 微信群

                                                      EDB 微信群


                                                      发现“分享”“赞”了吗,戳我看看吧




                                                      文章转载自新智锦绣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                      评论