1. 程式人生 > 實用技巧 >開發自己的jdbc驅動——基本說明

開發自己的jdbc驅動——基本說明

jdbc目前支援4種類型的驅動模式
參考如下圖,我們需要開發的是type4 100%純java程式碼的,以下只是簡單的原型,實現一個比較完整的jdbc驅動,後續會逐步完成

專案結構

當前沒有依賴任何三方包,對於包含了依賴的,對於驅動的如果使用maven專案推薦使用maven-shade-plugin 外掛,儘管這樣開發的驅動
比較大,但是可靠性以及穩定性比較好(減少依賴包衝突)

  • maven 專案結構
├── pom.xml
└── src
  ├── main
  ├── java
  └── com
  └── dalong
  └── jdbc
  ├── MyConnection.java
  ├── MyDatabaseMetaData.java
  └── MyDriver.java
  └── resources
  └── META-INF
  └── services
  └── java.sql.Driver
  └── test
    └── java
  • 簡單說明
    resources/META-INF/services/java.sql.Driver 這個檔案是jdbc驅動開發的一個約定(spi),內容很簡單(指定我們驅動的完整類名就可以了)
com.dalong.jdbc.MyDriver

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.dalong</groupId>
  <artifactId>myjdbc</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <encoding>UTF-8</encoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
</project>

MyDriver.java driver 介面的實現,一個通用的模式

package com.dalong.jdbc;
import java.io.Closeable;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.logging.Logger;
/**
 @author dalong
 mydemo jdbc driver for http tet
 */
public class MyDriver implements Driver, Closeable {
  static final String DRIVER_NAME = "my JDBC Driver";
  static final String DRIVER_VERSION;
  static final int DRIVER_VERSION_MAJOR;
  static final int DRIVER_VERSION_MINOR;
  private static final String DRIVER_URL_START = "jdbc:myapp:";
  static  {
    // 我們通過靜態建構函式註冊我們的驅動,如果瞭解golang 的sql 驅動的話,也是一樣的,支援golang 基於了 init 函式進行驅動的註冊
    try {
      DRIVER_VERSION_MAJOR= 3;
      DRIVER_VERSION_MINOR =1;
      DRIVER_VERSION = "1.0.0";
      MyDriver driver = new MyDriver();
      DriverManager.registerDriver(driver);
     } catch (SQLException e) {
      throw new RuntimeException(e);
     }
   }
  @Override
  public void close() throws IOException {
    // http connect demo
   }
  // implements connect  manage connect
  @Override
  public Connection connect(String url, Properties info) throws SQLException {
    // first check url is validate
    if (acceptsURL(url)){
      return new MyConnection(url,info);
     }
    return null;
   }
  @Override
  public boolean acceptsURL(String url) throws SQLException {
    return url.startsWith(DRIVER_URL_START);
   }
  @Override
  public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
    return new DriverPropertyInfo[0];
   }
  @Override
  public int getMajorVersion() {
    return DRIVER_VERSION_MAJOR;
   }
  @Override
  public int getMinorVersion() {
    return DRIVER_VERSION_MINOR;
   }
  @Override
  public boolean jdbcCompliant() {
    return false;
   }
  @Override
  public Logger getParentLogger() throws SQLFeatureNotSupportedException {
    return null;
   }
}

MyConnection.java 我們所有的操作都是基於connection 的,此程式碼比較簡單,沒有新增特殊的東西,主要是關於
DatabaseMetaData的返回(方便嘗試的,後邊繼續完整)

