SpringMap中的RowMapper / ResultsetExtractor

时间:2016-09-25 20:21:39

标签: java spring spring-mvc

我正在使用spring框架,下面是要执行的SQL查询并获得结果。

 String sql = "SELECT DESCRIPTION FROM ATWData WHERE SNO = '980098' ";

在Spring框架中,我们有RowMapper和ResultsetExtractor回调接口,最好用它来执行上面提到的SQL查询并获取单个记录。下面的代码使用RowMapper和ResultSetExtractor获取结果。

使用ResultSetExtractor的代码:

  try
        {
            description = jdbcTemplate.query(sql,

            new ResultSetExtractor<String>()
            {
                public String extractData(final ResultSet rs) throws SQLException
                {
                    if (rs.next())
                    {
                        String description = null;
                        description = rs.getString("DESCRIPTION");
                        return description;
                    }
                    return null;
                }
            });
        }
        catch (final DataAccessException e)
        {
            LOG.error("Error " + e);
        }
代码下面的

使用RowMapper来获得结果:

try
     {
       description   = jdbcTemplate2.query(sql,

         new RowMapper<String>()
         {
             public String mapRow(final ResultSet rs, final int rowNum) throws SQLException
             {
                 String description = (String)rs.getString("DESCRIPTION"));
                 return description;
             }
         });
     }
     catch (final DataAccessException e)
     {
         LOG.error("Error " + e);
    }

我已经阅读了有关这些方法的文档,但在我现有的方案中选择了一个方法很困惑。请建议哪个代码(RowMapper / ResultSetExtractor)最适合执行上面给出的简单SQL查询。

2 个答案:

答案 0 :(得分:0)

在你的情况下,要么是好的。 RowMappers旨在将结果集中的行转换为应用程序中的模型。 ResultSetExtractor稍微更通用,允许您完整地对ResultSet进行操作,而不是仅仅对一行进行操作。它只取决于您需要对结果做些什么。在提取单个字符串的情况下,它们都起作用。有关详细信息,另请参阅this question。您的问题可能会被标记为重复。

答案 1 :(得分:0)

不要使用它们。

但首先,更重要的是:

  • 不要使用字符串连接构建SQL语句,除非您希望让自己对SQL Injection攻击持开放态度,允许黑客窃取您的数据和/或损坏或删除您的数据库。< / p>

  • 不要抓住get并继续执行,好像一切都很好。需要让调用者知道查询失败,并且很可能想要回滚任何挂起的事务。

由于您的查询是带参数的单行/单列查询,请使用queryForObject(String sql, Class<T> requiredType, Object... args)

这是你应该做的:

1

如果没有找到行,它将抛出EmptyResultDataAccessException。如果缺少的行不被视为错误,请捕获异常并返回DataAccessException(或Optional.empty())。