此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

出站通道适配器与入站通道适配器相反:它的作用是处理消息并使用它来执行 SQL 查询。 默认情况下,消息负载和标头可用作查询的输入参数,如以下示例所示:Spring中文文档

<int-jdbc:outbound-channel-adapter
    query="insert into items (id, status, name) values (:headers[id], 0, :payload[something])"
    data-source="dataSource"
    channel="input"/>

在前面的示例中,到达标记为通道的消息具有键为 的映射的有效负载,因此运算符从映射中取消引用该值。 标题也可作为地图访问。inputsomething[]Spring中文文档

前面查询中的参数是传入消息的 Bean 属性表达式(而不是 SpEL 表达式)。 此行为是 的一部分,该源是由出站适配器创建的默认源。 您可以注入不同的行为来获得不同的行为。SqlParameterSourceSqlParameterSourceFactory

出站适配器需要对 a 或 . 还可以注入 a 来控制每个传入消息与查询的绑定。DataSourceJdbcTemplateSqlParameterSourceFactorySpring中文文档

如果输入通道是直接通道,则出站适配器将在同一线程中运行其查询,因此,与消息发送方运行相同的事务(如果有)。Spring中文文档

前面查询中的参数是传入消息的 Bean 属性表达式(而不是 SpEL 表达式)。 此行为是 的一部分,该源是由出站适配器创建的默认源。 您可以注入不同的行为来获得不同的行为。SqlParameterSourceSqlParameterSourceFactory

使用 SpEL 表达式传递参数

大多数 JDBC 通道适配器的常见要求是将参数作为 SQL 查询或存储过程或函数的一部分传递。 如前所述,这些参数缺省是 Bean 属性表达式,而不是 SpEL 表达式。 但是,如果需要将 SpEL 表达式作为参数传递,则必须显式注入 .SqlParameterSourceFactorySpring中文文档

以下示例使用 a 来实现该要求:ExpressionEvaluatingSqlParameterSourceFactorySpring中文文档

<jdbc:outbound-channel-adapter data-source="dataSource" channel="input"
    query="insert into MESSAGES (MESSAGE_ID,PAYLOAD,CREATED_DATE) values (:id, :payload, :createdDate)"
    sql-parameter-source-factory="spelSource"/>

<bean id="spelSource"
      class="o.s.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
    <property name="parameterExpressions">
        <map>
            <entry key="id"          value="headers['id'].toString()"/>
            <entry key="createdDate" value="new java.util.Date()"/>
            <entry key="payload"     value="payload"/>
        </map>
    </property>
</bean>

有关详细信息,请参阅定义参数源Spring中文文档

使用回调PreparedStatement

有时,它的灵活性和松耦合并不能满足目标的需求,或者我们需要做一些低级的JDBC工作。 Spring JDBC 模块提供了用于配置执行环境(如 or )和操作参数值(如 )的 API。 它甚至可以访问用于低级操作的 API,例如 .SqlParameterSourceFactoryPreparedStatementConnectionCallbackPreparedStatementCreatorSqlParameterSourceStatementCallbackSpring中文文档

从 Spring Integration 4.2 开始,允许在上下文中手动指定参数。 此类的作用与标准 Spring JDBC API 中的角色完全相同。 实际上,当 在 .MessagePreparedStatementSetterPreparedStatementrequestMessagePreparedStatementSetterPreparedStatementSetterJdbcMessageHandlerexecuteJdbcTemplateSpring中文文档

此功能接口选项与 互斥,可以用作更强大的替代方法,以填充 from 的参数。 例如,当我们需要以流式处理方式将数据存储到 DataBase 列时,它非常有用。 以下示例演示如何执行此操作:sqlParameterSourceFactoryPreparedStatementrequestMessageFileBLOBSpring中文文档

@Bean
@ServiceActivator(inputChannel = "storeFileChannel")
public MessageHandler jdbcMessageHandler(DataSource dataSource) {
    JdbcMessageHandler jdbcMessageHandler = new JdbcMessageHandler(dataSource,
            "INSERT INTO imagedb (image_name, content, description) VALUES (?, ?, ?)");
    jdbcMessageHandler.setPreparedStatementSetter((ps, m) -> {
        ps.setString(1, m.getHeaders().get(FileHeaders.FILENAME));
        try (FileInputStream inputStream = new FileInputStream((File) m.getPayload()); ) {
            ps.setBlob(2, inputStream);
        }
        catch (Exception e) {
            throw new MessageHandlingException(m, e);
        }
        ps.setClob(3, new StringReader(m.getHeaders().get("description", String.class)));
    });
    return jdbcMessageHandler;
}

从 XML 配置的角度来看,该属性在组件上可用。 它允许您指定 Bean 引用。prepared-statement-setter<int-jdbc:outbound-channel-adapter>MessagePreparedStatementSetterSpring中文文档

批量更新

从版本 5.1 开始,如果请求消息的有效负载是实例,则执行 。 如果 a 元素还不是 a,则 的每个元素都与请求消息中的标头一起包装成 a。 在基于常规的配置的情况下,这些消息用于构建上述函数中使用的 for 参数。 应用配置时,将使用变体来循环访问每个项的这些消息,并针对它们调用提供的消息。 选择模式时不支持批量更新。JdbcMessageHandlerJdbcOperations.batchUpdate()IterableIterableMessageMessageSqlParameterSourceFactorySqlParameterSource[]JdbcOperations.batchUpdate()MessagePreparedStatementSetterBatchPreparedStatementSetterMessagePreparedStatementSetterkeysGeneratedSpring中文文档