DAO框架架构
由于有了一个可以运行的示例,让我们得以粗略了解DAO框架是如何运作的。在图2表示的顺序图中演示了DAO的工作方式: 图2. DAO顺序图 在开始时,调用DaoManagerBuilder.buildDaoManager()并传入DAOMap.xml来初始化DAO框架。在这个方法中DAO框架会读取DAOMap.xml并且由此生成相应的DAOManager对象。这个对象包括了对支持的数据存储机制的描述。哪个接口会被实现,哪个是接口和存储机制结合的实现类?基本上这是和DAOMap.xml文件相等的 Java对象。 当有了DAOManager对象,可以从中得到ContactDAO接口的SQL Map实例。DAO框架会返回一个包装了实现类的DaoProxy对象。在本例子中将给SQLMapContactDAO返回一个DaoProxy对象。这个DaoProxy对象允许DAO框架截获调用商业方法。本例中,当调用 contactDAO.selectContact()时,DAO框架会截获这个调用并检查事务处理是否已经开始执行,如果没有,它将调用事务管理器中的 如果不希望事务在方法层上可见,或者希望在一个事务中调用多个不同的方法,则可在调用ContactDAO中的商业方法前调用daoManager. 那么现在剩下要关心的事情就是那个模块负责存储机制的初始化并传递控制给存储机制。在这个例子中,就意味着由哪个模块负责将SqlMapConfig.xml的路径传递给SQL Map框架并给它初始化。同样意味着哪个模块负责和SQL Maps框架进行实际的交互。DAO框架为每种存储提供了Template类,在工程中,可以从这个Template类中继承实例类,并只要自己的方法中编写商业事务逻辑。然后将控制传递给这个模板类,它将负责和存储机制的交互。在我们的例子中调用super.queryForObject("getContact",new Integer(contactId)),意味着SqlMapDaoTemplate将负责SQL Maps的初始化和与之交互。 初始化存储机制需要相关的一些信息,在例子中初始化需要SqlMapConfig.xml的路径,这个文件中包含驱动类的名字、JDBC URL、登陆信息之类的信息。这些特定的事务管理器需要的信息将会在DaoMap.xml文件中作为一个属性元素传递给管理器。下一节,我们将讨论DAO框架支持哪些事务管理器,每个管理器需要哪些初始化信息。 支持的存储管理机制 DAO框架提供了内置的对一些存储管理机制的支持。为了使用其中的一个内置的transactionManagers,需要做两件事情: 1.在DAOMap.xml中增加一个 2.在生成DAO实现类的时候为transactionManager继承适当的Template类。 下面我们要研究内置transactionManagers并找出在应用程序中使用如何使用它们。 JDBC 如果不想使用任何存储框架,不想自己写JDBC代码,那么JDBC事务管理器是很好的选择。如果使用JDBC作为存储机制,则可以使用以下三种连接管理之一: SIMPLE:如果要使用iBatis'自己的连接池实例,可以把SIMPLE作为DataSource元素的值。将通常的JDBC属性(DriverManager类, JDBC URL,等等)传入作为Properties。在iBatis在线文档中查看更多的连接属性。 清单5: DBCP:使用Apache DBCP作为连接管理。请查看DAO在线指导获得如何配置DBCP连接池的信息。 JNDI:当要使用应用服务器的连接池,那么要做的是提供连接池的JNDI名,DAO框架则使用这个名称获得一个连接。 清单6: 然后要建立一个类继承JdbcDaoTemplate.java来实现事务方法借口。在示例中,我们建立了JDBCContactDAO.java。在事务方法中,可以调用getConnection()向父类请求连接。因为我们没有使用任何存储框架,所以我们只能建立并执行我们自己的SQL请求。 清单7: public int updateContact(Contact contact) { try { Connection conn = getConnection(); PreparedStatement updateStmt = conn.prepareStatement("UPDATE DB2ADMIN.CONTACT SET FIRSTNAME=?,LASTNAME=? WHERE CONTACTID=?"); updateStmt.setString(1, contact.getFirstName()); updateStmt.setString(2, contact.getLastName()); updateStmt.setInt(3, contact.getContactId()); return updateStmt.executeUpdate(); } catch (SQLException ex) { throw new DaoException(ex); } } 使用JDBC transactionManager的时候,DAO框架会调用Connection 对象中的commit和rollback