Spring Integration Jdbc 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/integrationhttp://www.springframework.org/schema/integration/spring-integration.xsdhttp://www.springframework.org/schema/integration/jdbchttp://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsdhttp://www.springframework.org/schema/jdbchttp://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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bash脚本教程之数组

目录 创建数组 读取数组 读取单个元素 读取所有成员 默认位置 数组的长度 提取数组序号 提取数组成员

php分页上一页下一页判断,分页(上一页,下一页)

实现功能&#xff1a;出现首页&#xff0c;下一页&#xff0c;上一页&#xff0c;尾页$pagesize2;//分页&#xff0c;已知每页显示几条记录&#xff0c;$pagesize//我们通过在地址栏传递page参数的形式获得当前是第几页&#xff0c;&#xff1f;page1就是第一页&#xff0c;&am…

变量和字符串

变量名就像我们现实社会的名字&#xff0c;把一个值赋值给一个名字时&#xff0c;Ta会存储在内存中&#xff0c;称之为变量&#xff08;variable)&#xff0c;在大多数语言中&#xff0c;都把这种动作称为&#xff08;给变量赋值&#xff09;或&#xff08;把值存储在变量中&am…

Windows安全配置加固

安全配置加固——账号口令 账号优化 目的是为了梳理系统中的账号以及口令&#xff0c;避免默认账号及弱口令的存在 查看账号方式 在Windows中查看账号的方式有以下几种&#xff0c;这里就来简述一下 第一种&#xff1a;开始->运行->compmgmt.msc&#xff08;进入计算…

Bash脚本教程之set命令

目录 简介 set -u set -x Bash 的错误处理 set -e set -o pipefail 其他参数 set 命令总结 shopt 命令 set命令是 Bash 脚本的重要环节,却常常被忽视,导致

php游客随机代码,php生成随机码的一段代码

/** 说明&#xff1a;生成随机码&#xff0c;并用图形方式显示随机码。*/$ViewRandomCode mt_rand(1000,10000);session_start();$_SESSION[checksum] $ViewRandomCode;function set_4pixel($r, $g, $b, $x, $y){global $sx, $sy, $pixels;$ofs 3 * ($sx * $y $x);$pixels[…

刚刚接触的LINQ

科普一下&#xff1a; 语言集成查询&#xff08;Language INtegrated Query&#xff0c;LINQ&#xff09; 是一项微软技术&#xff0c;新增一种自然查询的SQL语法到.NET Framework的编程语言中&#xff0c;可支持Visual Basic .NET以及C#语言。 LINQ定义了大约40个查询操作符&a…

解决Pycharm窗口一闪而过的问题

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入

存根类 测试代码 java_常规单元测试和存根–测​​试技术4

存根类 测试代码 java我的上一个博客是有关测试代码的方法以及讨论您做什么和不必进行测试的方法的一系列博客中的第三篇。 它基于我使用一种非常常见的模式从数据库检索地址的简单方案&#xff1a; …并且我提出了这样的想法&#xff0c;即任何不包含任何逻辑的类实际上都不需…

Bash脚本教程之脚本除错

目录 常见错误 bash的-x参数 环境变量 LINENO FUNCNAME BASH_SOURCE BASH_LINENO 常见错误 编写 Shell 脚本的时候,一定要考虑到命令失败的情况,否则很容易出错。 #! /bin/bashdir_name=/path/not/existcd $dir_name rm * 上面脚本中,如果目录

config.class.php,Config.class.php

defined(IN_MY_PHP) || die(0);/*** 配置文件&#xff0c;内容如下* return [* jfzt>[* // 方式一(推荐)* [val>0, label>xxx0, style>txt-danger],* [val>1, label>xxx1, style>txt-success],* // 方式二(简化&#xff0c;不支持样式)* 0>xxx0,* 1>…

Python学习手册

目录 基础语法 模块的使用 Python案例 基础语法 PyCharm调试程序python手动安装依赖包python中让输出不换行Python中的输入(input)和输出打印python中实现打印特定字符变换Python中的变量和数据类型Python中的列表ListPython中的字典dictPython中数据的排序Python中数据类型的转…

Bash脚本教程之mktemp 命令,trap 命令

目录 临时文件的安全问题 mktemp 命令的用法 mktemp 命令的参数 trap 命令 Bash 脚本有时需要创建临时文件或临时目录。常见的做法是,在/tmp目录里面创建文件或目录,这样做有很多弊端,使用mktemp命令是最安全的做法。 临时文件的安全问题 直接创建临时文件,尤其在/tm…

ubuntu vim php配置文件在哪,ubuntu vim的配置文件在哪

当我们使用Vim时, 你需要知道一系列的配置文件. 这些配置文件的位置依赖于Vim的安装位置和你所使用的操作系统.通常, 有三个配置文件, 你是必须知道在哪里能找到的.vimrc这是Vim最主要的配置文件. 它有两个版本, 全局版本(global)和用户版本(personal)).全局vimrc文件放在你安装…

使用 Python 爬取网页数据

在需要过去一些网页上的信息的时候&#xff0c;使用 Python 写爬虫来爬取十分方便。 1. 使用 urllib.request 获取网页 urllib 是 Python 內建的 HTTP 库, 使用 urllib 可以只需要很简单的步骤就能高效采集数据; 配合 Beautiful 等 HTML 解析库, 可以编写出用于采集网络数据的…

Bash脚本教程之启动环境

目录 Session 登录 Session 非登录 Session .bash_logout 启动选项 键盘绑定 Session 用户每次使用 Shell,都会开启一个与 Shell 的 Session(对话)。 Session 有两种类型:登录 Session 和非登录 Session,也可以叫做 login shell 和 non-login shell。 登录 Session…

多线程(初级篇)

相关概念进程是指一个内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程。一个进程是一个独立的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了…

了解ADF生命周期中的ADF绑定

在本文中&#xff0c;我将重点介绍ADF绑定层&#xff0c;并探讨当最初从浏览器请求带有某些数据的ADF页面时&#xff0c;它如何工作。 Oracle ADF提供了自己的JSF生命周期扩展版。 实际上&#xff0c;ADF扩展了标准JSF生命周期实现类&#xff0c;并提供了ADF阶段侦听器&#x…

绕过 WAF:绕过一些 WAF 设备的 Burp 插件

我写了这个插件使用的技术博客文章在这里一会儿回来。如果存在特定标头&#xff0c;许多 WAF 设备可能会被诱骗相信请求来自自身&#xff0c;因此是可信的。绕过方法的基础知识可以在此处的 HP 博客文章中找到。 一段时间以来&#xff0c;我一直在 Burp 中实施匹配/替换规则&…

Bash脚本教程之命令提示符

目录 环境变量 PS1 颜色 环境变量 PS2,PS3,PS4 用户进入 Bash 以后,Bash 会显示一个命令提示符,用来提示用户在该位置后面输入命令。 环境变量 PS1 命令提示符通常是美元符号$,对于根用户则是井号#。这个符号是环境变量PS1决定的,执行下面的命令,可以看到当前命令提…