13.3 JDBC的典型用法 13.3.1 JDBC4.2常用接口和类简介
13.3 JDBC的典型用法
13.3.1 JDBC4.2常用接口和类简介
Java 8
支持JDBC4.2
标准,JDBC4.2
在原有JDBC
标准上增加了一些新特性。下面介绍这些JDBC API
时会提到Java 8
新增的功能.
DriverManager
DriverManager
:用于管理JDBC
驱动的服务类。程序中使用该类的主要功能是获取Connection
对象,该类包含如下方法。
public static synchronized Connection getConnection(String url, String user, String pass) throws SQLException
:该方法可以获得url
对应数据库的连接。
Connection
Connection
:代表数据库连接对象,每个Connection
代表一个物理连接会话。要想访问数据库必须先获得数据库连接。该接口的常用方法如下。
1.获取Statement对象的方法
方法 | 描述 |
---|---|
Statement createStatement() throws SQLExcetpion |
该方法返回一个Statement 对象。 |
PreparedStatement prepareStatement(String sql) throws SQLExcetpion |
该方法返回预编译的Statement 对象,即将SQL 语句提交到数据库进行预编译。 |
CallableStatement prepareCall(String sql) throws SQLExcetpion |
该方法返回CallableStatement 对象,该对象用于调用存储过程。 |
上面三个方法都返回用于执行SQL
语句的Statement
对象, PreparedStatement
、 CallableStatement
是Statement
的子类,只有获得了Statement
之后才可执行SQL
语句。
除此之外, Connection
还有如下几个用于控制事务的方法。
2.控制事务的方法
方法 | 描述 |
---|---|
Savepoint setSavepoint() |
创建一个保存点。 |
Savepoint setSavepoint(String name) |
以指定名字来创建一个保存点 |
void setTransactionIsolation(int level) |
设置事务的隔离级别。 |
void rollback() |
回滚事务。 |
void rollback(Savepoint savepoint) |
将事务回滚到指定的保存点。 |
void setAutoCommit(boolean autoCommit) |
关闭自动提交,打开事务。 |
void commit() |
提交事务。 |
3.Java 7中Connection新增方法
Java 7
为Connection
新增了setSchema(String schema)
、 getSchema()
两个方法,这两个方法用于控制该Connection
访问的数据库Schema
Java 7
还为Connection
新增了setNetworkTimeou(Executor executor,int milliseconds)
、 getNetworkTimeout()
两个方法来控制数据库连接的超时行为。
Statement
Statement
:用于执行SQL
语句的工具接口。该对象既可用于执行DDL
、DCL
语句,也可用于执行DML
语句,还可用于执行SQL
查询。当执行SQL
査询时,返回查询到的结果集。它的常用方法如下。
方法 | 描述 |
---|---|
ResultSet executeQuery(String sql) throws SQLException |
该方法用于执行查询语句,并返回查询结果对应的 ResultSet 对象。该方法只能用于执行查询语句. |
int executeUpdate(String sql) ) throws SQLExcetion |
该方法用于执行DML 语句,并返回受影响的行数;该方法也可用于执行DDL 语句,执行DDL 语句将返回0。 |
boolean execute(String sql) ) throws SQLException |
该方法可执行任何SQL 语句。如果执行后第一个结果为 ResultSet 对象,则返回true ;如果执行后第一个结果为受影响的行数或没有任何结果,则返回 false |
Java 7新增方法
Java 7
为Statement
新增了closeOnCompletion()
方法,如果Statement
执行了该方法,则当所有依赖于该Statement
的ResultSet
关闭时,该Statement
会自动关闭。Java7
还为Statement
提供了一个isCloseOnCompletion()
方法,该方法用于判断该Statement
是否打开了” closeOn Completion
“功能。
Java 8新增方法
Java 8
为Statement
新增了多个重载的executeLargeUpdate()
方法,这些方法相当于增强版的executeUpdate()
方法,返回值类型为long
——也就是说,当DML
语句影响的记录条数超过Integer.MAX_VALUE
时,就应该使用executeLargeUpdate()
方法.
PreparedStatement
PreparedStatement
:预编译的Statement
对象。 PreparedStatement
是Statement
的子接口,它允许数据库预编译SQL
语句(这些SQL
语句通常带有参数),以后每次只改变SQL
命令的参数,避免数据库每次都需要编译SQL
语句,因此性能更好。相对于Statement
而言,使用PreparedStatement
执行SQL
语句时,无须再传入SQL
语句,只要为预编译的SQL
语句传入参数值即可。所以它比Statement
多了如下方法:
void setXxx(int parameterIndex,Xxx value)
:该方法根据传入参数值的类型不同,需要使用不同的方法。传入的值根据索引传给SQL
语句中指定位置的参数。
注意PreparedStatement
同样有executeUpdate()
、 executeQuery()
和execute()
三个方法,只是这三个方法无须接收SQL
字符串,因为PreparedStatement
对象已经预编译了SQL
命令,只要为这些命令传入参数即可。
Java 8
还为PreparedStatement
增加了不带参数的executeLargeUpdate()
方法—执行DML
语句影响的记录条数可能超过Integer.MAX_VALUE
时,就应该使用executeLargeUpdate()
方法。
ResultSet
ResultSet
:结果集对象。该对象包含访问查询结果的方法, ResultSet
可以通过列索引或列名获得列数据。它包含了如下常用方法来移动记录指针。
方法 | 描述 |
---|---|
void close() |
释放ResultSet 对象。 |
boolean absolute(int row) |
将结果集的记录指针移动到第row 行,如果row 是负数,则移动到倒数第row 行。如果移动后的记录指针指向一条有效记录,则该方法返回true |
void beforeFirst() |
将ResultSet 的记录指针定位到首行之前,这是ResultSet 结果集记录指针的初始状态(记录指针的起始位置位于第一行之前) |
boolean previous() |
将ResultSet 的记录指针定位到上一行。如果移动后的记录指针指向一条有效记录,则该方法返回true |
boolean next() |
将ResultSet 的记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则该方法返回true |
boolean last() |
将ResultSet 的记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则该方法返回true |
void afterLast() |
将ResultSet 的记录指针定位到最后一行之后 |
支持的Java版本
在JDK1.4
以前,采用默认方法创建的Statement
所查询得到的ResultSet
不支持absolute()
、 previous()
等移动记录指针的方法,它只支持next()
这个移动记录指针的方法,即ResultSet
的记录指针只能向下移动,而且每次只能移动一格。
从Java5.0
以后就避免了这个问题,程序采用默认方法创建的Statement
所查询得到的ResultSet
也支持absolute
、previous
等方法
当把记录指针移动到指定行之后, ResultSet
可通过getXxx(int columnIndex)
或getXx(Stringcolumn Label)
方法来获取当前行、指定列的值,前者根据列索引获取值,后者根据列名获取值。
Java 7
新增了<T> T getObject(int columnIndex, Class<T> type)
和<T> T getObject(String columnLabel,Class<T>type)
两个泛型方法,它们可以获取任意类型的值