使用带有弹簧支撑的ibatis的常用习惯如下。或者这就是我这样做的方式。请告诉我是否可以采取更好的方式?
beans 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);
}
DAO:
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"));
还需要知道所有要覆盖的内容才能为此编写测试用例。测试用例将无法访问容器内的任何内容,因此它将依赖于Driver Datasource ...
由于我反对这里的最佳做法...我不介意只为测试用例改变我的DAO ......
答案 0 :(得分:2)
接口是否可以从图片中取出并仍然可以正常工作?
不要取出界面。这是有充分理由的(例如,交易的代理生成,AOP,服务测试的模拟等)。
你为什么要把它拿出来?它给你带来了什么焦虑?
可以更改设计/设置,以便简单地调用DAO(即使需要基本抽象类)
你为什么叫“新”?如果你正在使用Spring,你应该使用App Context注入它。如果你打电话给“新”,它不受Spring的控制。这应该是重点。
答案 1 :(得分:0)
接口可以将您与直接依赖于实现分离,这通常是一种很好的做法。它应该在没有接口的情况下工作正常,但最好依赖于抽象而不是实现。
至于测试,通过使用界面,使用 DAO来测试代码变得容易得多,因为你可以创建一个“模拟”实现,只返回虚拟数据和“在你的单元测试中手动注入“ - 你的客户端代码无法区分它和真正的DAO,因为它所知道的只是接口。
答案 2 :(得分:0)
我可以想到取出界面的一个主要原则会打破......'面向对象',最重要的是,无法在不中断调用代码的客户端的情况下更改方法签名。仅此一点就会阻止我走上正轨。很好的问题!!在许多活动中,我经常被问到这个问题。或者只是人们想要编程来抽象类。 =)