rowmapper_Spring Integration Jdbc RowMapper示例

rowmapper

rowmapper

JDBC入站通道适配器的基本功能是执行SQL查询,提取数据并将以Message形式封装的结果集传递到本地通道。 您可以在JDBC入站通道适配器的示例中阅读有关此内容的更多信息。

有效负载的类型由行映射策略决定。 默认结果是产生类型为List的有效负载,其中每个元素都是列值的Map。 在上一篇有关Jdbc入站适配器的文章中,我们使用了默认的行映射策略,这就是为什么消息包含映射值列表作为有效负载的原因。 列值将作为Map返回,列名为键值。

在本文中,我们将看到如何自定义映射策略,以便有效负载是POJO的列表。 我们还将学习如何处理JDBC消息以及使用transactional元素。

在开始示例之前,首先将模块依赖项添加到pom.xml

依存关系

添加以下依赖项:

  1. spring-core
  2. spring-context
  3. spring-integration-core
  4. spring-integration-jdbc –返回此值以访问jdbc适配器
  5. mysql-connector-java –我们将使用MySQL作为数据库,因此您需要添加MySql驱动程序

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.javarticles.spring.integration.jms</groupId>
	<artifactId>springintegrationjms</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.integration</groupId>
			<artifactId>spring-integration-core</artifactId>
			<version>4.1.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.integration</groupId>
			<artifactId>spring-integration-jdbc</artifactId>
			<version>4.1.2.RELEASE</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.26</version>
		</dependency>		
	</dependencies>

	<properties>
		<spring.version>4.1.4.RELEASE</spring.version>
	</properties>

</project>

自定义行映射器

文章:

package com.javarticles.spring.integration.jdbc;

public class Article {
    private int id;
    private String name;
    private String tags;
    private String category;
    private String author;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTags() {
        return tags;
    }

    public void setTags(String tags) {
        this.tags = tags;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder("id: ");
        sb.append(id).append(", name: ").append(name).append(", tags: ")
                .append(tags).append(", category: ").append(category)
                .append(", author").append(author);
        return sb.toString();
    }
}

我们将通过实现org.springframework.jdbc.core.RowMapper接口并通过row-mapper属性引用此类来定制有效负载对象。

ArticleRowMapper:

package com.javarticles.spring.integration.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class ArticleRowMapper implements RowMapper<Article> {

    public Article mapRow(ResultSet rs, int rowNum) throws SQLException {
        String name = rs.getString("name");
        String category = rs.getString("category");
        String author = rs.getString("author");
        String tags = rs.getString("tags");
        int id = rs.getInt("id");
        Article article = new Article();
        article.setId(id);
        article.setCategory(category);
        article.setAuthor(author);
        article.setName(name);
        article.setTags(tags);
        return article;
    }
}

这是架构和一些测试数据:

db-schema.sql:

drop table if exists `articles`;
CREATE TABLE `articles` (
  `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `NAME` VARCHAR(100) NOT NULL,
  `CATEGORY` VARCHAR(50) NOT NULL,
  `TAGS` VARCHAR(100) NOT NULL,
  `AUTHOR` VARCHAR(50) NOT NULL,
  `SENT` INT,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

db-test-data.sql:

insert into articles(id, name, category, tags, author, sent) values (1, "SpringIntegration Example", "spring", "spring,integration", "Joe", 0);
insert into articles(id, name, category, tags, author, sent) values (2, "NamedParameterJdbcTemplate Example", "spring", "spring,jdbcTemplate", "Sam", 0);
insert into articles(id, name, category, tags, author, sent) values (3, "MVC Example", "spring", "spring", "Joe", 0);

我们还将在这里介绍交易概念。 提取文章后,我们希望将“已发送”列更新为1,以便已阅读的文章不会在下一次轮询中显示。

我们将简单地将tansactional元素添加到poller元素。 这将导致更新和选择查询在同一事务中运行。 由于我们依赖交易,因此我们需要配置交易管理器。

我们引入的另一件事是服务适配器,以防您想处理JDBC消息。

JdbcMessageHandler:

package com.javarticles.spring.integration.jdbc;

import java.util.List;

public class JdbcMessageHandler {
    public void handleMessage(List<Article> articleList) {
        System.out.println("In JdbcMessageHandler:" + articleList);
    }
}

让我们看看我们的配置。

jdbcInboundApplicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/integration
			http://www.springframework.org/schema/integration/spring-integration.xsd
			http://www.springframework.org/schema/integration/jdbc
			http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsd
			http://www.springframework.org/schema/jdbc
			http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">

	<int-jdbc:inbound-channel-adapter id="dataChannel"
		query="select * from articles where author='Joe' and sent = 0" 
		update="update articles set sent = 1 where id in (:id)"
		data-source="dataSource" row-mapper="articleRowMapper">
		<int:poller fixed-rate="100">
			<int:transactional />
		</int:poller>
	</int-jdbc:inbound-channel-adapter>

	<int:service-activator input-channel="dataChannel" ref="jdbcMessageHandler" />
	
	<bean id="jdbcMessageHandler"
		class="com.javarticles.spring.integration.jdbc.JdbcMessageHandler" />

	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<int:poller default="true" fixed-rate="100" />

	<int:channel id="dataChannel">
		<int:queue />
	</int:channel>

	<jdbc:initialize-database data-source="dataSource"
		enabled="true">
		<jdbc:script location="classpath:db-schema.sql" />
		<jdbc:script location="classpath:db-test-data.sql" />
	</jdbc:initialize-database>

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost/test" />
		<property name="username" value="root" />
		<property name="password" value="mnrpass" />
	</bean>

	<bean id="articleRowMapper"
		class="com.javarticles.spring.integration.jdbc.ArticleRowMapper" />
</beans>

我们的主类看起来很简单,我们只需要加载上下文即可启动轮询。

SpringIntegrationJdbcInboundRowMapper示例:

package com.javarticles.spring.integration.jdbc;

import java.io.IOException;
import java.sql.SQLException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringIntegrationJdbcInboundRowMapperExample {

    public static void main(String[] args) throws InterruptedException, IOException, SQLException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "jdbcInboundApplicationContext.xml");
        Thread.sleep(1000);
        context.close();
    }
    
}

输出:

In JdbcMessageHandler:[id: 1, name: SpringIntegration Example, tags: spring,integration, category: spring, authorJoe, sent: 0, id: 3, name: MVC Example, tags: spring, category: spring, authorJoe, sent: 0]

下载源代码

这是有关带有RowMapper的Jdbc入站适配器的示例。 您可以在此处下载源代码: springintegrationJdbcRowMapper.zip

翻译自: https://www.javacodegeeks.com/2015/05/spring-integration-jdbc-rowmapper-example.html

rowmapper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值