简单地说,问题是第一次调用JdbcTemplate并查询数据库时结果集为空。
当我第二次访问DAO方法时,我得到了预期的结果。以下是有关如何设置类的更多信息:
我有一个扩展父数据访问对象的数据访问对象。 Parent dao类只是将数据源注入JdbcTemplate的构造函数:
public class BaseDao
{
private JdbcTemplate usrJdbcTemplate;
public void setUsrDataSource(DataSource usrDataSource)
{
this.usrJdbcTemplate = new JdbcTemplate(usrDataSource);
}
public JdbcTemplate getUsrJdbcTemplate()
{
return this.usrJdbcTemplate;
}
}
扩展它的类使用此JdbcTemplate来查询表:
public class OimUserDao extends BaseDao
{
public Date getPasswordExpiryDate(String userName)
{
String sql = "select USR_PWD_EXPIRE_DATE from USR where UPPER (USR_LOGIN) = ?";
List<java.sql.Date> dtLst = getUsrJdbcTemplate().query(sql, new Object[] {userName.toUpperCase()}, new RowMapper<java.sql.Date>()
{
@Override
public java.sql.Date mapRow(final ResultSet rs, int rowNum) throws SQLException
{
return rs.getDate(1);
}
});
if (dtLst.size()>0)
{
return dtLst.get(0);
}
else
{
return null;
}
}
}
使用@Autowired注释在服务中自动装配DAO。 xml中的DAO声明:
<bean id="baseDao" class="us.worldpay.portalgateway.dao.BaseDao">
<property name="usrDataSource" ref="usrDataSource" />
</bean>
<bean id="oimUserDao" class="us.worldpay.portalgateway.dao.OimUserDao" parent="baseDao" />
Web.xml包含xml的声明,其中包含这些DAO的bean定义(pg-data是我们关注的数据):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/pg-servlet.xml,
/WEB-INF/pg-data.xml
</param-value>
</context-param>
更糟糕的是,这绝不会发生在我的本地方框(Weblogic)上,它指向与QA env相同的数据库(Oracle)。第一次填充结果集时,当我在本地框上运行时,会有数据。当我在QA env(Weblogic)上运行它时,结果集第一次为空。我花了几个小时和几个小时,并没有在哪里。
我在阅读这篇文章时表达了你的时间。我很感激能得到的所有帮助。
答案 0 :(得分:0)
我认为BaseDao
没有理由。我不需要它,只需将SimpleJdbcTemplate
注入需要它的DAO中。
您应该使用PreparedStatement
而不是自己转义用户名。我不会在查询中使用LIKE子句。您的用户名应该是唯一的;你应该得到一个日期。
好的,我们再问一些问题。
你说ResultSet在第一次是空的。你是说如果你只是重新运行方法调用,它不是空的? “我想是的,是的。”你需要确定。这是你问题的核心。
您确定本地计算机和QA环境指向的是同一个Oracle实例吗? “我非常肯定。是的。”非常好!
如果您使用客户端登录Oracle并运行相同的查询,它是否会带回您期望的结果? “是的,它确实。”优良!
您是否通过调试器逐步完成了代码以查看发生了什么?我会高度推荐它。
还有一个问题:是否有一个例外,你没有抓到? Spring将SQLException包装到未经检查的DataAccessException中。也许在第二次通话时第一次纠正时会出现不好的事情。我只是抓住稻草。