在上一篇文章里介绍了JDBC的概念、产生原因及简单使用。本篇将介绍JDBC的常用API,包括Connection,Statement, ResultSet, PreparedStatement。
一、Connection
Connection是数据库的连接对象。有两个作用:(1)获取执行SQL的对象(2)管理事务
关于第(1)点,将会在后续介绍,这里介绍一下(2)管理事务的操作。
管理事务有三个主要的API:
setAutoCommit(boolean b);
commit();
rollback();
具体的使用的注释见下面的代码片段:
// 关闭自动提交:true为自动提交事务;false为手动提交事务,即为开启事务 connection.setAutoCommit(false);try {// 定义sqlString 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
Statement是执行SQL的对象,作用也是用于执行SQL。常用的SQL有DDL, DML, DQL,有以下两个常用的API。
int executeUpdate(String sql); 执行DDL, DML语句,返回值是影响的行数;
ResultSet executeQuery(String sql); 执行DQL语句,返回值是结果集对象;
更新语句可以见(一)中的示例,返回值对象将在下一节介绍。
三、ResultSet
JDBC执行查询SQL的返回值。作用就是封装返回对象。主要API有如下两个
boolean next(); 判断是否还有有效的数据;
xxx getXxx(参数) 获取数据,getInt, getString等。对于参数,可以是int或是string类型的。当参数是int时,表示的是列的编号;参数是string时,表示的是列的名称。
// 定义sqlString 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();
四、PreparedStatement
继承自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的模板一样时,只需要进行一次检查和编译。