【问题标题】:How to assign all the '?' with object's data in JDBC template?如何分配所有的“?”使用 JDBC 模板中的对象数据?
【发布时间】:2017-01-17 08:28:58
【问题描述】:

我是 Spring Boot 新手。

我在spring boot中创建了on方法,请看下面的函数:

public ArrayList<ShipmentDetailsVO> getShipmentStatus(
            ShipmentDetailsVO shpmntpert) {
        return jdbcTemplate.query("select * from SELECT_SEARCH_DETAILS(?,?,?,?,?,?,?,?)",new ResultSetExtractor<ArrayList<ShipmentDetailsVO>>(){ 
            @Override  
               public ArrayList<ShipmentDetailsVO> extractData(ResultSet rs) throws SQLException,  
                       DataAccessException {  
                shipmentDao = new ArrayList<ShipmentDetailsVO>();

                while(rs.next()) {
                     shipmentDetDaoObj =new ShipmentDetailsVO();

                     shipmentDetDaoObj.setContractNumber(rs.getString(1));
                     System.out.println("hello" + rs.getString(1));
                     shipmentDetDaoObj.setOrderNumber(rs.getString(2));
                     System.out.println(rs.getString(2));
                     shipmentDetDaoObj.setShipmentNumber(rs.getString(3));
                     shipmentDetDaoObj.setShipmentControlNo(rs.getString(4));
                     shipmentDetDaoObj.setStatusCode(rs.getString(5));
                     shipmentDetDaoObj.setStatusDateStr(rs.getString(6));


                     shipmentDetDaoObj.setLastUpdatedtStr(rs.getString(7));
                     shipmentDetDaoObj.setResendFlag(false);
                     shipmentDetDaoObj.setSourceSystem(rs.getString(8));
                     shipmentDetDaoObj.setDestinationSystem(rs.getString(9));
                     shipmentDetDaoObj.setRfid(rs.getString(10));
                     shipmentDetDaoObj.setUid(rs.getString(11));
                     shipmentDetDaoObj.setShipmentSeqId(rs.getString(12));

                     shipmentDao.add(shipmentDetDaoObj);
                                  }     
        return shipmentDao;
            }
        });
    }

我不知道如何分配所有的“?”带有对象的(shpmntpert)数据。任何人都可以帮忙。

【问题讨论】:

  • 你搜索过这方面的教程吗?
  • 是的。在教程中提到,如何只绑定一个“?”与对象 []。我需要绑定所有的“?”。

标签: java jdbc spring-boot jdbctemplate


【解决方案1】:

来自JdbcTemplate documentation

你可以找到query的签名之一

public <T> T query(String sql, Object[] args, ResultSetExtractor<T> rse)
        throws DataAccessException

附上有趣参数的解释

sql - 要执行的 SQL 查询

args - 绑定到查询的参数

因此您可以看到该数组用于绑定值。这意味着对于像

这样的查询
select * from table where name = ? and weight= ?

您需要以正确的顺序生成包含这些值的数组

new Object[]{name, weight}

另一个签名显示他们为 PreparedStatement 提供了一些 setter,名为 PreparedStatementSetter

public <T> T query(String sql,
               PreparedStatementSetter pss,
               ResultSetExtractor<T> rse)
        throws DataAccessException

PreparedStatementSetter 接口只有一种方法可以实现

void setValues(PreparedStatement ps)

这将让你在这个 setter 中设置你想要的值。您可以将实例传递给此接口的实现或直接在代码中,如

final MyInstance m = new MyInstance();
jdbcTemplate.query("select * from table where name = ? and weight= ?", 
    new PreparedStatementSetter(){
        @Override
        public void setValues(PreparedStatement ps){
            ps.setString(1, m.getName);
            ps.setInt(2, m.getWeight);
        }
    }, myResultSetExtractor);

注意:这是对文档的快速阅读,因为我知道我从未使用过此 API。但是根据我的阅读,这应该可以正常工作。

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 2011-01-25
    • 2015-02-02
    • 2019-07-24
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多