-1

简而言之,问题是我第一次调用 JdbcTemplate 并查询数据库时结果集为空。

当我第二次访问 DAO 方法时,我得到了预期的结果。以下是有关如何设置类的更多信息:

我有一个扩展父数据访问对象的数据访问对象。父 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;
    }
    }
}

DAO 使用@Autowired 注解在服务中自动装配。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 环境相同的数据库(Oracle)。当我在本地机器上运行它时,第一次结果集已填充并包含数据。当我在 QA 环境(Weblogic)上运行它时,结果集第一次是空的。我已经花了几个小时和几个小时,但没有得到任何地方。

我很感谢您花时间阅读这篇文章。我很感激我能得到的所有帮助。

4

1 回答 1

0

我看不出有什么理由BaseDao。我会放弃它,只需将其注入SimpleJdbcTemplate需要它的 DAO 中。

您应该PreparedStatement自己使用而不是转义用户名。我不会在查询中使用 LIKE 子句。您的用户名应该是唯一的;你应该得到一个日期回来。

好的,让我们再问一些问题。

您说 ResultSet “第一次”为空。你是说如果你只是重新运行它不是空的方法调用?“我想是的,是的。” 你需要确定。这是您问题的核心。

您确定您的本地机器和 QA 环境指向同一个 Oracle 实例吗?“我非常确定。是的。” 很好!

如果您使用客户端登录 Oracle 并运行相同的查询,它会返回您期望的结果吗?“是的,它确实。” 出色的!

您是否使用调试器单步执行代码以查看发生了什么?我强烈推荐它。

还有一个问题:是否抛出了您没有捕获的异常?Spring 将 SQLException 包装到未经检查的 DataAccessException 中。也许第一次发生不好的事情,在第二次通话中得到纠正。我只是在这里抓住稻草。

于 2012-09-25T02:33:50.560 回答