以下是使用带有弹簧支撑的 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......