。
ServiceLoader
@Since:1.6
Comment:一个简单的服务提供商加载工具。
package:java.util
// 资源文件目录前缀
private static final String PREFIX = "META-INF/services/";
// 表示被加载服务的类或接口
private final Class<S> service;
// 用于定位、加载和实例化提供程序的类装入器
private final ClassLoader loader;
// 创建ServiceLoader时获取的访问控制上下文
private final AccessControlContext acc;
// 缓存的提供程序,按实例化顺序
private LinkedHashMap<String,S> providers = new LinkedHashMap<>();
// 当前惰性查找迭代器
private LazyIterator lookupIterator;
Method | Comment |
---|---|
void reload() | 清除此加载程序的提供程序缓存,以便所有提供程序都将重新加载。 |
Iterator<S> iterator() | 懒洋洋地加载这个装载机服务的可用提供商 |
static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader) | 为给定的服务类型和类加载器创建一个新的服务加载器。 |
static <S> ServiceLoader<S> load(Class<S> service) | 使用当前线程的classloader为给定的服务类型创建一个新的服务加载器。 |
static <S> ServiceLoader<S> loadInstalled(Class<S> service) | 使用扩展类加载器为给定的服务类型创建一个新的服务加载器。 |
java.sql包中,除Driver相关类,其余类基本都是接口或抽象类。具体实现由各服务商提供
DriverManager
Comment:用于管理一组JDBC驱动程序的基本服务。
// 存放依赖包中找到的driver信息。DriverInfo其中记录了Driver和DriverAction
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
// 设置后可打印连接过程中的一下信息
private static volatile java.io.PrintWriter logWriter = null;
// 还有loginTimeout、logStream、logSync三个字段,感觉没啥用
Method | Comment |
---|---|
static java.io.PrintWriter getLogWriter() | 检索日志记录器。 |
static void setLogWriter(java.io.PrintWriter out) | 设置 DriverManager 和所有驱动程序使用的记录/跟踪 PrintWriter 对象。 |
static Connection getConnection(String url, java.util.Properties info) | 尝试建立与给定数据库URL的连接。 |
static Connection getConnection(String url, String user, String password) | 尝试建立与给定数据库URL的连接。 |
static Connection getConnection(String url) | 尝试建立与给定数据库URL的连接。 |
static Driver getDriver(String url) | 尝试查找了解给定URL的驱动程序。 |
static synchronized void registerDriver(java.sql.Driver driver) | 注册与给定的驱动程序 DriverManager 。 |
static synchronized void registerDriver(java.sql.Driver driver, DriverAction da) | 注册与给定的驱动程序 DriverManager 。 |
static synchronized void deregisterDriver(Driver driver) | 从 DriverManager 的注册驱动程序列表中删除指定的驱动程序。 |
static java.util.Enumeration getDrivers() | 使用当前调用者可以访问的所有当前加载的JDBC驱动程序检索枚举。 |
static void setLoginTimeout(int seconds) | 设置驱动程序在识别驱动程序后尝试连接到数据库时等待的最长时间(秒)。 |
static int getLoginTimeout() | 获取尝试登录数据库时驱动程序可以等待的最长时间(秒)。 |
static void println(String message) | 打印到当前JDBC日志流的消息。 |
// 静态代码块中调用,查找并注册Driver
private static void loadInitialDrivers()
Driver
Comment:每个驱动程序类必须实现的接口。
Method | Comment |
---|---|
Connection connect(String url, java.util.Properties info) | 尝试使数据库连接到给定的URL。 |
boolean acceptsURL(String url) | 检索驱动程序是否认为可以打开与给定URL的连接 |
DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info) | 获取有关此驱动程序可能属性的信息。 |
int getMajorVersion() | 检索司机的主要版本号。 |
int getMinorVersion() | 获取驱动程序的次要版本号。 |
boolean jdbcCompliant() | 报告这个驱动程序是否是一个真正的JDBC兼容驱动程序。 |
Logger getParentLogger() | 返回此驱动程序使用的所有日志记录器的父记录器。 |
测试代码:
DriverManager.setLogWriter(new PrintWriter(System.out));
String url = "jdbc:mysql://127.0.0.1:3306/?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai";
Connection connection = DriverManager.getConnection(url,
"root",
"123456");
Driver driver = DriverManager.getDriver(url);
System.out.println(driver.getMajorVersion());
System.out.println(driver.getMinorVersion());
System.out.println(driver.jdbcCompliant());
System.out.println(driver.acceptsURL(url));
DriverPropertyInfo[] propertyInfo = driver.getPropertyInfo(url, new Properties() {
{
put("name", "root");
put("password", "123456");
}});
for (DriverPropertyInfo info : propertyInfo) {
System.out.println("name: " + info.name);
System.out.println("value: " + info.value);
System.out.println("description: " + info.description);
System.out.println("required: " + info.required);
System.out.println("choices: " + Arrays.toString(info.choices));
}
输出结果:
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai")
trying com.mysql.cj.jdbc.Driver
getConnection returning com.mysql.cj.jdbc.Driver
DriverManager.getDriver("jdbc:mysql://127.0.0.1:3306/?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai")
getDriver returning com.mysql.cj.jdbc.Driver
8
0
false
true
name: host
value: 127.0.0.1
description: Hostname of MySQL Server
required: true
choices: null
name: port
value: 3306
description: Port number of MySQL Server
required: false
choices: null
name: dbname
value:
description: Database name;
required: false
choices: null
name: user
value:
description: Username to authenticate as
required: true
choices: null
......
DriverPropertyInfo
Comment:用于进行连接的驱动程序属性。通过Driver.getPropertyInfo(String url, java.util.Properties info)
// 属性的名称。
public String name;
// 属性的简短描述,可能为空。
public String description = null;
// 连接Driver期间是否必须为该属性提供值。
public boolean required = false;
// 根据提供给getPropertyInfo方法的信息、Java环境和驱动程序提供的默认值的组合指定属性的当前值。如果没有值,该字段可能为空。
public String value = null;
// 如果value字段可选,那么是value字段可选值的数组;否则null。
public String[] choices = null;
DriverAction
@Since:1.8
Comment:当Driver
想通过DriverManager
通知时必须实现的。JDBC驱动程序的静态初始化块必须调用DriverManager.registerDriver(java.sql.Driver, java.sql.DriverAction)以通知DriverManager
当JDBC驱动程序被注销时要调用哪个DriverAction
实现。
// DriverManager.deregisterDriver(Driver)方法调用, 通知JDBC驱动程序它已被注销。
void deregister();
Connection
Comment:与特定数据库的连接(会话)。 执行SQL语句并在连接的上下文中返回结果。
// 不支持事务的常量。
int TRANSACTION_NONE = 0;
// 可能会发生脏读,不可重复读和幻读。
int TRANSACTION_READ_UNCOMMITTED = 1;
// 防止脏读; 可能会发生不可重复的读取和幻像读取。
int TRANSACTION_READ_COMMITTED = 2;
// 防止了脏读和不可重复读; 可以发生幻影读取。
int TRANSACTION_REPEATABLE_READ = 4;
// 防止脏读,不可重复读和幻影读。
int TRANSACTION_SERIALIZABLE = 8;
Method | Comment |
---|---|
Statement createStatement() | 创建一个 Statement 对象,用于将SQL语句发送到数据库。 |
PreparedStatement prepareStatement(String sql) | 创建一个 PreparedStatement 对象,用于将参数化的SQL语句发送到数据库。 |
CallableStatement prepareCall(String sql) | 创建一个调用数据库存储过程的 CallableStatement 对象。 |
String nativeSQL(String sql) | 将给定的SQL语句转换为系统的本机SQL语法。 |
void setAutoCommit(boolean autoCommit) | 将此连接的自动提交模式设置为给定状态。 |
boolean getAutoCommit() | 检索此 Connection 对象的当前自动提交模式。 |
void commit() | 使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection 对象当前持有的任何数据库锁。 |
void rollback() | 撤消在当前事务中所做的所有更改,并释放此 Connection 对象当前持有的任何数据库锁。 |
void close() | 释放此 Connection 对象的数据库和JDBC资源 |
boolean isClosed() | 检索此 Connection 对象是否已关闭。 |
DatabaseMetaData getMetaData() | 返回此 Connection 对象包含有关这个数据库的元数据 |
void setReadOnly(boolean readOnly) | 设置此连接的只读模式,作为驱动程序的提示以启用数据库优化。 |
boolean isReadOnly() | 检索此 Connection 对象是否处于只读模式。 |
void setCatalog(String catalog) | 设置给定的目录名称,以便选择要在其中工作的 Connection 对象的数据库的子空间。 |
String getCatalog() | 检索此 Connection 对象的当前目录名称。 |
void setTransactionIsolation(int level) | 尝试将此 Connection 对象的事务隔离级别更改为给定的对象。 |
int getTransactionIsolation() | 获取此 Connection 对象的当前事务隔离级别。 |
SQLWarning getWarnings() | 检索通过此 Connection 对象的呼叫报告的第一个警告。 |
void clearWarnings() | 清除为此 Connection 对象报告的所有警告。 |
-------------JDBC 2.0------------- | -------------JDBC 2.0------------- |
Statement createStatement(int resultSetType, int resultSetConcurrency) | 创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 |
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) | 创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象 |
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) | 创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 |
java.util.Map<String,Class<?>> getTypeMap() | 检索与此Connection 相关联的Map 对象。除非应用程序添加了一个条目,否则返回的类型映射将是空的。 |
void setTypeMap(java.util.Map<String,Class<?>> map) | 将给定的 TypeMap 对象作为此 Connection 对象的类型映射。 类型映射将用于SQL结构化类型和不同类型的自定义映射。 |
-------------JDBC 3.0------------- | -------------JDBC 3.0------------- |
void setHoldability(int holdability) | 将使用此 Connection 对象创建的 ResultSet 对象的默认保持性更改为给定的可保存性。 |
int getHoldability() | 检索使用此 Connection 对象创建的 ResultSet 对象的当前保持性。 |
Savepoint setSavepoint() | 在当前事务中创建一个未命名的保存点,并返回代表它的新的 Savepoint 对象。 |
Savepoint setSavepoint(String name) | 在当前事务中创建具有给定名称的保存点,并返回代表它的新的 Savepoint 对象。 |
void rollback(Savepoint savepoint) | 撤消在给定的 Savepoint 对象设置后进行的所有更改。 |
void releaseSavepoint(Savepoint savepoint) | 删除指定的 Savepoint 和随后 Savepoint 从目前的交易对象。 |
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) | 创建一个 Statement 对象,将产生 ResultSet 对象具有给定类型,并发性和可保存性。 |
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) | 创建一个 PreparedStatement 对象,将产生 ResultSet 对象具有给定类型,并发性和可保存性。 |
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) | 创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 |
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) | 创建一个默认的 PreparedStatement 对象,该对象具有检索自动生成的密钥的能力。 |
PreparedStatement prepareStatement(String sql, int columnIndexes[]) | 创建一个默认的 PreparedStatement 对象,能够返回给定数组指定的自动生成的键。 |
PreparedStatement prepareStatement(String sql, String columnNames[]) | 创建一个默认的 PreparedStatement 对象,能够返回给定数组指定的自动生成的键。 |
Clob createClob() | 构造实现 Clob 接口的对象。 |
Blob createBlob() | 构造实现 Blob 接口的对象。 |
NClob createNClob() | 构造实现 NClob 接口的对象。 |
SQLXML createSQLXML() | 构造实现 SQLXML 接口的对象。 |
boolean isValid(int timeout) | 如果连接尚未关闭并且仍然有效,则返回true。 |
void setClientInfo(String name, String value) | 将由name指定的客户端信息属性的值设置为由值指定的值。 |
void setClientInfo(Properties properties) | 设置连接的客户端信息属性的值。 |
String getClientInfo(String name) | 返回由name指定的客户端信息属性的值。 |
Properties getClientInfo() | 返回包含驱动程序支持的每个客户端信息属性的名称和当前值的列表。 |
Array createArrayOf(String typeName, Object[] elements) | 用于创建Array对象的工厂方法。 |
Struct createStruct(String typeName, Object[] attributes) | 用于创建Struct对象的工厂方法。 |
-------------JDBC 4.1------------- | -------------JDBC 4.1------------- |
void setSchema(String schema) | 设置要访问的给定模式名称。 |
String getSchema() | 检索此 Connection 对象的当前模式名称。 |
void abort(Executor executor) | 终止打开的连接。 |
void setNetworkTimeout(Executor executor, int milliseconds) | 设置 Connection 或由Connection 创建的对象等待数据库应答任何一个请求的最大时间。 |
int getNetworkTimeout() | 检索驱动程序等待数据库请求完成的毫秒数。 |
测试代码:
Connection connection = DriverManager.getConnection(url,
user,
psd);
System.out.println(connection.nativeSQL("select * from kefu_session where rownum <= 1"));
// 当前所处数据库目录
System.out.println("Catalog: " + connection.getCatalog());
// 隔离级别
System.out.println("TransactionIsolation: " + connection.getTransactionIsolation());
System.out.println("Warnings: " + connection.getWarnings());
// type map
connection.setTypeMap(ImmutableMap.of("String", String.class));
System.out.println("Type Map: ");
connection.getTypeMap().forEach((k,v) -> {
System.out.println("\tkey: " + k + ", value: " + v);
});
connection.setTypeMap(ImmutableMap.of());
// holdability
System.out.println("Holdability: " + connection.getHoldability());
// isValid
System.out.println("Valid: " + connection.isValid(100));
// getClientInfo
System.out.println("client info: ");
connection.getClientInfo().forEach((k,v) -> {
System.out.println("\tkey: " + k + ", value: " + v);
});
// getSchema,mysql not support?
System.out.println("Schema: " + connection.getSchema());
// getNetworkTimeout
System.out.println("NetworkTimeout: " + connection.getNetworkTimeout());
测试结果:
select * from kefu_session where rownum <= 1
Catalog: test
TransactionIsolation: 2
Warnings: null
Type Map:
key: String, value: class java.lang.String
Holdability: 2
Valid: true
client info:
Schema: null
NetworkTimeout: 0
SQLWarning
Comment:提供有关数据库访问警告的信息的异常。 警告被静默链接到方法导致其报告的对象。
Method | Comment |
---|---|
SQLWarning getNextWarning() | 检索 SQLWarning 对象由 setNextWarning 链接的警告。 |
void setNextWarning(SQLWarning w) | 将 SQLWarning 对象添加到链的末尾。 |
DataTruncation
Comment:当一个数据值因长度超出MaxFieldSize
的原因而意外截断时,作为DataTruncation
异常抛出(写入时)或作为DataTruncation
警告(读取时)报告的异常。
DataTruncation
在读取期间的SQLstate为01004
。
DataTruncation
在写期间的SQLstate为22001
。
Method | Comment |
---|---|
int getIndex() | 检索被截断的列或参数的索引。 |
boolean getParameter() | 指示truncated的值是参数值还是列值。 |
boolean getRead() | 指示值是否在读取时被截断。 |
int getDataSize() | 获取应该传输的数据的字节数。 |
int getTransferSize() | 获取实际传输的数据的字节数。 |
Savepoint
@Since:1.4
Comment:保存点的表示,保存点是当前事务中的一个点,可以从Connection.rollback
方法引用。当事务回滚到保存点时,在该保存点之后所做的所有更改都将撤消。保存点可以是命名的也可以是未命名的。未命名的保存点由基础数据源生成的ID标识。
测试代码:
boolean autoCommit = connection.getAutoCommit();
connection.setAutoCommit(false);
Savepoint savepoint = connection.setSavepoint("SavepointTest");
// mysql不支持查询savepointId,直接抛出异常。com.mysql.cj.jdbc.MysqlSavepoint
// System.out.println("SavepointId: " + savepoint.getSavepointId());
System.out.println("SavepointName: " + savepoint.getSavepointName());
connection.setAutoCommit(autoCommit);
测试结果:
SavepointName: SavepointTest
DatabaseMetaData
Comment:关于整个数据库的综合信息。
Method | Comment |
---|---|
boolean allProceduresAreCallable() | 检索当前用户是否可以调用getProcedures 方法返回的所有过程 |
boolean allTablesAreSelectable() | 检索当前用户是否可以使用方法 getTables 在 SELECT 语句中返回的所有表。 |
String getURL() | 检索此DBMS的URL。 |
String getUserName() | 检索此数据库已知的用户名。 |
boolean isReadOnly() | 检索该数据库是否处于只读模式。 |
boolean nullsAreSortedHigh() | 检索 NULL 值是否高排序。 |
boolean nullsAreSortedLow() | 检索 NULL 值是否排序低 |
boolean nullsAreSortedAtStart() | 检索是否在开始排序 NULL 值,无论排序顺序如何。 |
boolean nullsAreSortedAtEnd() | 检索最终是否排序 NULL 值,无论排序顺序如何。 |
String getDatabaseProductName() | 检索此数据库产品的名称。 |
String getDatabaseProductVersion() | 检索此数据库产品的版本号。 |
String getDriverName() | 检索此JDBC驱动程序的名称。 |
String getDriverVersion() | 获取此JDBC驱动程序的版本号 |
int getDriverMajorVersion() | 检索此JDBC驱动程序的主要版本号。 |
int getDriverMinorVersion() | 检索此JDBC驱动程序的次要版本号。 |
boolean usesLocalFiles() | 检索此数据库是否将表存储在本地文件中。 |
boolean usesLocalFilePerTable() | 检索此数据库是否为每个表使用一个文件。 |
boolean supportsMixedCaseIdentifiers() | 检索此数据库是否将混合大小写不引用的SQL标识符视为区分大小写,并将结果存储在混合大小写中 |
boolean storesUpperCaseIdentifiers() | 检索此数据库是否将混合大小写无引号SQL标识符视为不区分大小写,并将其存储为大写。 |
boolean storesLowerCaseIdentifiers() | 检索此数据库是否将混合大小写无引号SQL标识符视为不区分大小写,并将其存储为小写。 |
boolean storesMixedCaseIdentifiers() | 检索此数据库是否将混合大小写无引号SQL标识符视为不区分大小写,并以混合大小写存储。 |
boolean supportsMixedCaseQuotedIdentifiers() | 检索此数据库是否将混合大小写的SQL标识符视为区分大小写,并将结果存储在混合大小写中。 |
boolean storesUpperCaseQuotedIdentifiers() | 检索此数据库是否将混合大小写引用的SQL标识符视为不区分大小写,并以大写形式存储。 |
boolean storesLowerCaseQuotedIdentifiers() | 检索此数据库是否将混合大小写的SQL标识符视为不区分大小写,并以小写形式存储。 |
boolean storesMixedCaseQuotedIdentifiers() | 检索此数据库是否将混合大小写的SQL标识符视为不区分大小写,并以混合大小写存储。 |
String getIdentifierQuoteString() | 检索用于引用SQL标识符的字符串。 |
String getSQLKeywords() | 检索所有这些数据库的SQL关键字的逗号分隔列表,这些关键字也不是SQL:2003关键字。 |
String getNumericFunctions() | 检索此数据库可用的逗号分隔的数学函数列表。 |
String getStringFunctions() | 检索此数据库可用的逗号分隔的字符串函数列表。 |
String getSystemFunctions() | 检索此数据库可用的系统函数的逗号分隔列表。 |
String getTimeDateFunctions() | 检索此数据库可用的时间和日期函数的逗号分隔列表。 |
String getSearchStringEscape() | 检索可以用来转义通配符的字符串。 |
String getExtraNameCharacters() | 检索可用于未引号的标识符名称(超出az,AZ,0-9和_)的所有“额外”字符。 |
------------------描述支持哪些特性的函数。--------------------------- | |
boolean supportsAlterTableWithAddColumn() | 检索此数据库是否支持带有添加列的 ALTER TABLE 。 |
boolean supportsAlterTableWithDropColumn() | 检索此数据库是否支持具有删除列的 ALTER TABLE 。 |
boolean supportsColumnAliasing() | 检索此数据库是否支持列别名。 |
boolean nullPlusNonNullIsNull() | 获取此数据库是否支持进行拼接 NULL 和非 NULL 值是 NULL 。 |
boolean supportsConvert() | 检索此数据库是否支持JDBC标量函数 CONVERT ,以便将一种JDBC类型转换为另一种JDBC类型。 |
boolean supportsConvert(int fromType, int toType) | 获取此数据库是否支持JDBC标量函数 CONVERT 的JDBC类型 fromType和 toType之间的转换。 |
boolean supportsTableCorrelationNames() | 检索此数据库是否支持表相关名称。 |
boolean supportsDifferentTableCorrelationNames() | 检索是否支持表相关名称,它们被限制为与表的名称不同。 |
boolean supportsExpressionsInOrderBy() | 检索此数据库是否支持 ORDER BY 列表中的 ORDER BY 。 |
boolean supportsOrderByUnrelated() | 检索此数据库是否支持使用不在 ORDER BY 子句中的 SELECT 语句中的 ORDER BY 。 |
boolean supportsGroupBy() | 检索此数据库是否支持某种形式的 GROUP B |