现在的位置: 首页 > 综合 > 正文

用 Apache Derby 构建脱机 Ajax

2013年10月19日 ⁄ 综合 ⁄ 共 3188字 ⁄ 字号 评论关闭

人们非常喜爱 Ajax 应用程序,以至于他们十分乐于使用 Ajax
应用程序而不想使用等效的桌面程序。但惟一的问题是出现在网络无法访问的时候怎么办。这是必须要用脱机功能的场景。Apache Derby 是支持 Ajax
应用程序实现脱机访问的优秀选择。了解如何使用 Apache Derby 作为本地数据库,该数据库可以实现 Ajax
应用程序的脱机使用。

先决条件和系统要求

本文将使用 Apache Derby 作为客户端数据库。Derby 可以单独下载,但是也被绑定到 Java™ 6 中并被称为 Java
DB。在本文中,我们将把 Derby V10.4.1.3 与 Java 5 和 Java 6 结合使用。我们将利用 Java Applet 在浏览器中启用
Derby 并且使用 JavaScript 访问 Applet。因此,强烈建议熟悉 Java Applet 和 JavaScript。Derby 允许使用普通
JDBC 和 SQL,因此需要熟悉这些内容(请参阅 参考资料)。



回页首

Apache Derby

Apache Derby 是任何一个 Java 应用程序都可以使用的嵌入式数据库。它是非常有用的工具,因此绑定在 Java Platform,
Standard Edition (Java SE) V6 中。虽然嵌入式数据库的应用不计其数,但是许多人都不知道用 Derby
可以实现的一些客户端功能。我们将通过构建一个简单的地址本应用程序研究其中一些应用。我们将从利用 Apache Derby 的 Java Applet
开始,最终实现一个使用 Derby 作为缓存的基于 Ajax 的应用程序。

数据访问

对于一篇有关数据库技术的文章,应当首先从数据库代码开始讨论。首先,让我们定义用于存储联系人的简单的表模式,如下所示:

图 1. Contact 表
Contact 表

您可以设想更复杂的联系人模式,如添加多个电话号码、地址等。但是,对于我们的应用程序来说,使用目前的这种模式刚刚好。当然,存在一个与 Contact
表相对应的 Java 类。在本例中,我们将遵循 Active Record 模式并用能够执行所有数据库操作的类封装数据库行。其代码如下所示:

清单 1. Contact

public class Contact {

private Integer id;
private String firstName;
private String lastName;
private String email;

public static List<Contact> getContacts(String clause){
if (clause == null)
clause = "";
String sql = SELECT_SQL + clause;
Connection conn = DbManager.getConnection();
List<Contact> contacts = new ArrayList<Contact>();
try {
ResultSet cursor = conn.createStatement().executeQuery(sql);
while (cursor.next()){
Contact c = new Contact();
c.setId(cursor.getInt(1));
c.setFirstName(cursor.getString(2));
c.setLastName(cursor.getString(3));
c.setEmail(cursor.getString(4));
contacts.add(c);
}
} catch (SQLException e) {
e.printStackTrace();
}
return contacts;
}

public static List<Contact> getAllContacts(){
return Contact.getContacts(null);
}

public static Contact getContact(String clause){
List<Contact> results = Contact.getContacts(clause);
if (results == null || results.size() != 1){
return null;
}
else return results.get(0);
}

public void save(){
if (id == null)
insert();
else
update();
}

public void delete(){
Connection conn = DbManager.getConnection();
String sql = "delete from Contact where id=?";
try{
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.executeUpdate();
System.out.println("Deleted contact id="+id);
} catch (SQLException e){
e.printStackTrace();
}
}

private void insert() {
Connection conn = DbManager.getConnection();
try {
PreparedStatement ps = conn.prepareStatement(INSERT_SQL,
PreparedStatement.RETURN_GENERATED_KEYS);
ps.setString(1, firstName);
ps.setString(2, lastName);
ps.setString(3, email);
ps.executeUpdate();
ResultSet autoRs = ps.getGeneratedKeys();
if (autoRs.next()){
id = autoRs.getInt(1);
}
System.out.println("Contact saved new id = " + id);
} catch (SQLException e) {
e.printStackTrace();
}
}

private void update(){
Connection conn = DbManager.getConnection();
try{
PreparedStatement ps = conn.prepareStatement(UPDATE_SQL);
ps.setString(1, firstName);
ps.setString(2, lastName);
ps.setString(3, email);
ps.setInt(4, id);
ps.executeUpdate();
System.out.println("Contact updated with id="+id);
} catch (SQLException e){
e.printStackTrace();
}
}

该类将完成很多任务,但是所有内容都非常简单。它有与数据库列对应的字段及用于每个字段的常用存取器(getter 和
setter)。它拥有执行所有创建/更新/删除(CReate Update Delete,CRUD)操作及其附带 SQL
查询的方法。例如,查询联系人的方法是静态方法,因此可以执行类似 Contact.getAllContacts()
的操作。保存和删除操作是实例方法,因此对个别联系人调用这些方法。此处没有显示查询,因为查询是标准的 SQL。该类还有常用的 getter 和
setter,但是为了简短起见并未显示(请参阅 下载
以获得完整的代码清单)。该类将用 Derby 构造基本的客户端存储。首先,我们将使用它作为 Applet UI 的一部分,但是稍后该 Applet 将把它用于
JavaScript。注意,对于每个方法,我们将调用实用程序类 DbManager 以获得连接。

清单 2. DbManager
 

本文转自IBM Developerworks中国

      请点击此处查看全文

抱歉!评论已关闭.