關于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.pswp.cn/news/376574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376574.shtml
英文地址,請注明出處:http://en.pswp.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…

后臺系統可擴展性學習筆記(十一)Database Denormalization

之前的兩篇筆記中談到了從單庫擴展到多庫以承載更多的請求量以及單庫&#xff08;表&#xff09;拆分成多庫&#xff08;表&#xff09;&#xff0c;打破單庫的性能瓶頸。 這都是為了應對大數據量下的措施。 然而&#xff0c;除卻數據量外&#xff0c;還有一個極其影響單庫性能…

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;提供的數據存儲、檢索機制并不是基于表關系建模的。沒有…

android2.2應用開發之IccCard(sim卡或USIM卡)

tyle"margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51,51)"> 如果要做android通訊錄的聯系人的機卡混排顯示&#xff0c;由于手機卡類型的不同&#xff0c;導致手機卡存儲容量以及可以存儲信息不同&#xff0c;就要涉…

后臺系統可擴展性學習筆記(十三)緩存

文章目錄在哪兒加緩存緩存什么內容緩存原始查庫結果緩存數據對象怎么查詢緩存結果預留緩存模式直讀模式直寫模式回寫式緩存繞寫式緩存提前刷新模式緩存滿了如何處理參考讀寫分離、分庫分表、反范式化、采用 NoSQL……如果這些擴展手段全都上了&#xff0c;數據響應依舊越來越慢…

[linux]gdb調試

使用gdb可以在命令行方便地調試&#xff0c;并且能以命令程序的方式調試源代碼。 常用命令簡寫print-p,step-s,next-n 進入gdb //方式一 gdb test//test 為可執行文件&#xff0c;使用-g編譯得到 //方式二 gdb -q //不顯示版權信息 file test //file命令打開文件 退出gdb quit …

后臺系統可擴展性學習筆記(十四)異步機制與MQ

對于 Web 服務而言&#xff0c;提升可擴展性的主要途徑是將耗時的同步工作改成異步處理&#xff0c;從而允許將這些工作“外包”給多個 Worker 去做&#xff0c;或者提前完成能夠預知的部分。 異步機制與可擴展性之間的關系需要從&#xff08;異步&#xff09;并行處理的優勢說…

RegisterClientScriptBlock與 RegisterStartupScript區別

Page.ClientScript.RegisterClientScriptBlock而用Page.ClientScript.RegisterStartupScript是因為&#xff1a;RegisterStartupScript 把script放置在ASP.NET page的底部&#xff0c;而RegisterClientScriptBlock把script放置在ASP.NET page的頂部&#xff0c;用RegisterClien…

【Web后端筆記】SQL Server與java數據類型對應

編號數據庫類型JDBC類型JDBC索引描述1intjava.lang.Integer4 2varcharjava.lang.String12 3charjava.lang.String1 4ncharjava.lang.String1 5nvarcharjava.lang.String12 6textjava.lang.String-1 7ntextjava.lang.String-1 8tinyintjava.lang.Integer-6 9intjava.lang.Intege…

后臺系統可擴展性學習筆記

整理了一下筆記目錄&#xff0c;將以前學習的一些知識串聯起來了&#xff0c;比如cdn、負載均衡、中間件&#xff0c;以前只是各自了解了一點&#xff0c;現在大概理清了后臺系統設計中他們各自的作用。 后臺系統可擴展性學習筆記&#xff08;一&#xff09;概要 后臺系統可擴展…

TFS 強制刪除鎖定文件(數據庫)

TFS&#xff1a;TFS2010 VS&#xff1a;VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我們在團隊開發當中&#xff0c;版本控制是一個不可忽略的工具。我們團隊使用的是TFS2010這個版本控制器。 但在團隊實際協作開發當中&#xff0c;團隊成員難免有電腦損壞或人員離職情況&…

【轉】Java:String、StringBuffer和StringBuilder的區別

1 String String&#xff1a;字符串常量&#xff0c;字符串長度不可變。Java中String是immutable&#xff08;不可變&#xff09;的。 String類的包含如下定義&#xff1a; [java]view plaincopy /** The value is used for character storage. */ private final char value[]…

Linux中exit與_exit的區別

在exit,_exit的區別 - exit()與_exit()函數的區別&#xff08;Linux系統中&#xff09;2012-03-20 15:19:53 分類&#xff1a; LINUX 注&#xff1a;exit()就是退出&#xff0c;傳入的參數是程序退出時的狀態碼&#xff0c;0表示正常退出&#xff0c;其他表示非正常退出&…

光標閃爍問題的解決辦法

在調用Windows API函數SetCursor設置光標時&#xff0c;可能會碰到閃爍的問題&#xff1a;移動鼠標&#xff0c;光標在Class Cursor(即注冊窗口類時指定的Cursor)與預設Cursor之間閃爍。 在MSDN上有關SetCursor函數的備注中強調&#xff0c;如果Class Cursor非空&#xff0c;那…

視頻編解碼基礎

文章目錄前戲編解碼技術流程主流視頻編碼標準視頻傳輸面臨的問題視頻傳輸差錯控制視頻傳輸Qos質量保證參數人類視覺系統HVS 以及相應編碼措施正餐編碼層次與碼流結構PB幀編碼IBBP序列編碼結構圖像編碼結構條帶編碼結構宏塊編碼結構塊編碼結構預測技術碼率控制實例H264前戲 編解…