IBM pureQuery 是一种高性能 Java 数据访问平台,其目标主要是简化数据访问应用程序的开发和管理。它由工具、API 和运行时组成。pureQuery 引入了两种编程风格,以帮助用户通过简单但是强大的 API 访问数据库。本文介绍其中的一种风格,即内联方法编程风格,并讨论如何使用它有效地查询和更新数据库。本文还探索使用内联方法编程风格的一些优点和关键特性。
简介
pureQuery 为 SQL 执行引入了两种编程风格:内联方法编程风格和带注释的方法编程风格。这些编程风格为存储和检索对象(例如 Java bean 和 map)提高了现成的支持,从而简化了 Java 数据访问开发。内联编程风格还支持使用定制的用户定义的结果处理。
带注释的方法风格提供一种基于注释的数据访问方法。在带注释的方法风格中,SQL/XQUERY 字符串是在一个 pureQuery 注释(Annotation)中定义的。这些注释被放在用户定义接口中的方法声明上。代码生成器对接口进行预处理,生成每个带注释的方法的实现代码。生成的实现代码使用 pureQuery 运行时执行注释中定义的 SQL 语句。要了解关于带注释的方法风格的更多信息,请参阅本系列的 第 1 部分 或 pureQuery 文档。
pureQuery 内联编程风格的目的是减少使用 JDBC 查询或更新数据库时常见的一些重复任务。内联方法风格引入了一组定义良好的、有效的 API,它们比 JDBC 更简单,更易于使用。在内联风格中,可以在代码中像 Java String 对象一样 “内联” 地创建 SQL/XQUERY 语句。这种动态生成的语句被作为 String 参数传递给 pureQuery Data 接口方法。内联风格使用 JDBC 最佳实践,并利用特定于数据库的 API 来提高性能。内联方法风格的一个例子是使用批量更新和改进的结果集处理。在带注释的方法风格中,SQL 必须在编译时定义,而内联方法则不同,它支持在运行时动态创建和执行 SQL 语句。在应用程序中,SQL 是 “内联” 和可见的,因此更容易发现错误并做出更正。内联风格还有一个可插入式定制结果处理,用于轻松地映射数据库列。
表 1 中的代码片段演示了内联方法风格的简单性和易用性。
表 1. JDBC 与 pureQuery 内联风格之间的代码比较
JDBC
try {
//SQL for insert
String sqlins="'insert into CUSTOMER ("
+ "NAME, COUNTRY, STREET, CITY, PROVINCE, ZIP,"
+ "PHONE,INFO)"
+ "values( ?, ?, ?, ?, ?, ?, ?, ?)";
//prepare the INSERT statement
PreparedStatement pstmt =
con.prepareStatement(sqlins );
// setup parameters
pstmt.setString (1, "custName");
pstmt.setString (2, "custCountry");
pstmt.setString (3, "custStreet");
pstmt.setString (4, "custCity");
pstmt.setString (5, "custProvince");
pstmt.setString (6, "custZip");
pstmt.setString (7, "custPhone");
pstmt.setString (8, "custInfo");
//execute the INSERT statement
pstmt.execute();
//close the prepared statement
pstmt.close();
// SQL for SELECT
String sqlSel = "select Name, Country, Street, "
+ "Province,Zip from CUSTOMER where Customer = ?";
//prepare the SELECT statement
pstmt = con.prepareStatement(sqlSel);
//set the Input parameter
pstmt.setString (1, "custCountry");
//execute SELECT statement
pstmt.execute();
//get the results and set values in Customer Bean
ResultSet result = pstmt.getResultSet ();
List<Customer> custList =
new ArrayList<Customer>();
while (result.next ()) {
Customer cust = new Customer();
cust.name = result.getString (1);
cust.country = result.getString (2);
cust.street = result.getString (3);
cust.province = result.getString (4);
cust.zip = result.getString (5);
custList.add (cust);
}
}
catch (SQLException e) {
e.pringStackTrace ();
}