人们非常喜爱 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
表相对应的 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中国
请点击此处查看全文