关于Spring batch的学习之CSV2DB

最近在学习Spring batch相关的内容,网上也有不少Spring Batch相关的知识,不过大多都是使用xml进行配置的。这里是我用注解的方式进行相关的学习心得。

首先我们来看如何将一个文本文件中的内容导入到数据库中。

我们先来看一下我们所需要的环境。我们这里使用的是STS(Spring Tool Suite)当然也可以使用Eclipse(需要有maven插件)或者Myeclipse。我们使用的数据库是MySQl,当然也可以使用其他的数据库,根据自己的需要。

现在开始我们的文件到数据库的学习。

第一步,我们需要创建一个maven的project。然后在我们的项目下会有三个包,这里我们只需要其中的两个,就是main下的两个(java和resources包)。

第二步,我们来配置一下我们的pom文件。

  一、org.springframework.boot

    1、spring-boot-starter-batch

    2、spring-boot-starter-jdbc

    3、spring-boot-starter-jetty

  二、mysql的jdbc驱动包

配置完这些,我们的软件就会自动下载这些包以及相关的依赖包,这需要一点时间。

第三步,我们需要来配置我们的数据库连接的相关信息。

  我们需要在resources包下新建一个properties文件,如下。

1 spring.datasource.driverClassName=com.mysql.jdbc.Driver
2 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
3 spring.datasource.username=root
4 spring.datasource.password=

第四步:由于几天我们学习的是将文件内容读到数据库中,所以,接下来我们需要准备一个文件,这个文件需要时flat类型的,例如txt或者csv等。

1 zhangsan,anhui,1991/02/15,M
2 lisi,shanghai,1992/01/09,F
3 wangwu,wuhan,1990/01/22,M
4 zhaoliu,tianjin,1991/11/11,F
5 zhangkun,huashan,1989/09/20,M
test.csv

第五步,我们需要创建一个entity对象类,如下:

 1 public class User {
 2     private String userId;
 3     private String userName;
 4     private String address;
 5     private Date birth;
 6     private String gender;
 7     
 8     public String getUserId() {
 9         return userId;
10     }
11 
12     public void setUserId(String userId) {
13         this.userId = userId;
14     }
15 
16     public Date getBirth() {
17         return birth;
18     }
19 
20     public void setBirth(Date birth) {
21         this.birth = birth;
22     }
23 
24     public String getGender() {
25         return gender;
26     }
27 
28     public void setGender(String gender) {
29         this.gender = gender;
30     }
31 
32     public String getUserName() {
33         return userName;
34     }
35 
36     public void setUserName(String userName) {
37         this.userName = userName;
38     }
39 
40     public String getAddress() {
41         return address;
42     }
43 
44     public void setAddress(String address) {
45         this.address = address;
46     }
47     
48     public User() {
49 
50     }
51 
52     public User(String userId, String userName, String address ,String gender, Date birth) {
53         this.userId = userId;
54         this.userName = userName;
55         this.address = address;
56         this.gender = gender;
57         this.birth = birth;
58     }
59 
60     @Override
61     public String toString() {
62         return "userId"+ userId +", userName: " + userName + ", address: " + address + ",gender: " + gender + ", birthDay: "+birth;
63     }
64 
65 }

 

第六步,batch是一个用来执行job的框架。所以我们需要来创建一个job,在job里需要配置我们的step,每一个step的完成需要有三个动作,读文件,处理信息,写数据库。代码如下:

 1 @Configuration
 2 @EnableBatchProcessing
 3 public class Configuration {
 4     @Bean
 5     public ItemReader<User> reader() {
 6         FlatFileItemReader<User> reader = new FlatFileItemReader<User>();
 7         reader.setResource(new ClassPathResource("test.csv"));
 8         reader.setLineMapper(new DefaultLineMapper<User>() {{
 9             setLineTokenizer(new DelimitedLineTokenizer() {{
10                 setNames(new String[] { "userName", "address", "birth", "gender" });
11             }});
12             setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{
13                 setTargetType(User.class);
14             }});
15         }});
16         return reader;
17     }
18 
19     @Bean
20     public ItemProcessor<User, User> processor() {
21         return new UserItemProcessor();
22     }
23 
24     @Bean
25     public ItemWriter<User> writer(DataSource dataSource) {
26         JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<User>();
27         writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<User>());
28         writer.setSql("INSERT INTO User (user_name, address,birth,gender) VALUES (:userName, :address, :birth,:gender)");
29         writer.setDataSource(dataSource);
30         return writer;
31     }
32 
33     @Bean
34     public Job CSV2DBJob(JobBuilderFactory jobs, Step s1) {
35         return jobs.get("CSV2DBJob")
36                 .incrementer(new RunIdIncrementer())
37                 .flow(s1)
38                 .end()
39                 .build();
40     }
41 
42     @Bean
43     public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<User> reader,
44             ItemWriter<User> writer, ItemProcessor<User, User> processor) {
45         return stepBuilderFactory.get("step1")
46                 .<User, User> chunk(10)
47                 .reader(reader)
48                 .processor(processor)
49                 .writer(writer)
50                 .build();
51     }
52 
53     @Bean
54     public JdbcTemplate jdbcTemplate(DataSource dataSource) {
55         return new JdbcTemplate(dataSource);
56     }
57 
58 }
Configuration

