【云小课】EI第53课 快使用JDBC连接GaussDB(DWS),来一起玩转数据库~
JDBC开发流程
前提条件
- 已安装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进程内需要同时访问PostgreSQL及GaussDB(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连接数据库
在Linux和Windows环境下操作方法相同,以下步骤以Windows环境为例。
步骤一:用户通过JDBC连接GaussDB(DWS)集群时,可以选择是否采用SSL认证方式。SSL认证用于加密客户端和服务器之间的通讯数据,为敏感数据在Internet上的传输提供了一种安全保障手段。SSL模式安全性高于普通模式,建议在使用JDBC连接GaussDB(DWS)集群时采用SSL模式。
- 是,单击指定集群名称,切换至“安全设置”页签,在“SSL连接”区域开启SSL连接,默认为开启。执行步骤三。
- 否,关闭SSL连接,执行步骤四。
步骤二:(可选)如果使用Linux环境,使用WinScp工具将SSL证书上传到Linux环境上。
步骤三:配置证书以使用SSL加密连接。OpenSSL工具下载地址:https://slproweb.com/products/Win32OpenSSL.html
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
2. 请用户根据提示信息输入自定义的可信库密码并确认密码,然后输入“y”确认信任证书。
3. 执行以下命令转化客户端私钥。
openssl pkcs12 -export -out client.pkcs12 -in client.crt -inkey client.key
需要输入客户端私钥的密码“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的格式如下:
|
info |
数据库连接属性。常用的属性如下:
|
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接口开发应用程序。
在完成以下示例前,用户需要先创建存储过程哦~
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();
}
}
}
了解更多数据仓库服务内容,猛戳此处!!!
- 点赞
- 收藏
- 关注作者
评论(0)