スプリングサポート付きのアイバティスを使用する通常の慣用句は次のとおりです。というか、私はこうしています。もっと良い方法があれば教えてください。
豆の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"));
このためのテストケースを作成できるようにするには、何を上書きする必要があるかを知る必要があります。テスト ケースはコンテナ内の何にもアクセスできないため、Driver Datasource に依存します...
ここではベストプラクティスに反しているので...テストケースのためだけにDAOを変更してもかまいません...