step中的process需要我们自己来根据自己的实际进行相关的处理,如下

 1 public class UserItemProcessor implements ItemProcessor<User, User> {
 2 
 3     @Override
 4     public User process(final User user) throws Exception {
 5         final String userId = "2014010"+ user.getUserId();
 6         final String gender = user.getGender().equals("M")?"male":"female";
 7         final Date birth = user.getBirth();
 8         final String userName = user.getUserName().substring(0,1).toUpperCase()+user.getUserName().substring(1).toLowerCase();
 9         final String address = user.getAddress().substring(0,1).toUpperCase()+user.getAddress().substring(1).toLowerCase();
10         
11         final User transformedUser = new User(userId,userName, address,gender,birth);
12 
13 
14         return transformedUser;
15     }

一切都好了,我们还需要写一个application类来启动我们的job,具体如下:

1 @ComponentScan
2 @EnableAutoConfiguration
3 public class Application {
4 
5     public static void main(String[] args) {
6         ApplicationContext ctx = SpringApplication.run(Application.class, args);
7     }
8 
9 }

最后,还需要提醒的是,由于我们的batch中的entity没有配置自动建表,所以我们需要自己提前在数据库中创建一个User表或者在我们的resources包下面建一个schema-all.sql文件,在这里写入我们的建表语句就可以了,schema-all是可以直接被Spring batch框架识别的。

1 DROP TABLE  IF EXISTS user;
2 
3 CREATE TABLE user  (
4     user_id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
5     user_name VARCHAR(20),
6     address VARCHAR(20),
7     birth Date,
8     gender varchar(1)
9 );

好了一切到此就结束了,现在启动我们的工程就可以将我们的文件内容导入到我们的数据库中了。

转载于:https://www.cnblogs.com/xincunshannian/p/4032622.html

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

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

相关文章

后台系统可扩展性学习笔记(九)Database Replication

文章目录数据库扩展一致性问题Replication &#xff08;复制&#xff09;异步复制同步复制半同步复制拓扑结构单主结构多主结构无主结构复制具体措施参考数据库扩展 之前在第一章后台系统可扩展性学习笔记&#xff08;一&#xff09;概要谈到&#xff1a;理论上&#xff0c;有…

python中的sum函数.sum(axis=1)

看起来挺简单的样子&#xff0c;但是在给sum函数中加入参数。sum&#xff08;a&#xff0c;axis0&#xff09;或者是.sum(axis1) 就有点不解了 在我实验以后发现 我们平时用的sum应该是默认的axis0 就是普通的相加 而当加入axis1以后就是将一个矩阵的每一行向量相加 例如&…

后台系统可扩展性学习笔记(十)Database Partitioning

为了提升数据库的处理能力&#xff0c;我们把单库扩展成多库&#xff0c;并通过更新同步机制&#xff08;即Replication&#xff09;来保证多份数据的一致性。然而&#xff0c;在 各种复制方案下&#xff0c;每个数据库都持有一份完整数据&#xff0c;基于全量数据提供增删改查…

基于FPGA的HDTV视频图像灰度直方图统计算法设计

随着HDTV的普及&#xff0c;以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期。与传统CRT电视不同的是&#xff0c;这些高清数字电视需要较复杂的视频处理电路来驱动&#xff0c;比如&#xff1a;模数转换&#xff08;A/D Converter&#xff09;、去隔行&#xff08;De-interla…

Java Swing 影楼管理系统之登录功能

开头打广告&#xff0c;Java1234.com。 首先&#xff0c;来个效果图。 关键代码 1&#xff0c;界面层 private void Jb_DengLuActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:String UserName this.Jb_UserNameTxt.getText();String …

Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?

【电脑软件管理中Bdsyn手机助手的问题】Bdsyn手机助手 is developed by Baidu, Inc. and is used by 10 users of Software Informer. 并不是本人安装的&#xff08;应该是自己自己主动安装的&#xff09;&#xff0c;卸载以后过几天又会出如今软件列表里。百度搜索却无法搜索出…

后台系统可扩展性学习笔记(十二)NoSQL

文章目录NoSQL定义NoSQL种类键值存储文档存储宽列存储图形数据库NoSQL 意味着什么ACID vs. BASESQL or NoSQLNoSQL定义 不同于关系型数据库&#xff0c;NoSQL 数据库&#xff08;也叫非 SQL 或非关系型数据库&#xff09;提供的数据存储、检索机制并不是基于表关系建模的。没有…

后台系统可扩展性学习笔记(十三)缓存

文章目录在哪儿加缓存缓存什么内容缓存原始查库结果缓存数据对象怎么查询缓存结果预留缓存模式直读模式直写模式回写式缓存绕写式缓存提前刷新模式缓存满了如何处理参考读写分离、分库分表、反范式化、采用 NoSQL……如果这些扩展手段全都上了&#xff0c;数据响应依旧越来越慢…

后台系统可扩展性学习笔记(十四)异步机制与MQ

对于 Web 服务而言&#xff0c;提升可扩展性的主要途径是将耗时的同步工作改成异步处理&#xff0c;从而允许将这些工作“外包”给多个 Worker 去做&#xff0c;或者提前完成能够预知的部分。 异步机制与可扩展性之间的关系需要从&#xff08;异步&#xff09;并行处理的优势说…

光标闪烁问题的解决办法

在调用Windows API函数SetCursor设置光标时&#xff0c;可能会碰到闪烁的问题&#xff1a;移动鼠标&#xff0c;光标在Class Cursor(即注册窗口类时指定的Cursor)与预设Cursor之间闪烁。 在MSDN上有关SetCursor函数的备注中强调&#xff0c;如果Class Cursor非空&#xff0c;那…

视频编解码基础

文章目录前戏编解码技术流程主流视频编码标准视频传输面临的问题视频传输差错控制视频传输Qos质量保证参数人类视觉系统HVS 以及相应编码措施正餐编码层次与码流结构PB帧编码IBBP序列编码结构图像编码结构条带编码结构宏块编码结构块编码结构预测技术码率控制实例H264前戏 编解…

实时语音通讯丢包补偿技术

文章目录基于发送端丢包补偿技术原理与媒体无关的前向差错纠正媒体相关前向差错纠正交织技术基于接受端丢包补偿技术基于插入方法基于插值方法基于重构的方法应用建议非交互式交互式拓展阅读参考丢包补偿技术可以分为两类&#xff1a;基于发送端补偿、基于接受端补偿 基于发送…

关于并发概念的一些笔记

目录1、基于锁的并发数据结构1、并发计数器2、懒惰计数器3、并发链表4、并发队列5、并发散列表总结2、条件变量使用&#xff08;POSIX&#xff09;生产者/消费者 &#xff08;有界缓冲区问题&#xff09;覆盖条件扩展3、信号量使用二值信号量&#xff08;锁&#xff09;0值信号…

对于线程并发模型与事件并发模型的思考

这里将以对话的形式进行&#xff1a; A&#xff1a; 普通的线程是可以被其他线程中断掉的&#xff0c;而基于select、epoll的事件处理函数实际上是不可以被其他事件&#xff08;线程&#xff09;中断的。 我这个理解对吗&#xff1f; B&#xff1a; 图片里的应该是对是否…

Ubuntu 14.10 -- 异次元软件世界

Ubuntu 14.10 中文桌面版/服务器正式版下载 - 华丽免费易于入门的 Linux 操作系统 [ 系统工具 - Linux // 2014-10-25 ]一说到 Linux&#xff0c;就不得不提目前最红火的 Ubuntu 发行版了&#xff01;它拥有绚丽的界面&#xff0c;甚至跟以时尚为卖点的 Mac OSX 相比也有过之而…

System Design笔记:在线售票系统设计

文章目录何为在线售票系统&#xff1f;系统目标和要求1、功能要求2、非功能性需求3、设计注意事项4、容量估算5、系统API1.SearchMovies2.ReserveSeats6、数据库设计7、高级设计8、细节模块设计9、流程服务器如何跟踪所有尚未预订的active预订&#xff1f;服务器如何跟踪所有等…

流媒体协议初探(MPEG2-TS、RTSP、RTP、RTCP、SDP、RTMP、HLS、HDS、HSS、MPEG-DASH)

目录一、综述需求分析协议定制二、MPEG2-TS协议三、RTSP协议、RTP、RTCP、SDPRTSPRTP、RTCP、SDP四、RTMP五、HLS、HDS、HSSHLSHDS和HSS六、MPEG-DASH协议具体内容应用七、流媒体服务器流媒体服务器的功能与挑战客户端支持协议支持应用场景应用特点扩展技术广告投放录屏其他一、…

eclipse偶尔会反映迟钝,直接无视其报错

比如&#xff0c;你在web.xml中配置了什么东西&#xff0c;在有的时候不一定就会立即被eclipse察觉到&#xff0c;即便你的配置正确了&#xff0c;甚至重启了几次服务器&#xff0c;它仍然给你报错 比如说&#xff0c;刚才我在web.xml中配置了一个taglib&#xff0c;并且tld文件…

Qos(Quality of Service)

QOS&#xff08;即Quality of Service&#xff0c;服务质量&#xff09;主要指网络环境下服务满足用户的程度&#xff0c;在视频服务的语境下也可认为是Quality of Streaming&#xff0c;即流媒体服务的质量。通常&#xff0c;QOS可以由一系列指标表达&#xff0c;如传输的速度…

Popline:帅气的浮动 HTML5 文本编辑器工具栏

Popline 是一个基于 HTML5 实现的富文本编辑器工具栏&#xff0c;设计灵感来自 PopClip &#xff0c;相比传统的文本编辑器工具&#xff0c;Popline 能够浮动在编辑的文本周围&#xff0c;操作起来十分方便。 您可能感兴趣的相关文章Metronic – 基于 Bootstrap 响应式后台管理…