package com.dalong.jdbc;
import java.sql.*;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
/**
 @author dalong
 實現一個jdbc connection 包裝 http 請求
*/
public class MyConnection implements Connection {
  // atomic operators
  MyConnection(String url,Properties properties) {
   }
  @Override
  public Statement createStatement() throws SQLException {
    return null;
   }
  @Override
  public PreparedStatement prepareStatement(String sql) throws SQLException {
    return null;
   }
  @Override
  public CallableStatement prepareCall(String sql) throws SQLException {
    return null;
   }
  @Override
  public String nativeSQL(String sql) throws SQLException {
    // 輸出原始sql
    return sql;
   }
  //  事務支援
  @Override
  public void setAutoCommit(boolean autoCommit) throws SQLException {
   }
  @Override
  public boolean getAutoCommit() throws SQLException {
    return false;
   }
  @Override
  public void commit() throws SQLException {
   }
  @Override
  public void rollback() throws SQLException {
   }
  @Override
  public void close() throws SQLException {
   }
  @Override
  public boolean isClosed() throws SQLException {
    return false;
   }
 // 返回元資料資訊,通過自己實現的MyDatabaseMetaData 完成部分
  @Override
  public DatabaseMetaData getMetaData() throws SQLException {
    // 可以通過約定獲取
    return new MyDatabaseMetaData();
   }
  @Override
  public void setReadOnly(boolean readOnly) throws SQLException {
   }
  @Override
  public boolean isReadOnly() throws SQLException {
    return true;
   }
  @Override
  public void setCatalog(String catalog) throws SQLException {
   }
  @Override
  public String getCatalog() throws SQLException {
    return null;
   }
  @Override
  public void setTransactionIsolation(int level) throws SQLException {
   }
  @Override
  public int getTransactionIsolation() throws SQLException {
    return 0;
   }
  @Override
  public SQLWarning getWarnings() throws SQLException {
    return null;
   }
  @Override
  public void clearWarnings() throws SQLException {
   }
  @Override
  public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
    return null;
   }
  @Override
  public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
    return null;
   }
  @Override
  public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
    return null;
   }
  @Override
  public Map<String, Class<?>> getTypeMap() throws SQLException {
    return null;
   }
  @Override
  public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
   }
  @Override
  public void setHoldability(int holdability) throws SQLException {
   }
  @Override
  public int getHoldability() throws SQLException {
    return 0;
   }
  @Override
  public Savepoint setSavepoint() throws SQLException {
    return null;
   }
  @Override
  public Savepoint setSavepoint(String name) throws SQLException {
    return null;
   }
  @Override
  public void rollback(Savepoint savepoint) throws SQLException {
   }
  @Override
  public void releaseSavepoint(Savepoint savepoint) throws SQLException {
   }
  @Override
  public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
    return null;
   }
  @Override
  public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
    return null;
   }
  @Override
  public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
    return null;
   }
  @Override
  public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
    return null;
   }
  @Override
  public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
    return null;
   }
  @Override
  public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
    return null;
   }
  @Override
  public Clob createClob() throws SQLException {
    return null;
   }
  @Override
  public Blob createBlob() throws SQLException {
    return null;
   }
  @Override
  public NClob createNClob() throws SQLException {
    return null;
   }
  @Override
  public SQLXML createSQLXML() throws SQLException {
    return null;
   }
  @Override
  public boolean isValid(int timeout) throws SQLException {
    return false;
   }
  @Override
  public void setClientInfo(String name, String value) throws SQLClientInfoException {
   }
  @Override
  public void setClientInfo(Properties properties) throws SQLClientInfoException {
   }
  @Override
  public String getClientInfo(String name) throws SQLException {
    return null;
   }
  @Override
  public Properties getClientInfo() throws SQLException {
    return null;
   }
  @Override
  public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
    return null;
   }
  @Override
  public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
    return null;
   }
  @Override
  public void setSchema(String schema) throws SQLException {
    throw new SQLFeatureNotSupportedException();
   }
  @Override
  public String getSchema() throws SQLException {
    throw new SQLFeatureNotSupportedException();
   }
  @Override
  public void abort(Executor executor) throws SQLException {
    throw new SQLFeatureNotSupportedException();
   }
  @Override
  public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {
   }
  @Override
  public int getNetworkTimeout() throws SQLException {
    return 0;
   }
  @Override
  public <T> T unwrap(Class<T> iface) throws SQLException {
    return null;
   }
  @Override
  public boolean isWrapperFor(Class<?> iface) throws SQLException {
    return false;
   }
}

MyDatabaseMetaData.java 元資料暴露的,程式碼很簡單,主要是提供了使用者在連線的時候提示資訊

package com.dalong.jdbc;
import java.sql.*;
/**
 * @author dalong
 */
