java.sql.Driver接口规定了Driver应该具有以下功能,重要的有三个acceptsURL判断jdbcUrl是否支持、创建一个连接、获取属性信息,三个主要接口。
下边以 NonRegisteringDriver
类的源码简单分析以下。
acceptsURL
acceptsURL(String url) 方法用来测试对指定的url,该驱动能否打开这个url连接。driver对自己能够连接的url会制定自己的协议,只有符合自己的协议形式的url才认为自己能够打开这个url,如果能够打开,返回true,反之,返回false;
Mysql-JDBC支持的驱动协议有:
-
jdbc:mysql+srv:
-
jdbc:mysql+srv:loadbalance:
-
jdbc:mysql+srv:replication:
-
mysqlx+srv:
-
jdbc:mysql:
-
jdbc:mysql:loadbalance:
-
jdbc:mysql:replication:
-
mysqlx:
connect
这里会根据URL 创建一个连接。一般是ConnectionImpl类型,下一篇文章会细说一下。其他类型的连接就先不看了。
public java.sql.Connection connect(String url, Properties info) throws SQLException {try {// 如果url是不自持的连接协议,则返回nullif (!ConnectionUrl.acceptsUrl(url)) {return null;}ConnectionUrl conStr = ConnectionUrl.getConnectionUrlInstance(url, info);switch (conStr.getType()) {case SINGLE_CONNECTION:return com.mysql.cj.jdbc.ConnectionImpl.getInstance(conStr.getMainHost());case FAILOVER_CONNECTION:case FAILOVER_DNS_SRV_CONNECTION:return FailoverConnectionProxy.createProxyInstance(conStr);case LOADBALANCE_CONNECTION:case LOADBALANCE_DNS_SRV_CONNECTION:return LoadBalancedConnectionProxy.createProxyInstance(conStr);case REPLICATION_CONNECTION:case REPLICATION_DNS_SRV_CONNECTION:return ReplicationConnectionProxy.createProxyInstance(conStr);default:return null;}} catch (UnsupportedConnectionStringException e) {// when Connector/J can't handle this connection string the Driver must return nullreturn null;} catch (CJException ex) {throw ExceptionFactory.createException(UnableToConnectException.class,Messages.getString("NonRegisteringDriver.17", new Object[] { ex.toString() }), ex);}
}
SINGLE_CONNECTION 会创建一个 ConnectionImpl
public static JdbcConnection getInstance(HostInfo hostInfo) throws SQLException {return new ConnectionImpl(hostInfo);}
getPropertyInfo
获取这些属性信息 HOST、PORT、DBNAME、USER、PASSWORD
@Override
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {String host = "";String port = "";String database = "";String user = "";String password = "";if (!isNullOrEmpty(url)) {ConnectionUrl connStr = ConnectionUrl.getConnectionUrlInstance(url, info);if (connStr.getType() == Type.SINGLE_CONNECTION) {HostInfo hostInfo = connStr.getMainHost();info = hostInfo.exposeAsProperties();}}if (info != null) {host = info.getProperty(PropertyKey.HOST.getKeyName());port = info.getProperty(PropertyKey.PORT.getKeyName());database = info.getProperty(PropertyKey.DBNAME.getKeyName());user = info.getProperty(PropertyKey.USER.getKeyName());password = info.getProperty(PropertyKey.PASSWORD.getKeyName());}DriverPropertyInfo hostProp = new DriverPropertyInfo(PropertyKey.HOST.getKeyName(), host);hostProp.required = true;hostProp.description = Messages.getString("NonRegisteringDriver.3");DriverPropertyInfo portProp = new DriverPropertyInfo(PropertyKey.PORT.getKeyName(), port);portProp.required = false;portProp.description = Messages.getString("NonRegisteringDriver.7");DriverPropertyInfo dbProp = new DriverPropertyInfo(PropertyKey.DBNAME.getKeyName(), database);dbProp.required = false;dbProp.description = Messages.getString("NonRegisteringDriver.10");DriverPropertyInfo userProp = new DriverPropertyInfo(PropertyKey.USER.getKeyName(), user);userProp.required = true;userProp.description = Messages.getString("NonRegisteringDriver.13");DriverPropertyInfo passwordProp = new DriverPropertyInfo(PropertyKey.PASSWORD.getKeyName(), password);passwordProp.required = true;passwordProp.description = Messages.getString("NonRegisteringDriver.16");JdbcPropertySet propSet = new JdbcPropertySetImpl();propSet.initializeProperties(info);List<DriverPropertyInfo> driverPropInfo = propSet.exposeAsDriverPropertyInfo();DriverPropertyInfo[] dpi = new DriverPropertyInfo[5 + driverPropInfo.size()];dpi[0] = hostProp;dpi[1] = portProp;dpi[2] = dbProp;dpi[3] = userProp;dpi[4] = passwordProp;System.arraycopy(driverPropInfo.toArray(new DriverPropertyInfo[0]), 0, dpi, 5, driverPropInfo.size());return dpi;
}