首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RowMapper/ResultsetExtractor (春季)

RowMapper/ResultsetExtractor (春季)
EN

Stack Overflow用户
提问于 2016-09-25 20:21:38
回答 2查看 2K关注 0票数 0

我正在编写spring框架,下面是执行和获取结果的SQL查询。

代码语言:javascript
复制
 String sql = "SELECT DESCRIPTION FROM ATWData WHERE SNO = '980098' ";

在spring框架中,我们有RowMapper和ResultsetExtractor回调接口,其中一个最适合用于执行上述SQL查询并获取单个记录。下面的代码使用RowMapper和ResultSetExtractor获得结果。

使用:ResultSetExtractor:的代码

代码语言:javascript
复制
  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来获得结果:

代码语言:javascript
复制
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查询。

EN

回答 2

Stack Overflow用户

发布于 2016-09-25 20:26:35

在你的情况下,两者都可以。RowMappers旨在将结果集中的一行转换为应用程序中的模型。ResultSetExtractor稍微通用一些,它允许您对整个ResultSet进行操作,而不仅仅是在一行上操作。这仅仅取决于你需要对结果做些什么。在提取单个字符串的情况下,它们都可以工作。有关更多信息,请参见这个问题。你的问题可能被标记为复本。

票数 2
EN

Stack Overflow用户

发布于 2016-09-25 21:02:57

也不要用。

但首先,也是更重要的是:

  • 不要使用字符串连接构建SQL语句,除非您想让自己面对SQL注入攻击,允许黑客窃取您的数据和/或损坏或删除您的数据库。
  • 不要捕获DataAccessException,继续执行,就好像一切都很好一样。需要让调用方知道查询失败,并且很可能希望回滚任何挂起的事务。

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

这就是你应该做的:

代码语言:javascript
复制
String sno = "980098";
String sql = "SELECT DESCRIPTION FROM ATWData WHERE SNO = ?";
String description = jdbcTemplate2.queryForObject(sql, String.class, sno);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39691459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档