在上一篇文章里介绍了JDBC的概念、产生原因及简单使用。本篇将介绍JDBC的常用API,包括Connection,Statement, ResultSet, PreparedStatement。
Connection是数据库的连接对象。有两个作用:(1)获取执行SQL的对象(2)管理事务
关于第(1)点,将会在后续介绍,这里介绍一下(2)管理事务的操作。
管理事务有三个主要的API:
setAutoCommit(boolean b);
commit();
rollback();
具体的使用的注释见下面的代码片段:
// 关闭自动提交:true为自动提交事务;false为手动提交事务,即为开启事务
connection.setAutoCommit(false);
try {
// 定义sql
String sql1 = "update user set phone = '666' where id = 1";
String sql2 = "update user set phone = '666' where id = 2";
// 获取执行sql的对象
statement = connection.createStatement();
// 执行更新语句
statement.executeUpdate(sql1);
// 若放开这一行,出现了异常,事务会回滚,相当于两条sql都没有执行
int x = 9 / 0;
statement.executeUpdate(sql2);
// 提交事务
connection.commit();
} catch (Exception e) {
// 回滚
connection.rollback();
e.printStackTrace();
} finally {
// 释放资源
connection.close();
statement.close();
}
Statement是执行SQL的对象,作用也是用于执行SQL。常用的SQL有DDL, DML, DQL,有以下两个常用的API。
int executeUpdate(String sql); 执行DDL, DML语句,返回值是影响的行数;
ResultSet executeQuery(String sql); 执行DQL语句,返回值是结果集对象;
更新语句可以见(一)中的示例,返回值对象将在下一节介绍。
JDBC执行查询SQL的返回值。作用就是封装返回对象。主要API有如下两个
boolean next(); 判断是否还有有效的数据;
xxx getXxx(参数) 获取数据,getInt, getString等。对于参数,可以是int或是string类型的。当参数是int时,表示的是列的编号;参数是string时,表示的是列的名称。
// 定义sql
String sql = "select * from user";
// 获取执行sql的对象
statement = connection.createStatement();
// 执行更新语句
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
String gender = resultSet.getString("gender");
String phone = resultSet.getString("phone");
System.out.println(id + name + gender + phone);
}
// 释放资源
connection.close();
statement.close();
继承自Statement,预编译SQL语句并执行,预防SQL注入问题,且性能更高。
// 定义sql,用?作为占位符表示查询的参数
String sql = "select * from user where name = ? and phone = ?";
// 需要传入sql作为参数
PreparedStatement statement = connection.prepareStatement(sql);
// 第一个参数表示第几个占位符,设置?的值
statement.setString(1, "zs");
statement.setString(2, "777");
// 执行更新语句
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
String gender = resultSet.getString("gender");
String phone = resultSet.getString("phone");
System.out.println(id + name + gender + phone);
}
// 释放资源
resultSet.close();
statement.close();
connection.close();
关于性能更高的原因:在获取PreparedStatement对象时,会将参数里的sql发送约MySQL服务器进行检查和编译,因此耗时的动作先完成了;而且如果sql的模板一样时,只需要进行一次检查和编译。