JDBC API 4.2(四):Connection 接口源码分析
在本文中,我们将讨论如何创建Connection以及如何使用Connection接口连接到特定数据库。
文章目录
- 1、简述
- 2、Connection 类图
- 3、Connection 接口常用方法
- 3.1、createStatement()
- 3.2、createStatement(int resultSetType, int resultSetConcurrency)
- 3.3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
- 3.4、void setAutoCommit(boolean autoCommit) throws SQLException
- 3.5、void commit() throws SQLException
- 3.6、void rollback() throws SQLException
- 3.7、void close() throws SQLException
- 4、Connection 接口示例
1、简述
Connection 是Java应用程序和特定数据库之间的会话。 用来执行SQL语句,并在连接的上下文中返回结果。
连接到数据库的 Connection 对象能够提供数据表的描述信息、当前连接数据库支持的SQL语法、存储过程等相关功能信息。这些信息的获取可以通过 getMetaData 方法获得。
与数据库的连接创建后,JDBC应用程序应使用适当的连接方法,例如setAutoCommit或setTransactionIsolation。 如果已经存在JDBC的方法可用,则应用程序不应直接调用SQL命令来更改连接的配置。 默认情况下,Connection 对象处于自动提交模式,这意味着它在执行每个语句后将自动提交更改。 如果已禁用自动提交模式,则必须显式调用方法提交才能提交更改;否则,将不会保存对数据库更改。
使用JDBC 2.1核心API创建的Connection对象具有与其初始关联的空类型映射。 用户可以在此类型映射中为UDT输入自定义映射。 使用ResultSet.getObject方法从数据源检索UDT时,getObject方法将检查连接的类型映射以查看是否存在该UDT的条目。 如果是这样,则getObject方法将把UDT映射到所指示的类。 如果没有条目,则将使用标准映射来映射UDT。
用户可以创建一个新的类型映射,它是一个java.util.Map对象,将其传递给可执行自定义映射的java.sql方法。 在这种情况下,该方法将使用给定的类型映射,而不是与连接关联的映射。
例如,以下代码片段指定将SQL类型ATHLETES映射为Java编程语言中的Athletes类。
java.util.Map map = con.getTypeMap();
map.put("mySchemaName.ATHLETES", Class.forName("Athletes"));
con.setTypeMap(map);
2、Connection 类图
下面的类图显示了Connection 接口提供的API的列表。
3、Connection 接口常用方法
3.1、createStatement()
创建一个Statement对象,用于将SQL语句发送到数据库。 不带参数的SQL语句通常使用Statement对象执行。 如果多次执行同一条SQL语句,则使用PreparedStatement对象可能会更合适。
默认情况下,使用返回的Statement对象创建的结果集的类型为TYPE_FORWARD_ONLY,并发级别为CONCUR_READ_ONLY。 可以通过调用getHoldability()确定创建的结果集的可保存性。
3.2、createStatement(int resultSetType, int resultSetConcurrency)
创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 此方法与上面的createStatement方法相同,但是它允许覆盖默认结果集类型和并发性。 可以通过调用getHoldability()确定创建的结果集的可保存性。
resultSetType: 结果集类型; ResultSet.TYPE_FORWARD_ONLY,ResultSet.TYPE_SCROLL_INSENSITIVE或ResultSet.TYPE_SCROLL_SENSITIVE中的一种
resultSetConcurrency: 并发类型; ResultSet.CONCUR_READ_ONLY或ResultSet.CONCUR_UPDATABLE之一
3.3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
创建一个Statement对象,该对象将生成具有指定类型,并发性和可保存性的ResultSet对象。 此方法与上面的createStatement方法相同,但是它允许覆盖默认结果集类型,并发性和可保存性。
resultSetType: 结果集类型, ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE 中的一种。
resultSetConcurrency: 并发类型 ,ResultSet.CONCUR_READ_ONLY、ResultSet.CONCUR_UPDATABLE 中的一种。
resultSetHoldability: 可保存性类型, ResultSet.HOLD_CURSORS_OVER_COMMIT 、ResultSet.CLOSE_CURSORS_AT_COMMIT 中的一种。
3.4、void setAutoCommit(boolean autoCommit) throws SQLException
将此连接的自动提交模式设置为给定状态。 如果连接处于自动提交模式,则其所有SQL语句将作为单个事务执行并提交。 否则,将其SQL语句分组为事务,这些事务通过调用方法提交或方法回滚而终止。 默认情况下,新连接处于自动提交模式。
autoCommit: true-开启自动提交模式;false-关闭自动提交模式。
语句完成时,将进行提交。 语句完成的时间取决于SQL语句的类型:
- 对于插入,更新或删除之类的DML语句以及DDL语句,该语句在完成执行后即完成。
- 对于Select语句,当关联的结果集关闭时,该语句完成。
- 对于CallableStatement对象或返回多个结果的语句,当所有关联的结果集都已关闭且所有更新计数和输出参数均已获取时,该语句将完成。
注意:如果在事务期间调用此方法,更改了自动提交模式,则会立即提交事务。如果调用setAutoCommit 方法且自动提交模式未更改,则该调用为无效操作。
3.5、void commit() throws SQLException
使自上一次提交/回退(commit/rollback)以来进行的所有更改永久生效,并释放此Connection对象当前持有的所有数据库锁。 仅当禁用自动提交模式时,才使用此方法。
3.6、void rollback() throws SQLException
撤消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁。 仅当禁用自动提交模式时,才使用此方法。
3.7、void close() throws SQLException
立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。在已经关闭的Connection对象上调用close方法是无效的。
强烈建议应用程序在调用close方法之前显式提交或回滚活动事务。
4、Connection 接口示例
private static final String createTableSQL = "create table Users(\r\n" + " id int(3) primary key,\r\n" +
" name varchar(20),\r\n" + " email varchar(20),\r\n" + " country varchar(20),\r\n" +
" password varchar(20)\r\n" + " );";
public static void main(String[] argv) throws SQLException {
createTable();
}
public static void createTable() throws SQLException {
System.out.println(createTableSQL);
// Step 1: 创建 Connection
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
"root", "root");
// Step 2:使用 connection 创建 statement 对象
Statement statement = conn.createStatement();) {
// Step 3: 执行SQL语句
statement.execute(createTableSQL);
} catch (SQLException e) {
}
// Step 4: 使用 try-with-resource 将自动关闭 conn.
}
参考资料:
https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html