JDBC 驱动

JDBC驱动包:

  JDBC(JavaDatabaseConnectivity,Java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问接口,应用程序可基于它操作数据。UDB-TX库提供了对JDBC4.0特性的支持,需要使用JDK1.8、JDK11版本编译程序代码。

  UDB-TX JDBC驱动兼容PostgreSQL连接协议,相较与开源PG驱动主要做了以下特性的增强:

  • 支持国密TLCP传输加密

  • 支持国密SM3加密方式登录。

获取驱动jar包

unvdb-jdbc-<VERSION>.jar在数据库安装程序目录的Interface/JDBC文件夹内

驱动类:

UDB-TX驱动类com.unvdb.Driver在JDBC的使用上与PG的使用方法保持兼容

加载驱动:

方式一:发布到本地maven仓

mvn install: install-file  -Dgroupld=com.unvdb  -Dartifactld=unvdb-jdbc  -Dversion=42.7.4  -Dpackaging=jar  -Dfile=unvdb-jdbc-42.7.4.SNAPSHOT.jar
pom.xml增加依赖
<!-- unvdb数据库连接驱动 -->
    <dependency> 
        <groupld>com.unvdb</groupld> 
        <artifactld>unvdb-jdbc</artifactld> 
        <version>42.7.4</version>
    </dependency>

方式二:将unvdb-jar导入工程项目的lib库

环境:

  • JDK1.8+、

  • JDK11+

    推荐使用 JDK11

连接数据库

数据库连接参数

jdbc:unvdb:database
jdbc:unvdb://host:database
jdbc:unvdb://host:port/database
jdbc:unvdb://host:port/database?param1=value1&param2=value2
jdbc:unvdb://host1:port1,host2:port2:database?param1=value1&param2=value2

说明:

  • database为要连接的数据库名称。

  • host为数据库服务器名称或IP地址。本地数据库情况下连接服务器为localhost。

  • port为数据库服务器端口。UDB-TX的默认服务器端口为5678。

  • param为参数名称,即数据库连接属性。参数可以配置在URL中,以“?”开始配置,以“=”给参数赋值,以“&”作为不同参数的间隔。

  • value为参数值,即数据库连接属性值。

  • 连接时需配置connectTimeout、socketTimeout,如果未配置,默认为0,即不会超时。

示例:国密SM3用户认证登录方式

服务器端配置

服务器端配置

  1. 修改unvdbsvr.conf

password_encryption = sm3 # md5 or scram-sha-256 or sm32
  1. 修改ud_hba.conf增加如下示例配置

host      all       all       0.0.0.0/0       sm3

重启数据库 客户端代码示例

import java.net.SocketTimeoutException;
import java.sql.*;

  public class UNVDBJDBCSM3Demo {
    public static void main(String[] args) {

      String url = "jdbc:unvdb://192.168.4.216:5678/unvdb";
      String user = "unvdb";
      String password = "test";
      String selectSQL = "show password_encryption";

      try (Connection conn = DriverManager.getConnection(url, user, password);
        PreparedStatement pstmt = conn.prepareStatement(selectSQL);
        ResultSet rs = pstmt.executeQuery()) {

      while (rs.next()) {

        String password_encryption = rs.getString("password_encryption");
        System.out.println("password_encryption from db: " + password_encryption);
        assert password_encryption.equals("sm3");
        }
      } catch (SQLException e) {
          e.printStackTrace();
        }
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.unvdb</groupId>
    <artifactId>JDBCDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.unvdb</groupId>
            <artifactId>unvdb-jdbc</artifactId>
            <version>42.7.4-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.78.1</version>
        </dependency>
    </dependencies>
</project>

输出示例:

信息:Load HMACSM3 provider by JDBC Driver
password_encryption from db: sm3

注释:

  1. JDK 版本 11+

  2. Java 第三方依赖库还需要 BC 库:cprov-jdk18on-1.78.1.jar 提供国密算法

连接数据库(以 TLCP 方式)

服务端配置

  1. 制作数字证书

    在安装 UDB-TX 完成后,进入 bin 目录,执行命令 gen.sh path 自动生成并安装证书,path 是数据库的数据路径。比如/home/soft/unvdb-data/

    执行完上述命令,服务器的证书文件将会自动拷贝到数据目录,客户端的证书文件自动拷贝到 ~/unvdb/目录下。

  2. 设置启用国密传输加密方式

    a. 在 unvdb-data 中修改 unvdbsvr.conf 文件。修改结果如下图所示:

    ../../_images/unvdbsvr.png

    修改方式:将上图中红框内的参数前的 # 删除,并将 ssl 和 ssl_use_t1cp 的值改为 on 即可。
    b. 在 unvdb-data 中修改 ud_hba.conf 文件。

    在参数中增加:

    hostssl       all       all       0.0.0.0/0       cert
    

    在参数中注释掉host all all 0.0.0.0/0 sm3最终修改后的结果如下图所示: ../../_images/ub_hba.png
    c.启动UDB-TX的服务具体步骤可参考UDB-TX使用文档

客户端配置

  将服务端运行gen.sh脚本后生成在~/.unvdb/目录下的证书文件client.key.pk8、client_enc.key.pk8、client.crt、client_enc.crt、cacert.pem放置在客户端。

示例:TLCP方式

UNVDBTLCPDemo.java

import java.sql.*;
import java.util.Properties;

public class UNVDBTLCPDemo {
    public static void main(String[] args) {
        /*
        unvdb=# create user client password 'unvdb_123';
        */
        Properties urlProps = new Properties();
        String urls = "jdbc:unvdb://192.168.4.216:5678/unvdb";
        urlProps.setProperty("ssl", "true");
        urlProps.setProperty("user", "client");
        urlProps.setProperty("ssltlcp", "true");
        // sslmode 可配置为 prefer 及以上级别
        urlProps.setProperty("sslmode", "verify-ca");
        urlProps.setProperty("sslrootcert", "unvdb/cacert.pem");
        urlProps.setProperty("sslcert", "unvdb/client.crt");
        urlProps.setProperty("sslkey", "unvdb/client.key.pk8");
        urlProps.setProperty("sslenccert", "unvdb/client_enc.crt");
        urlProps.setProperty("sslenckey", "unvdb/client_enc.key.pk8");

        try {
            Class.forName("com.unvdb.Driver").newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 查询操作
        String selectSQL = "show password_encryption";
        try (Connection conn = DriverManager.getConnection(urls, urlProps);
             PreparedStatement pstmt = conn.prepareStatement(selectSQL);
             ResultSet rs = pstmt.executeQuery()) {

            while (rs.next()) {
                String password_encryption = rs.getString("password_encryption");
                System.out.println("password_encryption from db: " + password_encryption);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.unvdb</groupId>
    <artifactId>JDBCDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.unvdb</groupId>
            <artifactId>unvdb-jdbc</artifactId>
            <version>42.7.4-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.78.1</version>
        </dependency>
        <dependency>
            <groupId>org.openeuler</groupId>
            <artifactId>bgmprovider</artifactId>
            <version>1.1.3</version>
        </dependency>
    </dependencies>
</project>

注释:

  1. JDK 版本 11+

  2. Java 第三方依赖库还需要 BC 库:cprov-jdk18on-1.78.1.jar 提供国密算法, bgmprovider.jar 提供国密传输加密套件