一、JDBC 4.2常用接口和类的简介
Java支持JDBC 4.2标准,JDBC 4.2在原有JDBC标准上增加了一些新特性。
1.1 DriverMananger:用于管理JDBC驱动的服务类。
程序中使用该类的主要功能是获取Connection对象,该类包含如下方法:public static synchronized Connection getConnection(String url,String user,String pass) throws SQLWxception
:该方法获取对应数据库的连接。
1.2 Connection:代表数据库连接对象
每个Connection代表一个物理会话。想要访问数据库,必须先获得数据库连接。该接口的常用方法:
(1)Statement createStatement() throws SQLException:返回一个Statement对象。
(2)PreparedStatement prepareStatement(String sql) throws SQLException:该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。
(3)CallableStatement prepareCall(String sql) throws SQLException:该方法返回 CallableStatement对象
上面三个方法返回执行SQL语句的Statement对象,PrepareStatement、CallableStatement都是Statement的子类,只有获取了Statement之后才可以执行SQL语句。
Connection用于控制事务的方法:
(1)Savepoint setSavepoint():创建一个保存点。
(2)Savepoint setSavepoint(String name):以指定名字创建一个保存点。
(3)void setTransactionIsolation(int level):设置事务的隔离级别。
(4)void rollback():回滚事务。
(5)void rollback(Savepoint savepoint):将事务回滚到指定保存点。
(6)void setAutoCommit(boolean autoCommit):关闭自动提交,打开事务。
(7)void commit():提交事务。
Java 7为Connection新增了setSchema(String schema)、getSchema()两个方法,这两个方法用于控制该Connection访问的数据库Schema。
新增SetNetworkTimeout(Executor executor,int milliseconds)、getNetworkTimeout()用于控制数据库连接超时行为。
1.3 Statement:用于执行SQL语句的工具接口
该对象即可以执行DDL、DCL语句,也可以用于执行DML语句,还可以执行SQL查询。当执行SQL查询时,返回查询到的数据集。
常用方法
(1)ResultSet executeQuery(String sql) throws SQLException:该方法用于执行查询语句,并返回查询结果到对应的ResultSet对象中。只能执行查询语句。
(2)int executeUpdate(String sql ) throws SQLException:用于执行DML语句,并返回受影响的行数;该方法也可以用于执行DDL语句,执行DDL语句将返回0.
(3)boolean excute(String sql) throws SQLExceptin:该方法可执行任何SQL语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false。
Java 7为Statement新增了closeOnCompletion()方法,如果Statement执行了该方法,则所有依赖于该Statement的ResultSet关闭时,该Statement会自动关闭。
新增isCloseOnCompletion()方法,用于判断该Statement是否打开了"closeOnCompletion".
java 8新增多个重载的executeLargeUpdate()方法,该方法相当于增强版的excuteUpdate()方法,返回值为long。当DML语句影响的记录条数超过了Integer.MAX_VALUE时,就应该使用executeLargeUpdate()。
1.4 PrepareStatement:预编译的Statement对象
PrepareStatement是Statement子接口,它允许数据库预编译SQL语句(这些SQL语句通常带有参数),以后每次只改变SQL命令参数,避免每次数据库每次都需要编译SQL语句,因此性能更好。相对于Statement而言,使用PrepareStatement执行SQL语句时,无须再传入SQL语句,只要为预编译的SQL语句传入参数即可。它比Statement多了如下方法:
(1)void setXxx(int parameterIndex,Xxx value):根据传入参数值类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句指定位置的参数。
1.5 ResultSet:j结果集对象
该对象包含访问查询结果的方法,ResultSet可以通过索引或列名获取列数据。它包含如下常用方法来移动记录直至:
(1)void close():释放ResultSet对象。
(2)boolean absolute(int row):将结果集的记录指针移动到第row行,如果为负,则倒着移动。如果移动后的记录指针指向一条有效记录,则方法返回true。
(3)void beforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态——记录指针的起始位置位于第一行之前。
(4)boolean first():将ResultSet的记录指针定位到首行,如果移动后的记录指针指向一条有效记录,则方法返回true。
(5) boolean previous():将ResultSet的记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则方法返回true。
(6) boolean next():将ResultSet的记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则方法返回true。
(7) boolean last():将ResultSet的记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则方法返回true。
(8) void afterLast():将ResultSet的记录指针定位到最后一行之后。
当比记录移动到指定行之后,ResultSet可通过getXxx(int columnIndex)或getXxx(String columnLable)方法来获得当前行、指定列的值,前者更据列索引值获取值,后者根据列名获取值。
Java 7新增了
二、JDBC编程步骤
2.1 加载数据库驱动。
通常使用Class类的forName()静态方法来加载驱动。例如下面代码:
Class.forName(dirverClass);
注意:最新的JDBC驱动以及可以通过SPI自动注册驱动类了,在JDBC驱动JAR包的META-INFservice路径下会包含一个java.sql.Driver文件,该文件制定了JDBC驱动类。因此,如果使用最新的驱动JAR包,第一步可以省略。
上面代码中driverClass就是数据库驱动类所对应的字符串。例如:加载MySQL的驱动采用如下代码:
Class.forName("com.mysql.cj.jdbc.Driver");
加载Oracle的驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
每个数据库厂商在提供数据库驱动(通常是一个JAR文件)时,总会提供相应的文档,其中有关驱动了ide介绍。文档类还会提及数据库URL写法,以及连接数据库的范例代码。
2.2 通过DriverManager获取数据库连接。
DriverManager提供如下方法:
DriverManager.getConnection(String url,String user,String pass);
三个参数分别为数据库URL、登录数据库的用户名和密码。其中用户名和密码通常由DBA(数据库管理员)分配,而且该用户还具有相应权限,才可以执行相应的SQL语句。
s数据库URL通常遵循如下写法:
jdbc:subprotool:other stuff
上面写法中jdbc是固定的,subprotool指定连接到特定数据库的驱动,other stuff不固定。
例如MySQL的URL写法:
jdbc:mysql://hostname:port/databasename
Oracle的URL的写法:
jdbc:oracle:thin:@hostname:port:databasename
2.3 通过Connection对象创建Statement对象
创建Statement对象有三个方法:
(1)createStatement():返回一个基本的Statement对象。
(2)prepareStatement(String sql):根据传入的SQL语句创建预编译的Statement对象。
(3)prepareCall(String aql):根据传入的SQL语句创建prepareCall对象。
2.4 使用statement执行SQL语句
所有Statement都有如下三个方法执行SQL语句:
(1)excute(String sql):该方法可执行任何SQL语句,但比较麻烦。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false。
(2)int executeUpdate(String sql ):主要用于执行DML和DDL语句。用于执行DML语句,并返回受影响的行数;该方法也可以用于执行DDL语句,执行DDL语句将返回0
(3)ResultSet executeQuery(String sql):该方法用于执行查询语句,并返回查询结果到对应的ResultSet对象中。只能执行查询语句。
2.5 操作结果集
如果执行SQL语句是查询语句,则将返回一个ResultSet对象,该对象里保存了SQL语句的查询结果。程序可以通过操作该对象来取出查询结果。
ResultSet对象主要提供量类方法:
(1)next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移动记录指针的方法。
(2)getXxx()方法来获取记录指针指向行、列的值。该方法既可以通过列索引作为参数,也可以使用列参数名作为参数。使用列索引作为参数性能更好,使用列名作为参数性能更好。
ResultSet实质是一个查询结果集,在逻辑结构上非常类似于一个表。下图显示了ResultSet的逻辑结构,以及操作ResultSet结果集并获取值的方法示意图:
2.6 回收数据库资源
包括关闭ResultSet、Statement、Connection等资源。
下面程序示范了JDBC编程,并通过ResultSet获取结果集的过程:
import java.sql.*;
public class ConnMySql
{
public static void main(String[] args) throws Exception
{
// 1.加载驱动,使用反射的知识,现在记住这么写。
Class.forName("com.mysql.cj.jdbc.Driver");
try (
// 2.使用DriverManager获取数据库连接,
// 其中返回的Connection就代表了Java程序和数据库的连接
// 不同数据库的URL写法需要查驱动文档知道,用户名、密码由DBA分配
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/select_test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"root", "ZX19950222");
// 3.使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement();
// 4.执行SQL语句
/*
Statement有三种执行sql语句的方法:
1 execute 可执行任何SQL语句。- 返回一个boolean值,
如果执行后第一个结果是ResultSet,则返回true,否则返回false
2 executeQuery 执行Select语句 - 返回查询到的结果集
3 executeUpdate 用于执行DML语句。- 返回一个整数,
代表被SQL语句影响的记录条数
*/
ResultSet rs = stmt.executeQuery("select s.*, teacher_name"
+ " from student_table s, teacher_table t"
+ " where t.teacher_id = s.java_teacher"))
{
// ResultSet有系列的getXxx(列索引 | 列名),用于获取记录指针
// 指向行、特定列的值,不断地使用next()将记录指针下移一行,
// 如果移动之后记录指针依然指向有效行,则next()方法返回true。
while (rs.next())
{
System.out.println(rs.getInt(1) + " "
+ rs.getString(2) + " "
+ rs.getString(3) + " "
+ rs.getString(4));
}
}
}
}
运行结果: