02_JDBC实战理论

原文地址:
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语句,你需要遵循以下几个步骤:

  1. 建立一个链接
  2. 创建sql语句
  3. 执行sql语句
  4. 处理返回的结果集
  5. 关闭连接

包含一个完整步骤的代码可能看起来像下面这样

/**
     * 
     * @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实战的理论基础了。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页