開發自己的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM