基于GaussDB JDBC开发
JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问接口,应用程序可基于它操作数据。
M-Comaptibility数据库支持基于GaussDB JDBC的开发,具体使用方法参见《开发指南》中的“应用程序开发 > 基于JDBC开发”章节,部分功能和GaussDB存在差异,具体参见“GaussDB JDBC连接M-Compatibility数据库使用约束”。
GaussDB JDBC连接M-Compatibility数据库使用约束
- 使用DriverManager.getConnection(String url, Properties info)方法创建数据库连接时,info参数不支持如下属性:binaryTransfer、binaryTransferEnable、binaryTransferDisable;
- 使用DriverManager.getConnection(String url, Properties info)方法创建数据库连接时,当开启info参数mCompatible后,部分功能和行为会产生变更,变更兼容MySQL JDBC 5.1版本驱动,具体变更请参见《开发指南》中“应用程序开发 > 基于JDBC开发 > 开发步骤 > 连接数据库 > 连接参数参考”章节。
- 其他不支持的GaussDB特性,具体参见M-Compatibility数据库不支持的GaussDB特性。
- 在使用GaussDB JDBC连接数据库,在PBE场景执行参数绑定时,推荐按照表1 各个数据类型推荐的JDBC写入方式中的JDBC写入方式进行绑定,否则可能导致实际的操作符选择与GSQL执行时不一致。由于目前的比较函数功能还不够完善,请确保操作符两侧进行处理的参数类型一致,避免对不同类型的数据进行比较,否则可能存在非预期的结果。
表1 各个数据类型推荐的JDBC写入方式
| 数值数据类型 | MYSQL数据类型 | DRS JDBC写入方式 |
|---|---|---|
| 整数类型 | BOOL | prepStatement.setBoolean |
| BOOLEAN | prepStatement.setBoolean | |
| TINYINT[(M)][UNSIGNED] | prepStatement.setShort/prepStatement.setInt | |
| SMALLINT[(M)][UNSIGNED] | prepStatement.setShort/prepStatement.setInt | |
| MEDIUMINT[(M)][UNSIGNED] | prepStatement.setInt/prepStatement.setInt | |
| INT[(M)][UNSIGNED] | prepStatement.setInt/prepStatement.setLong | |
| INTEGER[(M)][UNSIGNED] | prepStatement.setInt/prepStatement.setLong | |
| BIGINT[(M)][UNSIGNED] | prepStatement.setLong/prepStatement.setBigDecimal | |
| 任意精度类型 | DECIMAL[( M[,D])][UNSIGNED] | prepStatement.setBigDecimal |
| NUMERIC[(M[,D])][UNSIGNED] | prepStatement.setBigDecimal | |
| DEC[(M[,D])][UNSIGNED] | prepStatement.setBigDecimal | |
| FIXED[(M[,D])] | prepStatement.setBigDecimal | |
| FLOAT[(M,D)][UNSIGNED] | prepStatement.setFloat(index, Float.parseFloat(val)) | |
| FLOAT(p)[UNSIGNED] | prepStatement.setFloat(index, Float.parseFloat(val)) | |
| DOUBLE[(M,D)][UNSIGNED] | prepStatement.setDouble | |
| DOUBLE PRECISION[(M,D)] | prepStatement.setDouble | |
| REAL[(M,D)][UNSIGNED] | prepStatement.setDouble | |
| 日期与时间数据类型 | DATE | prepStatement.setDate |
| DATETIME[(fsp)] | prepStatement.setString/prepStatement.setTimestamp(1970/1/1 0:00:00) | |
| TIMESTAMP[ (fsp)] | prepStatement.setString/prepStatement.setTimestamp | |
| TIME[(fsp)] | prepStatement.setString | |
| YEAR | prepStatement.setDate | |
| 字符串数据类型 | CHAR[(M)] | prepStatement.setObject(index, val, 1); |
| VARCHAR(M) | prepStatement.setString | |
| TINYTEXT | prepStatement.setString | |
| TEXT | prepStatement.setString | |
| MEDIUMTEXT | prepStatement.setString | |
| LONGTEXT | prepStatement.setString | |
| ENUM('value1','value2',...) | prepStatement.setString | |
| SET('value1','value2',...) | prepStatement.setString | |
| 二进制数据类型 | BINARY[(M)] | prepStatement.setBytes(index, val); |
| VARBINARY(M) | prepStatement.setBytes(index, val); | |
| TINYBLOB | prepStatement.setBlob(index,PGBlob); | |
| BLOB | prepStatement.setBlob(index,PGBlob); | |
| MEDIUMBLOB | prepStatement.setBlob(index,PGBlob); | |
| LONGBLOB | prepStatement.setBlob(index,PGBlob); | |
| BIT[(M)] | prepStatement.setBigDecimal | |
| JSON 数据类型 | JSON | prepStatement.setString |
- 使用getGeneratedKeys方法获取批量插入的自增值时,返回的结果是由数据库驱动根据首条自增值、自增步长以及插入的条目数决定。如果在批量插入操作中用户指定了自增列的值,那么返回的结果可能与预期的结果存在差异。
- 当GUC参数m_err_sql_dialect的值为"MySQL"时,可以启用错误码替换功能,将GaussDB内核的错误码和SQLSTATE替换为M-Compatibility模式数据库的错误码和SQLSTATE。
- prepStatement.setTime方法会保留毫秒数值,与MySQL驱动对毫秒数值进行丢弃的行为存在差异。