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¶m2=value2
jdbc:unvdb://host1:port1,host2:port2:database?param1=value1¶m2=value2
说明:
database为要连接的数据库名称。host为数据库服务器名称或IP地址。本地数据库情况下连接服务器为localhost。port为数据库服务器端口。UDB-TX的默认服务器端口为5678。param为参数名称,即数据库连接属性。参数可以配置在URL中,以“?”开始配置,以“=”给参数赋值,以“&”作为不同参数的间隔。value为参数值,即数据库连接属性值。连接时需配置connectTimeout、socketTimeout,如果未配置,默认为0,即不会超时。
示例:国密SM3用户认证登录方式
服务器端配置
服务器端配置
修改unvdbsvr.conf
password_encryption = sm3 # md5 or scram-sha-256 or sm32
修改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
注释:
JDK 版本 11+
Java 第三方依赖库还需要 BC 库:cprov-jdk18on-1.78.1.jar 提供国密算法
连接数据库(以 TLCP 方式)
服务端配置
制作数字证书
在安装 UDB-TX 完成后,进入 bin 目录,执行命令
gen.sh path自动生成并安装证书,path 是数据库的数据路径。比如/home/soft/unvdb-data/执行完上述命令,服务器的证书文件将会自动拷贝到数据目录,客户端的证书文件自动拷贝到 ~/unvdb/目录下。
设置启用国密传输加密方式
a. 在 unvdb-data 中修改 unvdbsvr.conf 文件。修改结果如下图所示:

修改方式:将上图中红框内的参数前的 # 删除,并将 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最终修改后的结果如下图所示:
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>
注释:
JDK 版本 11+
Java 第三方依赖库还需要 BC 库:
cprov-jdk18on-1.78.1.jar提供国密算法,bgmprovider.jar提供国密传输加密套件