您如何映射Spring存储过程执行的输出?

时间:2019-01-16 06:11:14

标签: spring stored-procedures

我正在使用Spring和存储过程从mySQL数据库检索数据。我的存储过程和参数工作正常,但是在映射结果集时遇到问题。目前,我有一些真正丑陋的代码来获取值,而且我相信必须有一种更好,更清洁和更优雅的方式。谁能指导我找到更好的解决方案?

在存储过程类之后,我有:

List<String> outList = new ArrayList<String>();

Map<String,Object> outMap = execute(parameters_map);

List list = (List) outMap.get("#result-set-1");

for (Object object : list) {
    Map map2 = (Map) object;
    list.add(map2.get("runname"));  
}

return outList;

runname是数据库查询中的列。

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

spring docs中使用RowMapper的示例:

public class JdbcActorDao implements ActorDao {

private SimpleJdbcCall procReadAllActors;

public void setDataSource(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.procReadAllActors = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("read_all_actors")
            .returningResultSet("actors",
            BeanPropertyRowMapper.newInstance(Actor.class));
}

public List getActorsList() {
    Map m = procReadAllActors.execute(new HashMap<String, Object>(0));
    return (List) m.get("actors");
}

// ... additional methods

}

答案 1 :(得分:0)

花了一些时间来解释Spring文档,但我终于到了。 我的解决方案:

    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
                                                      .withProcedureName("DistinctRunNames")
                     .withoutProcedureColumnMetaDataAccess();
    simpleJdbcCall.addDeclaredParameter(new SqlParameter("environment", Types.VARCHAR));
    simpleJdbcCall.addDeclaredParameter(new SqlParameter("username", Types.VARCHAR));
    simpleJdbcCall.addDeclaredParameter(new SqlParameter("test_suite", Types.VARCHAR));
   SqlParameterSource parameters = new MapSqlParameterSource().addValue("environment", environment)
                                                    .addValue("username", username).addValue("test_suite", testSuite);
    Map map = simpleJdbcCall.returningResultSet("runnames", new ParameterizedRowMapper<RunNameBean>() {
           public RunNameBean mapRow(ResultSet rs, int rowNum) throws SQLException {
                  RunNameBean runNameBean = new RunNameBean();
       runNameBean.setName(rs.getString("runname"));
       return runNameBean;
       }
          }).execute(parameters);
    return (List) map.get("runnames");

预期参数相对于实际存在问题,必须分解simpleJdbcCall对象。将结果精美地映射到列表中。 感谢您的回答,帮助我学习了Spring映射。