1

以下是使用带有弹簧支撑的 ibatis 的惯用语。或者这就是我的做法。请让我知道是否可以做得更好?

豆类 xml:

<bean id="DataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/some/som1/my/mydb"/>
</bean>
<bean id="SqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
  <property name="dataSource" ref="DataSource"/>
</bean>
 <bean id="myDAO" class="com.reports.MyUserAccessDAO">
    <property name="sqlMapClient" ref="SqlMapClient"/>
    <property name="dataSource" ref="DataSource"/>
 </bean>

界面:

public interface MyUserAccessIface {
    public SomeBean getUserReports (String org);
}

道:

public class MyUserAccessDAO extends SqlMapClientDaoSupport implements MyUserAccessDAO {
    public SomeBean getUserReports (String org)
    {
      SomeBean bean = new SomeBean();
      //code for parameters goes here 
      getSqlMapClientTemplate().queryForList("namesp.userreport", parm);
      //fetch the result from parm and put them in SomeBean
      return bean
    }
}

调用 DAO:

MyUserAccessIface iBatisDAO = 
(MyUserAccessIface) ApplicationInitializer.getApplicationContext().getBean("myDAO");

即使这很好用,我也不明白需要一个接口。

问题

  • 界面可以从图片中取出并且仍然可以正常工作吗?
  • 是否可以更改设计/设置,以便对 DAO 的调用很简单(即使这需要基本抽象类)

    MyUserAccessDAO mydao = new MyUserAccessDAO(); mydao.getUserReports("废话");

几天前我已经按照这些思路提出了问题,但是在挣扎了 2 天并找到了更多的东西之后,我现在又问了这个问题。如果可能,请提供您要更改/添加的代码片段。

这种设计的单元测试不起作用,因为一切都驻留在容器内。如果我得到这个工作,那么我也会将它添加到问题中(出于信息目的)。

此外,我认为对于试图让 spring + ibatis 工作的人......这最终将成为一个很好的起点。

编辑:

就像我上面提到的那样,我想像这样调用我的 DAO(或者我可以将一些东西作为构造函数参数传递):

MyUserAccessDAO mydao = new MyUserAccessDAO(); mydao.getUserReports("blah");

为了实现上述目标,我将在我的 DAO 中有以下行

setSqlMapClient((SqlMapClient)ApplicationInitializer.getApplicationContext().getBean("SqlMapClient"));

仍然需要知道要覆盖什么才能为此编写测试用例。测试用例将无法访问容器内的任何内容,因此它将取决于驱动程序数据源...

因为我在这里违背了最佳实践......我不介意仅仅为了测试用例而改变我的 DAO......

4

3 回答 3

2

界面可以从图片中取出并且仍然可以正常工作吗?

不要把接口拿出来。它的存在是有充分理由的(例如,事务的代理生成、AOP、服务测试的模拟等)

你为什么要把它拿出来?它给你带来了什么焦虑?

是否可以更改设计/设置以便对 DAO 的调用很简单(即使这需要一个基本抽象类)

为什么叫“新”?如果您使用的是 Spring,则应该使用 App Context 注入它。如果你称之为“新”,它就不受 Spring 的控制。这应该是重点。

于 2009-11-11T02:28:59.490 回答
0

该接口可以将您从直接依赖于实现中分离出来,这通常是一种很好的做法。如果没有接口,它应该一切正常,但最好依赖抽象而不是实现。

至于测试,通过使用接口,使用DAO 测试代码变得更加容易,因为您可以创建一个“模拟”实现,它只返回虚拟数据并在您的单元测试中手动“注入”它 - 您的客户端代码无法区分这与真正的 DAO 之间的区别,因为它所知道的只是接口。

于 2009-11-10T22:19:39.643 回答
0

我可以想到一个主要原则,取出接口会破坏......“面向对象”,最重要的是,无法在不中断调用您代码的客户端的情况下更改方法签名。仅这一点就可以阻止我前进。好问题!在很多活动中,我经常被问到这个问题。或者只是人们想对抽象类进行编程。=)

于 2010-01-24T19:27:37.677 回答