Обычная идиома использования 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);
}
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 ( "л");
Я задавал вопрос в том же духе пару дней назад, но после двухдневной борьбы и выяснения других вопросов я снова задал этот вопрос. Если возможно, предоставьте фрагменты кода того, что вы хотите изменить / добавить.
Модульное тестирование с этим дизайном не работает, потому что все находится внутри контейнера. Если мне это удастся, я добавлю это и к вопросу (для информационных целей).
Кроме того, я думаю, что для кого-то, кто пытается заставить весну и ибатис работать ... это могло бы стать хорошим началом.
Edit:
Как я уже упоминал выше, я хотел бы назвать свой DAO следующим образом (или я в порядке, передавая что-то вместе как параметр конструктора):
MyUserAccessDAO mydao = new MyUserAccessDAO(); mydao.getUserReports("blah");
Для достижения вышеуказанного у меня в DAO должна быть следующая строка
setSqlMapClient((SqlMapClient)ApplicationInitializer.getApplicationContext().getBean("SqlMapClient"));
Еще нужно знать, что все перезаписать, чтобы можно было написать контрольный пример для этого. Контрольный пример не сможет получить доступ к чему-либо внутри контейнера, поэтому он будет зависеть от источника данных драйвера ...
Так как я иду против лучшей практики здесь ... я не против поменять свой DAO исключительно для теста ...