原文地址:
https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html
实战环境
- JDK1.8
- Mysql5.6
- mysql-connector-java-6.0.6.jar
用JDBC处理SQL语句的步骤
通常,用JDBC处理SQL语句,你需要遵循以下几个步骤:
- 建立一个链接
- 创建sql语句
- 执行sql语句
- 处理返回的结果集
- 关闭连接
包含一个完整步骤的代码可能看起来像下面这样
/**
*
* @param con 连接
* @param dbName
* @throws SQLException
*/
public static void viewTable(Connection con, String dbName) throws SQLException {
// 1:连接通过参数传过来的
Statement stmt = null;
try {
// 2:创建SQL语句
String query = "select COF_NAME, SUP_ID, PRICE, " + "SALES, TOTAL " + "from " + dbName + ".COFFEES";
stmt = con.createStatement();
// 3:执行SQL语句
ResultSet rs = stmt.executeQuery(query);
// 4:处理返回的结果集
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + "\t" + supplierID + "\t" + price + "\t" + sales + "\t" + total);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 5:关闭连接
if (stmt != null) {
stmt.close();
}
}
}
建立连接
首先,用你想用的数据源建立一个连接。这个数据源可以是DBMS,一个传统的文件系统或者是其他的使用了相应的JDBC驱动程序的数据源。这个连接被一个Connection对象所表示出来。详情请见:03_创建数据源
创建sql语句
一个Satement接口代表了一个SQL语句。你通过对Statement对象的执行,他们将会返回SQL对应查询的ResultSet结果集。这种结果集代表了数据库的结果。你需要通过Connection连接对象来创建一个Statement对象。如上述代码中的示例语句:
stmt = con.createStatement();
在JDBC中,有三种不同类型的Statement对象
Statement
是简单的无参数的SQL语句的一种实现。
PreparedStatement
继承自Statement,是包括了输入参数(可能没有)预编译的SQL语句的实现对象。
CallableStatement:
继承自PrepatedStatement,是用来执行可能包含了输入和输出参数的存储过程一种实现。
执行sql语句
为了执行一条SQL语句,就利用Statement对象调用execute方法吧。有以下几种:
execute
如果查询返回的第一个对象是结果集对象,则返回true。如果查询能够返回一个或不止一个的结果集对象,则可以利用这个方法。可以通过重复的调用Statement.getResultSet来检索结果集对象。
executeQuery
返回一个结果集对象
executeUpdate
通过返回一个整数来代表执行一个查询在数据库中所影响的行数(即对几行数据产生了操作)。如果你执行的是插入、删除、或者更新的SQL语句,可以利用这个方法来查看影响的记录数。
处理返回的结果集
在一个返回的结果集中访问数据是通过游标的方式。注意这个游标不是数据库中的游标,这个游标是一个指针,是一个指向一行数据在结果集中位置的指针。最初,游标位于结果集中的第一行,你能调用结果集对象中定义的各种方法来移动游标。
例如,在前面的viewTable函数中,通过重复调用ResultSet.next方法来向前移动游标一步。每一次都调用next,这个方法输出游标在结果集中具体指向的行数。在前文中的代码就是这个:
try {
stmt = con.createStatement();
// 3:执行SQL语句
ResultSet rs = stmt.executeQuery(query);
// 4:处理返回的结果集
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + "\t" + supplierID + "\t" + price + "\t" + sales + "\t" + total);
}
}
// ...
关闭连接
当你通过Statement执行完一个查询时,调用Statement.close方法来立即释放使用的资源。当你调用这个方法时,他的结果集对象就会被关闭。
例如:viewTable中为了确保Statement对象是被关闭的,在方法的最后做了处理。无论抛出什么sqlexception对象,都将其封装在finally块中:
} finally {
// 5:关闭连接
if (stmt != null) {
stmt.close();
}
}
jdbc在与数据源进行交互期间遇到错误时会抛出SQLException
。在JDBC4.1及之后,可以通过JDK1.7的新特性来关闭Connection、Statement、ResultSet对象,无论SQLException
是否被抛出,try-with-resource语句都可以自动关闭这些对象,将上面的代码进行改造就是这样的:
/*
* @param con 连接
* @param dbName
* @throws SQLException
*/
public static void viewTable(Connection con, String dbName) throws SQLException {
// 1:连接通过参数传过来的
Statement stmt = null;
// 这里在程序执行完会自动管理资源
try(Statement stmt = con.createStatement()){
// 2:创建SQL语句
String query = "select COF_NAME, SUP_ID, PRICE, " + "SALES, TOTAL " + "from " + dbName + ".COFFEES";
// 3:执行SQL语句
ResultSet rs = stmt.executeQuery(query);
// 4:处理返回的结果集
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + "\t" + supplierID + "\t" + price + "\t" + sales + "\t" + total);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
以上就是JDBC实战的理论基础了。