如何分配所有的“?”使用 JDBC 模板中的对象数据?

Posted

技术标签:

【中文标题】如何分配所有的“?”使用 JDBC 模板中的对象数据?【英文标题】:How to assign all the '?' with object's data in JDBC template? 【发布时间】: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)数据。任何人都可以帮忙。

【问题讨论】:

你搜索过这方面的教程吗? 是的。在教程中提到,如何只绑定一个“?”与对象 []。我需要绑定所有的“?”。 【参考方案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。但是根据我的阅读,这应该可以正常工作。

【讨论】:

以上是关于如何分配所有的“?”使用 JDBC 模板中的对象数据?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 CRTP 模板中的复制分配

如何使用 JDBC 模板更新字符变化数组

spring框架总结(04)----介绍的是Spring中的JDBC模板

Spring jdbc模板连接在读取clob对象时关闭异常

如何调试/记录 Tomcat JDBC 连接池的连接?

day39-Spring 12-Spring的JDBC模板:快速入门