使用 Java 数据库连接介体服务来访问数据
以下步骤说明如何为 Java™ 数据库连接 (JDBC) 数据介体服务 (DMS) 创建元数据以及如何实例化 DMS dataGraph。
过程
- 创建元数据工厂。 这可以用于创建元数据、表、列、过滤器、过滤器自变量、数据库约束、键、有序对象和关系。
MetadataFactory factory = MetadataFactory.eINSTANCE; Metadata metadata = factory.createMetadata();
- 为元数据创建表。 您可以使用两种方法来完成此操作。一种方法是元数据工厂能够创建表,然后此表能够添加自身到已经创建了的元数据中,另一种方法是元数据能够添加一个新的表,在这种情况下,新的表已经创建。此示例使用第二种方法来创建名为 CUSTOMER 的表,因为它涉及到的步骤较少。
Table custTable = metadata.addTable("CUSTOMER");
- 为元数据设置根表。 您还是可以用两种方法来完成此操作。一种方法是该表能够声明它自身为根,另一种方法是元数据能够设置它自己的根表。对于第一种方法,代码为:
如果您要使用第二种方法,代码为:custTable.beRoot();
metadata.setRootTable(custTable)
- 在表中设置列。 示例表被命名为 CUSTOMER。使用此类型创建每个列。在元数据中的列类型只能是正在使用的 JDBC 驱动程序支持的类型。如果您有关于正在使用的 JDBC 驱动程序支持哪些类型的问题,请参考 JDBC 驱动程序文档。
此示例为此列创建列对象,但不为其他的列创建列对象。原因是,此列是主键,并且在添加剩余的列后用于设置表的主键。主键不能为 NULL,因此 custID.setNullable (false) 禁止发生此情况。添加剩余的列:Column custID = custTable.addIntegerColumn("CUSTID"); custID.setNullable(false);
custTable.addStringColumn("CUSTFIRSTNAME"); custTable.addStringColumn("CUSTLASTNAME"); custTable.addStringColumn("CUSTSTREETADDRESS"); custTable.addStringColumn("CUSTCITY"); custTable.addStringColumn("CUSTSTATE"); custTable.addStringColumn("CUSTZIPCODE"); custTable.addIntegerColumn("CUSTAREACODE"); custTable.addStringColumn("CUSTPHONENUMBER"); custTable.setPrimaryKey(custID);
- 创建需要的其他表。 对于此示例,创建“订单”表。每个订单由一个客户制定。
Table orderTable = metadata.addTable("ORDER"); Column orderNumber = orderTable.addIntegerColumn("ORDERNUMBER"); orderNumber.setNullable(false); orderTable.addDateColumn("ORDERDATE"); orderTable.addDateColumn("SHIPDATE"); Column custFKColumn = orderTable.addIntegerColumn("CUSTOMERID"); orderTable.setPrimaryKey(orderNumber);
- 为需要关系的表创建外键。 在此示例中,订单具有指向制定订单的客户的外键。为了在两个表之间创建关系,您必须首先为“订单”表制定外键。
此关系需要两个键,即父键和子键。由于没有给定特定的名称,CUSTOMER_ORDER 的缺省并置就是用于此关系的名称。Key custFK = factory.createKey(); custFK.getColumns().add(custFKColumn); orderTable.getForeignKeys().add(custFK);
缺省的关系包括有订单的所有客户。要获得所有客户,即使他们没有订单,您也需要这行:metadata.addRelationship(custTable.getPrimaryKey(), custFK);
现在这两个表已互相有了关系,您可以添加过滤器到“客户”表中以查找具有特定特征的客户。metadata.getRelationship("CUSTOMER_ORDER") .setExclusive(false);
- 指定任何需要的过滤器。 在此示例中,设置“客户”表的过滤器以使用确定的姓查找在特定状态下的制定过订单的所有客户。
Filter filter = factory.createFilter(); filter.setPredicate("CUSTOMER.CUSTSTATE = ? AND CUSTOMER.CUSTLASTNAME = ?"); FilterArgument arg1 = factory.createFilterArgument(); arg1.setName("CUSTSTATE"); arg1.setType(Column.STRING); filter.getFilterArguments().add(arg1); FilterArgument arg2 = factory.createFilterArgument(); arg2.setName("CUSTLASTNAME"); arg2.setType(Column.STRING); filter.getFilterArguments().add(arg2); custTable.setFilter(filter);
- 添加任何需要的排序对象。 在此示例中,设置“排序”对象为根据客户的名字排序。
该步骤完成此 JDBC DMS 的元数据的创建。Column firstName = ((TableImpl)custTable).getColumn("CUSTFIRSTNAME"); OrderBy orderBy = factory.createOrderBy(); orderBy.setColumn(firstName); orderBy.setAscending(true); metadata.getOrderBys().add(orderBy);
- 创建与数据库的连接。 此示例不显示如何创建与数据库的连接;它假设调用方法 connect() 的 SDO 客户机完成此操作。请参阅主题。
- 实例化并初始化 JDBC DMS 对象 (dataGraph)。 SDO 客户机执行这些操作。对于本示例:
现在有了 datagraph,您可以处理信息。以下示例包含 DataGraph 对象中的基本数据处理。ConnectionWrapperFactory factory = ConnectionWrapperFactory.soleInstance; connectionWrapper = factory.createConnectionWrapper(connect()); JDBCMediatorFactory mFactory = JDBCMediatorFactory.soleInstance; JDBCMediator mediator = mFactory.createMediator(metadata, connectionWrapper); DataObject parameters = mediator.getParameterDataObject(); parameters.setString("CUSTSTATE", "NY"); parameters.setString('CUSTLASTNAME', 'Smith'); DataObject graph = mediator.getGraph(parameters);
- 示例:处理 DataGraph 对象中的数据
使用执行任务“使用 Java 数据库连接数据介体服务进行数据访问”期间创建的简单 Datagraph,下面是某个典型数据操作。
首先,获取客户列表,然后为每个客户获取全部订单,然后打印客户的名字和定购日期。(对于此示例,假设您已经知道姓是 Smith)。List customersList = graph.getList("CUSTOMER"); Iterator i = customersList.iterator(); while (i.hasNext()) { DataObject customer = (DataObject)i.next(); List ordersList = customer.getList("CUSTOMER_ORDER"); Iterator j = ordersList.iterator(); while (j.hasNext()) { DataObject order = (DataObject)j.next(); System.out.print( customer.get("CUSTFIRSTNAME") + " "); System.out.println( order.get("ORDERDATE")); } }
现在,将名为 Will 的每个客户更改为 Matt。i = customersList.iterator(); while (i.hasNext()) { DataObject customer = (DataObject)i.next(); if (customer.get("CUSTFIRSTNAME").equals("Will")) { customer.set("CUSTFIRSTNAME", "Matt"); } }
删除第一条客户条目。((DataObject) customersList.get(0)).delete();
将新的 DataObject 添加到图DataObject newCust = graph.createDataObject("CUSTOMER"); newCust.setInt("CUSTID", 12345); newCust.set("CUSTFIRSTNAME", "Will"); newCust.set("CUSTLASTNAME", "Smith"); newCust.set("CUSTSTREETADDRESS", "123 Main St."); newCust.set("CUSTCITY", "New York"); newCust.set("CUSTSTATE", "NY"); newCust.set("CUSTZIPCODE", "12345"); newCust.setInt("CUSTAREACODE", 555); newCust.set("CUSTPHONENUMBER", "555-5555"); graph.getList("CUSTOMER").add(newCust);
提交更改。mediator.applyChanges(graph);
- 将已更改的信息提交至 DMS 以更新数据库。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_jdbcmeduse
文件名:tdat_jdbcmeduse.html