Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere JDBC 驱动程序 » 使用 JDBC 访问数据

 

使用预准备语句进行更有效的访问

如果使用 Statement 接口,则先对您发送到数据库的每条语句进行分析,生成访问计划,然后再执行该语句。这些在实际执行语句之前的步骤被称为准备语句。

如果使用 PreparedStatement 接口,将会在性能方面获得一些益处。这样您就可以使用占位符来准备语句,然后在执行语句时向占位符赋值。

使用预准备语句在执行多个类似的操作(如插入多行)时特别有用。

有关准备语句的详细信息,请参见准备语句

示例

以下示例说明如何使用 PreparedStatement 接口,不过,插入单行并未有效地利用了预准备语句。

JDBCExample 类的以下 InsertDynamic 方法用于执行一个预准备语句:

public static void InsertDynamic( Connection con,
              String ID, String name )
{
  try {
    // Build the INSERT statement
    // ? is a placeholder character
    String sqlStr = "INSERT INTO Departments " +
            "( DepartmentID, DepartmentName ) " +
            "VALUES ( ? , ? )";

    // Prepare the statement
    PreparedStatement stmt =
      con.prepareStatement( sqlStr );

    // Set some values
    int idValue = Integer.valueOf( ID );
    stmt.setInt( 1, idValue );
    stmt.setString( 2, name );

    // Execute the statement
    int iRows = stmt.executeUpdate();

    // Print the number of rows inserted
    System.out.println(iRows + " rows inserted");
  }
  catch (SQLException sqe)
  {
    System.out.println("Unexpected exception : " +
              sqe.toString() + ", sqlstate = " +
              sqe.getSQLState());
  }
  catch (Exception e)
  {
    e.printStackTrace();
  }
}
可用源代码

此代码段是位于 samples-dir\SQLAnywhere\JDBC 目录中的 JDBCExample 类的一部分。

注意
  • executeUpdate 方法返回一个用于反映操作所影响到的行数的整数。在此情况下,成功的 INSERT 会返回值 1。

  • 作为服务器端的类运行时,System.out.println 的输出会显示在数据库服务器消息窗口中。

♦  运行 JDBC 的 Insert 示例:
  1. 使用 Interactive SQL,以 DBA 身份连接到示例数据库。

  2. 确保已安装 JDBCExample 类。

    有关安装 Java 示例类的详细信息,请参见准备示例

  3. 定义一个名为 JDBCInsert 的存储过程,该存储过程充当类中 JDBCExample.Insert 方法的包装:

    CREATE PROCEDURE JDBCInsert( IN arg1 INTEGER, IN arg2 CHAR(50) )
      EXTERNAL NAME 'JDBCExample.Insert(ILjava/lang/String;)V'
      LANGUAGE JAVA;
  4. 如下所示调用 JDBCExample.Insert 方法:

    CALL JDBCInsert( 202, 'Southeastern Sales' );

    Insert 方法用以调用 InsertDynamic 方法。

  5. 确认 Departments 表中已添加一行。

    SELECT * FROM Departments;

    示例程序会在数据库服务器消息窗口中显示 Departments 表的更新内容。

  6. 在示例类中有一个称为 DeleteDynamic 的类似方法,用于显示如何删除刚刚添加的行。

    定义一个名为 JDBCDelete 的存储过程,该存储过程充当类中 JDBCExample.Delete 方法的包装:

    CREATE PROCEDURE JDBCDelete( in arg1 integer )
      EXTERNAL NAME 'JDBCExample.Delete(I)V'
      LANGUAGE JAVA;
  7. 如下所示调用 JDBCExample.Delete 方法:

    CALL JDBCDelete( 202 );

    Delete 方法用以调用 DeleteDynamic 方法。

  8. 确认该行已从 Departments 表中删除。

    SELECT * FROM Departments;

    示例程序会在数据库服务器消息窗口中显示 Departments 表的更新内容。