经过驱动管理器DriverManager的getConnection方法,能够建立到指定URL的链接
Connection conn = DriverManager.getConnection(url, user, password);
看得出来,
在JDBC中链接被抽象为Connection
表示:与特定数据库的链接(会话)
在链接上下文中执行 SQL 语句并返回结果
方法梗概
对于应用程序开发者来讲,链接Connection主要用于执行对象的获取从而进一步执行SQL,这是
应用程序与数据库交互的主要途径
而后提供了数据库事务相关信息的设置以及其余信息的设置与获取
执行对象
用于将 SQL 语句发送到数据库中
对象有三种
Statement
* 做用:用于执行不带参数的简单 SQL 语句
* 特色:
每次执行 SQL 语句,数据库都要执行 SQL 语句的编译,仅执行一次查询并返回结果的情形建议使用这个,此时效率高于 PreparedStatement
PreparedStatement
* 做用:用于执行带 或 不带参数的预编译 SQL 语句
* 特色:是
预编译的, 在执行可变参数的一条 SQL 语句时,比 Statement 的效率高,安全性好,有效防止 SQL 注入等问题,对于屡次重复执行的语句,效率会更高
CallableStatement
* 做用:用于执行对数据库
存储过程 的调用
事务
Connection提供了对于事务相关操做的支持
事务有自动提交的特性能够设置,自动提交默认每条SQL将会单独一个事务,Connection提供了自动提交属性的查询方法
若是不是自动提交,那么将会延续到手动COMMIT或者ROLLBACK
还可以设置和获取事务的隔离性
另外还能够灵活的设置保存点,从而让一个事务分割成几部分,能够部分提交
链接属性
链接自己有一些属性信息,好比目录等
其中最重要的就是Connection的关闭,数据库的链接是有限的,Connection在使用完毕后须要进行关闭
另外还提供了链接状态的测试方法
小结
Connection最为基础的方法就是执行对象的建立以及事务相关以及链接属性相关的
其余方法属于对于数据库自己能力的API支持。
重点方法简介
执行对象
静态执行对象建立createStatement
Statement createStatement()
建立一个 Statement 对象来将 SQL 语句发送到数据库。
Statement createStatement(int resultSetType, int resultSetConcurrency)
建立一个 Statement 对象,该对象将生成具备给定类型和并发性的 ResultSet 对象。
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
建立一个 Statement 对象,该对象将生成具备给定类型、并发性和可保存性的 ResultSet 对象。
createStatement的核心是为了建立Statement,不带参数的 SQL 语句一般使用 Statement 对象执行;
若是屡次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。
三个版本的createStatement核心是同样的,
区别在于参数的设置,参数的设置是针对于结果集的
空参数的createStatement返回的Statement 对象,建立的结果集在默认状况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别
已建立结果集的可保存性可调用
getHoldability() 肯定
resultSetType - 如下 ResultSet 常量之一:
ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 如下 ResultSet 常量之一:
ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
resultSetHoldability - 如下 ResultSet 常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT
简言之,createStatement系列用于建立Statement--一般用来执行不带参数的SQL,而且附带的能够设置结果集的类型、并发性、可保存性
动态执行对象建立prepareStatement
PreparedStatement prepareStatement(String sql)
建立一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
建立一个默认 PreparedStatement 对象,该对象能获取自动生成的键。
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
建立一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
PreparedStatement prepareStatement(String sql, String[] columnNames)
建立一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
建立一个 PreparedStatement 对象,该对象将生成具备给定类型和并发性的 ResultSet 对象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
建立一个 PreparedStatement 对象,该对象将生成具备给定类型、并发性和可保存性的 ResultSet 对象。
prepareStatement系列方法建立一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
1. prepareStatement(String sql) 最为基础的建立方法
带有 IN 参数或不带有 IN 参数的 SQL 语句均可以被预编译并存储在 PreparedStatement 对象中。而后
能够有效地使用此对象来屡次执行该语句。
结果集属性在默认状况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。
已建立结果集的可保存性可调用
getHoldability() 肯定。
2. 返回键值数据
prepareStatement(String sql, int autoGeneratedKeys)
建立一个默认 PreparedStatement 对象,
该对象能获取自动生成的键
autoGeneratedKeys - 指示是否应该返回自动生成的键的标志,它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一
经过设置Statement.RETURN_GENERATED_KEYS要求返回主键
经过getGeneratedKeys方法,获取结果集,进而能够获取主键
此处插入一条记录,因此主键返回必然只有一个,当试图获取不存在的下标时,将会抛出异常,以下面所示,读取rs.getInt(2);时就报错了
另外还可使用int数组指定列下标,或者String数组指定列名,指明用于返回的键
prepareStatement(String sql, int[] columnIndexes)
prepareStatement(String sql, String[] columnNames)
注意:
这几个方法并非说全部的数据库都支持都同样,好比对于MYSQL来讲,都是一回事
经过测试代码咱们也能够看得出来,随便设置的数组,也都无所谓,由于mysql压根就没关注数组的内容(上面的代码为mysql的实现)
相似createStatement 也有能够设置结果集类型、并发性、可保存性的方法
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
resultSetType - 如下 ResultSet 常量之一:
ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 如下 ResultSet 常量之一:
ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
resultSetHoldability - 如下 ResultSet 常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT
默认状况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。
已建立结果集的可保存性可调用
getHoldability() 肯定。
这一点仍是那样子,若是没设置的,存在默认值
存储过程执行对象建立CallableStatement
CallableStatement prepareCall(String sql)
建立一个 CallableStatement 对象来调用数据库存储过程。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
建立一个 CallableStatement 对象,该对象将生成具备给定类型和并发性的 ResultSet 对象。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
建立一个 CallableStatement 对象,该对象将生成具备给定类型和并发性的 ResultSet 对象。
核心为建立存储过程的执行对象,另外与createStatement和prepareStatement方法相似,能够设置结果集的类型、并发性、可保存性。
事务
支持事务的数据库通常都有自动提交,提交、回滚、保存点、事务隔离级别这几个基本属性。
Connection中提供了对他们的支持。
boolean getAutoCommit()
获取此 Connection 对象的当前自动提交模式。
void commit()
使全部上一次提交/回滚后进行的更改为为持久更改,并释放此 Connection 对象当前持有的全部数据库锁。
void rollback()
取消在当前事务中进行的全部更改,并释放此 Connection 对象当前持有的全部数据库锁。
void rollback(Savepoint savepoint)
取消全部设置给定 Savepoint 对象以后进行的更改。
void setAutoCommit(boolean autoCommit)
将此链接的自动提交模式设置为给定状态。
void setTransactionIsolation(int level)
试图将此 Connection 对象的事务隔离级别更改成给定的级别。
int getTransactionIsolation()
获取此 Connection 对象的当前事务隔离级别。
Savepoint setSavepoint()
在当前事务中建立一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。
Savepoint setSavepoint(String name)
在当前事务中建立一个具备给定名称的保存点,并返回表示它的新 Savepoint 对象。
void releaseSavepoint(Savepoint savepoint)
从当前事务中移除指定的 Savepoint 和后续 Savepoint 对象。
链接自身属性状态
Connection最重要的一个状态就是打开与关闭,经过getConnection方法若是链接成功,那么该链接被打开
在使用结束以后你须要手动进行关闭
void close()
当即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
JDBC还提供了查询方法用于检测该链接是否已经被关闭。
boolean isClosed()
查询此 Connection 对象是否已经被关闭。
另外还有检测链接是否有效的方法
boolean isValid(int timeout)
若是链接还没有关闭而且仍然有效,则返回 true。
总结
Connection主要用于建立SQL的执行对象,而链接经过驱动管理器DriverManager的getConnection方法进行获取。
Connection并非全部的方法都如API描述的如出一辙,要看具体的驱动程序的支持状况
好比前面提到的MYSQL对于prepareStatement(String sql, String[] columnNames)和prepareStatement(String sql, int[] columnIndexes)的状况
经过链接对执行对象的建立,决定了不少事情
好比执行语句的特质,是用来执行静态SQL仍是预编译带参数的动态的SQL仍是存储过程?
也能够对结果集的参数进行设置
事务的相关处理也是在链接中操做的。
经过链接还可以得到数据库的元数据信息
咱们全部的查询都是在一个数据库链接中进行的,因此这次操做所须要的东西,好比sql设置、结果集属性设置再或者数据库相关的元数据信息等均可以经过Connection得到。