public class MyDatabaseMetaData implements DatabaseMetaData {
  @Override
  public boolean allProceduresAreCallable() throws SQLException {
    return false;
   }
  @Override
  public boolean allTablesAreSelectable() throws SQLException {
    return false;
   }
  @Override
  public String getURL() throws SQLException {
    return null;
   }
  @Override
  public String getUserName() throws SQLException {
    return null;
   }
  @Override
  public boolean isReadOnly() throws SQLException {
    return false;
   }
  @Override
  public boolean nullsAreSortedHigh() throws SQLException {
    return false;
   }
  @Override
  public boolean nullsAreSortedLow() throws SQLException {
    return false;
   }
  @Override
  public boolean nullsAreSortedAtStart() throws SQLException {
    return false;
   }
  @Override
  public boolean nullsAreSortedAtEnd() throws SQLException {
    return false;
   }
  @Override
  public String getDatabaseProductName() throws SQLException {
    return "my server 1.0.0";
   }
  @Override
  public String getDatabaseProductVersion() throws SQLException {
    return "my server 1.0.0";
   }
  @Override
  public String getDriverName() throws SQLException {
    return "myjdbc for my server";
   }
  @Override
  public String getDriverVersion() throws SQLException {
    return "1.0.0";
   }
  @Override
  public int getDriverMajorVersion() {
    return MyDriver.DRIVER_VERSION_MAJOR;
   }
  @Override
  public int getDriverMinorVersion() {
    return MyDriver.DRIVER_VERSION_MINOR;
   }
  @Override
  public boolean usesLocalFiles() throws SQLException {
    return false;
   }
  @Override
  public boolean usesLocalFilePerTable() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsMixedCaseIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean storesUpperCaseIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean storesLowerCaseIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean storesMixedCaseIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
    return false;
   }
  @Override
  public String getIdentifierQuoteString() throws SQLException {
    return null;
   }
  @Override
  public String getSQLKeywords() throws SQLException {
    return null;
   }
  @Override
  public String getNumericFunctions() throws SQLException {
    return null;
   }
  @Override
  public String getStringFunctions() throws SQLException {
    return null;
   }
  @Override
  public String getSystemFunctions() throws SQLException {
    return null;
   }
  @Override
  public String getTimeDateFunctions() throws SQLException {
    return null;
   }
  @Override
  public String getSearchStringEscape() throws SQLException {
    return null;
   }
  @Override
  public String getExtraNameCharacters() throws SQLException {
    return null;
   }
  @Override
  public boolean supportsAlterTableWithAddColumn() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsAlterTableWithDropColumn() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsColumnAliasing() throws SQLException {
    return false;
   }
  @Override
  public boolean nullPlusNonNullIsNull() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsConvert() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsConvert(int fromType, int toType) throws SQLException {
    return false;
   }
  @Override
  public boolean supportsTableCorrelationNames() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsDifferentTableCorrelationNames() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsExpressionsInOrderBy() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsOrderByUnrelated() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsGroupBy() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsGroupByUnrelated() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsGroupByBeyondSelect() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsLikeEscapeClause() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsMultipleResultSets() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsMultipleTransactions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsNonNullableColumns() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsMinimumSQLGrammar() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCoreSQLGrammar() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsExtendedSQLGrammar() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsANSI92EntryLevelSQL() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsANSI92IntermediateSQL() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsANSI92FullSQL() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsIntegrityEnhancementFacility() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsOuterJoins() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsFullOuterJoins() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsLimitedOuterJoins() throws SQLException {
    return false;
   }
  @Override
  public String getSchemaTerm() throws SQLException {
    return null;
   }
  @Override
  public String getProcedureTerm() throws SQLException {
    return null;
   }
  @Override
  public String getCatalogTerm() throws SQLException {
    return null;
   }
  @Override
  public boolean isCatalogAtStart() throws SQLException {
    return false;
   }
  @Override
  public String getCatalogSeparator() throws SQLException {
    return null;
   }
  @Override
  public boolean supportsSchemasInDataManipulation() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSchemasInProcedureCalls() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSchemasInTableDefinitions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSchemasInIndexDefinitions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCatalogsInDataManipulation() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCatalogsInProcedureCalls() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCatalogsInTableDefinitions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsPositionedDelete() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsPositionedUpdate() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSelectForUpdate() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsStoredProcedures() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSubqueriesInComparisons() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSubqueriesInExists() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSubqueriesInIns() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsSubqueriesInQuantifieds() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsCorrelatedSubqueries() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsUnion() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsUnionAll() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
    return false;
   }
  @Override
  public int getMaxBinaryLiteralLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxCharLiteralLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxColumnNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxColumnsInGroupBy() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxColumnsInIndex() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxColumnsInOrderBy() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxColumnsInSelect() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxColumnsInTable() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxConnections() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxCursorNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxIndexLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxSchemaNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxProcedureNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxCatalogNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxRowSize() throws SQLException {
    return 0;
   }
  @Override
  public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
    return false;
   }
  @Override
  public int getMaxStatementLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxStatements() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxTableNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxTablesInSelect() throws SQLException {
    return 0;
   }
  @Override
  public int getMaxUserNameLength() throws SQLException {
    return 0;
   }
  @Override
  public int getDefaultTransactionIsolation() throws SQLException {
    return 0;
   }
  @Override
  public boolean supportsTransactions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsTransactionIsolationLevel(int level) throws SQLException {
    return false;
   }
  @Override
  public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsDataManipulationTransactionsOnly() throws SQLException {
    return false;
   }
  @Override
  public boolean dataDefinitionCausesTransactionCommit() throws SQLException {
    return false;
   }
  @Override
  public boolean dataDefinitionIgnoredInTransactions() throws SQLException {
    return false;
   }
  @Override
  public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getSchemas() throws SQLException {
    return null;
   }
  @Override
  public ResultSet getCatalogs() throws SQLException {
    return null;
   }
  @Override
  public ResultSet getTableTypes() throws SQLException {
    return null;
   }
  @Override
  public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getTypeInfo() throws SQLException {
    return null;
   }
  @Override
  public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException {
    return null;
   }
  @Override
  public boolean supportsResultSetType(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException {
    return false;
   }
  @Override
  public boolean ownUpdatesAreVisible(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean ownDeletesAreVisible(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean ownInsertsAreVisible(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean othersUpdatesAreVisible(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean othersDeletesAreVisible(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean othersInsertsAreVisible(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean updatesAreDetected(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean deletesAreDetected(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean insertsAreDetected(int type) throws SQLException {
    return false;
   }
  @Override
  public boolean supportsBatchUpdates() throws SQLException {
    return false;
   }
  @Override
  public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException {
    return null;
   }
  @Override
  public Connection getConnection() throws SQLException {
    return null;
   }
  @Override
  public boolean supportsSavepoints() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsNamedParameters() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsMultipleOpenResults() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsGetGeneratedKeys() throws SQLException {
    return false;
   }
  @Override
  public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException {
    return null;
   }
  @Override
  public boolean supportsResultSetHoldability(int holdability) throws SQLException {
    return false;
   }
  @Override
  public int getResultSetHoldability() throws SQLException {
    return 0;
   }
  @Override
  public int getDatabaseMajorVersion() throws SQLException {
    return 0;
   }
  @Override
  public int getDatabaseMinorVersion() throws SQLException {
    return 0;
   }
  @Override
  public int getJDBCMajorVersion() throws SQLException {
    return 0;
   }
  @Override
  public int getJDBCMinorVersion() throws SQLException {
    return 0;
   }
  @Override
  public int getSQLStateType() throws SQLException {
    return 0;
   }
  @Override
  public boolean locatorsUpdateCopy() throws SQLException {
    return false;
   }
  @Override
  public boolean supportsStatementPooling() throws SQLException {
    return false;
   }
  @Override
  public RowIdLifetime getRowIdLifetime() throws SQLException {
    return null;
   }
  @Override
  public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
    return null;
   }
  @Override
  public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException {
    return false;
   }
  @Override
  public boolean autoCommitFailureClosesAllResultSets() throws SQLException {
    return false;
   }
  @Override
  public ResultSet getClientInfoProperties() throws SQLException {
    return null;
   }
  @Override
  public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException {
    return null;
   }
  @Override
  public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
    return null;
   }
  @Override
  public boolean generatedKeyAlwaysReturned() throws SQLException {
    return false;
   }
  @Override
  public <T> T unwrap(Class<T> iface) throws SQLException {
    return null;
   }
  @Override
  public boolean isWrapperFor(Class<?> iface) throws SQLException {
    return false;
   }
}

連線試用

很簡單,我們基於dbeaver 配置我們自己開發的驅動進行連線

  • 構建jar包
mvn clean package
  • 新增新的dbeaver驅動配置


  • 使用自己的驅動進行連線測試

說明

以上程式碼很簡單,主要是關於jdbc驅動開發的基本原型的說明,後邊我們基於此開發一個http請求處理的jdbc驅動,如果經常看一些
開源專案的話,應該會發現開源專案的額jdbc驅動開發的模式也是按照這個套路的,有些是封裝的底層協議,有些封裝的是http協議

參考資料

https://github.com/prestodb/presto/tree/master/presto-jdbc
https://github.com/h2database/h2database/blob/master/h2/src/main/org/h2/Driver.java