├── README.md
├── bak
└── TransferDefinitions.xml
├── pom.xml
└── src
└── main
├── java
└── com
│ └── xtonic
│ ├── config
│ ├── Config.java
│ ├── DataSourceDeifiniton.java
│ ├── ErrorMsg.java
│ ├── SrcData.java
│ ├── TableChanges.java
│ ├── TransferTableDefiniton.java
│ └── TypeHandlerDefinition.java
│ ├── container
│ ├── DefaultErrorLogComsumer.java
│ ├── EorrorDataLogConsumer.java
│ ├── ErrorMsgProvider.java
│ ├── Main.java
│ └── Runcontainer.java
│ ├── context
│ ├── AbstarctTransferContext.java
│ ├── AbstractRegistFactory.java
│ ├── RegistConfig.java
│ ├── RegistDataSourceFacotroy.java
│ ├── RegistTableDefinitionFactory.java
│ ├── RegistTypeHandlerFactory.java
│ ├── RegisterFactory.java
│ ├── TransferContext.java
│ └── impl
│ │ ├── BaseTrnasferContext.java
│ │ └── TrnasferAppContext.java
│ ├── dataSource
│ ├── AbstractTransferDataSource.java
│ ├── DefaultTransferDataSource.java
│ └── TransferDataSource.java
│ ├── entity
│ ├── Test_Table_1.java
│ ├── Test_Table_2.java
│ ├── Test_Table_3.java
│ ├── Test_Table_4.java
│ ├── Test_Table_5.java
│ ├── Test_Table_6.java
│ └── User.java
│ ├── exception
│ └── GetTotalCountException.java
│ ├── resources
│ ├── ClassPathResource.java
│ └── Resource.java
│ ├── task
│ ├── AbstractInsertDataTask.java
│ ├── AbstractTransferTask.java
│ ├── TransferTask.java
│ ├── TransferTaskConfig.java
│ ├── TransferTaskFactory.java
│ └── impl
│ │ ├── DefaultTransferTask.java
│ │ ├── InsertTask.java
│ │ └── MoreSrcsTransferTask.java
│ ├── type
│ ├── TypeChangeHander.java
│ └── impl
│ │ └── StringToIntegerHandler.java
│ ├── utils
│ ├── ClassUtils.java
│ ├── PageQuerySQLTemplate.java
│ └── Xml2JsonUtil.java
│ ├── validator
│ ├── DataSourceValidator.java
│ ├── DefinitonValidator.java
│ ├── TableValidator.java
│ ├── TypeHandlerValidator.java
│ └── impl
│ │ └── DefaultDefinitionValidator.java
│ └── xmlDefinition
│ ├── DefaultLoadDefinition.java
│ └── LoadDefinition.java
└── resources
├── TransferDefinitions.xml
├── TransferDefinitions.xsd
├── log4j.properties
└── logs
├── :user.txt
├── error.log
└── log.log
/README.md:
--------------------------------------------------------------------------------
1 | ###配置文件说明
2 | ----------
3 | 执行容器的上下文是根据配置文件生成的,有数据源,类型装唤起,自定义的属性,还有最核心的,迁移任务配置;
4 |
5 | * **数据源配置**
6 |
7 |
8 |
9 |
10 | jdbc:mysql://192.168.31.108:3306/test
11 | xxx
12 | xxxx
13 | com.mysql.jdbc.Driver
14 |
15 |
16 | jdbc:mysql://192.168.31.108:3306/testA
17 | xxx
18 | xxxx
19 | com.mysql.jdbc.Driver
20 |
21 |
22 |
23 | 可以配多个数据源;每一个数据源都有一个自己的ID;
24 | dbType: 数据库的类型: mySql, sqlServer, oracle ....
25 |
26 | * **属性配置**
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | 配置一些常用的属性,现在需要有个俩个配置:
36 |
37 | pageSize: 分页查询的时候,单页数据量的配置;
38 |
39 | fialRecordFilePath:记录迁移失败数据的文件的存放路径;
40 |
41 | **NOTE:** 如果有需要其他的配置,在进行自定义扩展的时候,可以按上面的格式进行配置,然后就可以从执行上下文中直接用getProperty(name) 来获取配置的值。
42 |
43 | * **迁移任务配置**
44 |
45 | 我们将需要迁移的目标数据库的表当做一个任务,而它数据可能来自多个表,甚至不同库的不同表,我们把他们分为下面种情况:
46 |
47 |
48 | **A:同库单表**
49 |
50 |
57 |
58 |
59 | **B:同库多表**
60 |
61 |
62 |
64 |
65 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | **C:多库多表**
75 |
76 |
78 |
79 |
81 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | 上面是三种情况(应该是可以满足大多数的数据迁移需求)的配置列子;下面是对各个配置项的说明,及其注意点:
91 |
92 | **table节点 表示的是一个迁移任务,其配置说明如下:**
93 |
94 | beanClass: 目标表对应JAVA BEAN;
95 |
96 | table: 目标表的表名
97 |
98 | targetDataSourceRef:目标表所在数据库对应的数据源的ID (DataSources 中配置的数据源)
99 |
100 | taskImplClass: 配置迁移任务的实现类;如果没有配置,就采用默认的是实现类是:
101 |
102 | com.xtonic.task.impl.DefaultTransferTask;
103 |
104 | //在不涉及到多库多表的迁移任务的时候,采用这个默认的; 它满足的是单库单表,或单库多表的情景;
105 |
106 | //如果是多库多表的情况,就采用下面这个这个实现类:
107 |
108 | com.xtonic.task.impl.MoreSrcsTransferTask
109 |
110 | *如果这俩个实现类都不能满足要求,就可以采用自己的扩展编写的实现类,在后续的**扩展说明**章节进行说明;*
111 |
112 |
113 | **srcs节点: 表示数据源,配置的是如何获取要插入到目标表中的数据。可以有多个;**
114 |
115 | srcDataSourceRef : 数据源的ID; 在DataSource节点所配置的数据源的ID
116 |
117 | keyColumn:关键字段,一般是主键,如果有多个字段组成的主键采用‘,’进行分割, keyColumn="id,username"
118 |
119 | 在多库多表的情况下, 并且采用的是默认的com.xtonic.task.impl.MoreSrcsTransferTask的实现类的情况下:
120 | 几个数据源直接的keyColumn应该是一样额,是通过这个KeyColumn去关联不同数据库直接的数据的;
121 |
122 | 比如:
123 |
124 |
126 | 这样的话,会采用 id = id , userName = name 这样的规则来匹对数据;
127 |
128 |
129 |
130 | querySql: 从配置的数据库中获取源数据的SQL;这个SQL有几点要求:
131 |
132 | 1:不允许采用 select * from table; 这种写法, 要采用select columnA, columnB.... from table 这种写法;
133 | 2:字段名必须与 beanClass属性配置的 目标表的JAVA BEAN的属性对应, 如果源数据表的字段与目标表的字段的名字有出入,请在querySQL中采用别名的写法, 字段的别名应该与JAVA BEAN的属性名对应;
134 | 3: 字段的数量:多条SQL加起来的字段的总数,应该小于或等于JAVA BEAN的属性的个数;
135 | 4: 如果配置了 KeyColumn属性,那么keyColumn字段应该在 querySQL里面存在;
136 |
137 |
138 | **changes 节点: 是用来反映数据库结构变化的情况,进行再数据迁移的过程对对应的数据字段进行转换处理的处理器;**
139 |
140 | columnName :有变动的字段,该值应该是JAVA BEAN 里面对应的属性名; 其实也是目标表里面字段名;
141 | targetType :转换后的数据类型;
142 | srcType: 转换前的数据类型;
143 | handlerRef : 转换处理的ID; (在转换器的配置)
144 |
145 |
146 | * **类型转换器的配置**
147 |
148 |
149 |
150 |
151 |
152 |
153 | handlerid : 转换器的ID;
154 |
155 | handlerClass : 转换器的是显现类; 该转换器,可能会涉及业务规则,或有一些特殊的情况,可以根据实际情况自己进行相关实现,并配置; **该实现类必须实现:com.xtonic.type.TypeChangeHander 接口;**
156 |
157 |
158 | ###扩展说明
159 | -----------
160 | 在执行迁移任务的时候,主要三个核心的步骤,如下:
161 |
162 | 1. 获取数据,返回一个List集合,集合的类型为Mpa对象,KEY:为字段名,Value:属性值;
163 | 2. 将集合的一条条数据转换为对应的JAVE Bean; 中间包括了,类型转换处理;
164 | 3. 将一个个,JAVA BEAN 的数据,插入到对应的目标表中;
165 |
166 | 如果自带的任务实现类无法满足业务需求的话,可以自定义自己的任务实现类,并在XML中配置;
167 |
168 | ***该任务实现类要继承 com.xtonic.task.AbstractTransferTask;***,并实现getDataFromSrc() 返回的数据格式严格按照上述的规范。
169 |
170 | 针对每一条数据进行特殊的处理,可以重写customProcessValues(List values, List fieldNames)方法;
171 |
172 | values: 一个JAVA BEAN存的数据的值。
173 | fieldNames: JAVA BENA对应的字段;
174 | values 与 fieldNames一一对应;
175 |
176 | ###运行
177 | ------
178 | import java.io.IOException;
179 |
180 | import com.xtonic.context.TransferContext;
181 | import com.xtonic.context.impl.TrnasferAppContext;
182 |
183 | public class Main {
184 | public static void main(String[] args) throws IOException, InterruptedException {
185 | //初始化XML文件,生成上下文
186 | TransferContext context = new TrnasferAppContext("TransferDefinitions.xml");
187 | //将上下文丢到容器里面进行运行;
188 | Runcontainer containor = new Runcontainer(context);
189 | containor.excute();
190 | }
191 | }
192 |
193 |
194 |
--------------------------------------------------------------------------------
/bak/TransferDefinitions.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | jdbc:mysql://192.168.31.108:3306/test
8 | root
9 | jzh9866
10 | com.mysql.jdbc.Driver
11 |
12 |
13 | jdbc:mysql://192.168.31.108:3306/testA
14 | root
15 | jzh9866
16 | com.mysql.jdbc.Driver
17 |
18 |
19 |
20 |
32 |
34 |
35 |
37 |
39 |
40 |
41 |
42 |
43 |
44 |
51 |
58 |
59 |
66 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
3 | 4.0.0
4 | com.xtonic
5 | DateTransfer
6 | 0.0.1-SNAPSHOT
7 |
8 |
9 | net.sf.json-lib
10 | json-lib
11 | 2.4
12 | jdk15
13 |
14 |
15 | org.jdom
16 | jdom
17 | 1.1
18 |
19 |
20 |
21 | xom
22 | xom
23 | 1.2.5
24 |
25 |
26 |
27 | commons-dbutils
28 | commons-dbutils
29 | 1.6
30 |
31 |
32 | mysql
33 | mysql-connector-java
34 | 5.1.38
35 |
36 |
37 |
38 | org.mybatis
39 | mybatis
40 | 3.2.8
41 |
42 |
43 | log4j
44 | log4j
45 | 1.2.9
46 |
47 |
48 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/Config.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | public class Config {
7 | private static final Config CONFIG= new Config();
8 | private Config(){};
9 | public static Config initConfig(Map paramterMap){
10 | if(commonParameters.isEmpty() && !paramterMap.isEmpty() ){
11 | commonParameters.putAll(paramterMap);
12 | return CONFIG;
13 | }
14 | return CONFIG;
15 | }
16 | private final static Map commonParameters = new HashMap();
17 |
18 | //TODO: 这里需要做同步的处理。需要优化,暂时先这样处理;
19 | public synchronized Object getParameter(String key){
20 | return commonParameters.get(key);
21 | }
22 | public synchronized void setParameter(String key, Object value){
23 | commonParameters.put(key, value);
24 | };
25 | @Override
26 | public String toString() {
27 | return commonParameters.toString();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/DataSourceDeifiniton.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | public class DataSourceDeifiniton {
4 | private String url;
5 | private String password;
6 | private String username;
7 | private String driverClass;
8 | private String id;
9 | private String dbType;
10 |
11 | public String getDbType() {
12 | return dbType;
13 | }
14 | public void setDbType(String dbType) {
15 | this.dbType = dbType;
16 | }
17 | public String getUrl() {
18 | return url;
19 | }
20 | public void setUrl(String url) {
21 | this.url = url;
22 | }
23 | public String getPassword() {
24 | return password;
25 | }
26 | public void setPassword(String password) {
27 | this.password = password;
28 | }
29 | public String getUsername() {
30 | return username;
31 | }
32 | public void setUsername(String username) {
33 | this.username = username;
34 | }
35 | public String getDriverClass() {
36 | return driverClass;
37 | }
38 | public void setDriverClass(String driverClass) {
39 | this.driverClass = driverClass;
40 | }
41 | public String getId() {
42 | return id;
43 | }
44 | public void setId(String id) {
45 | this.id = id;
46 | }
47 | @Override
48 | public String toString() {
49 | return "DataSourceDeifiniton [url=" + url + ", password=" + password + ", username=" + username
50 | + ", driverClass=" + driverClass + ", id=" + id + "]";
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/ErrorMsg.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | public class ErrorMsg {
4 | private String tableName;
5 | private String errorMsg;
6 |
7 | public ErrorMsg(String tableName,String errorMsg) {
8 | this.tableName = tableName;
9 | this.errorMsg = errorMsg;
10 | }
11 |
12 | public String getTableName() {
13 | return tableName;
14 | }
15 | public void setTableName(String tableName) {
16 | this.tableName = tableName;
17 | }
18 | public String getErrorMsg() {
19 | return errorMsg;
20 | }
21 | public void setErrorMsg(String errorMsg) {
22 | this.errorMsg = errorMsg;
23 | }
24 | @Override
25 | public String toString() {
26 | return "ErrorMsg [tableName=" + tableName + ", errorMsg=" + errorMsg + "]";
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/SrcData.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | public class SrcData {
4 | private String querySql;
5 | private String srcDataSourceRef;
6 | private String keyColumn;
7 | private Boolean isMainSrc;
8 |
9 | public String getQuerySql() {
10 | return querySql;
11 | }
12 | public void setQuerySql(String querySql) {
13 | this.querySql = querySql;
14 | }
15 | public String getSrcDataSourceRef() {
16 | return srcDataSourceRef;
17 | }
18 | public void setSrcDataSourceRef(String srcDataSourceRef) {
19 | this.srcDataSourceRef = srcDataSourceRef;
20 | }
21 | public String getKeyColumn() {
22 | return keyColumn;
23 | }
24 | public void setKeyColumn(String keyColumn) {
25 | this.keyColumn = keyColumn;
26 | }
27 | public Boolean getIsMainSrc() {
28 | return isMainSrc;
29 | }
30 | public void setIsMainSrc(Boolean isMainSrc) {
31 | this.isMainSrc = isMainSrc;
32 | }
33 | @Override
34 | public String toString() {
35 | return "SrcData [querySql=" + querySql + ", srcDataSourceRef=" + srcDataSourceRef + ", keyColumn=" + keyColumn
36 | + ", isMainSrc=" + isMainSrc + "]";
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/TableChanges.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | public class TableChanges {
4 | private String columnName;
5 | private String targetType;
6 | private String srcType;
7 | private String handlerRef;
8 |
9 | public String getHandlerRef() {
10 | return handlerRef;
11 | }
12 | public void setHandlerRef(String handlerRef) {
13 | this.handlerRef = handlerRef;
14 | }
15 | public String getColumnName() {
16 | return columnName;
17 | }
18 | public void setColumnName(String columnName) {
19 | this.columnName = columnName;
20 | }
21 | public String getTargetType() {
22 | return targetType;
23 | }
24 | public void setTargetType(String targetType) {
25 | this.targetType = targetType;
26 | }
27 |
28 | public String getSrcType() {
29 | return srcType;
30 | }
31 | public void setSrcType(String srcType) {
32 | this.srcType = srcType;
33 | }
34 |
35 | @Override
36 | public String toString() {
37 | return "TableChanges [columnName=" + columnName + ", targetType=" + targetType + ", srcType=" + srcType
38 | + ", handlerRef=" + handlerRef + "]";
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/TransferTableDefiniton.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | import java.util.List;
4 |
5 | public class TransferTableDefiniton {
6 | private String beanClass;
7 | private String table;
8 | private String targetDataSourceRef;
9 | private String id;
10 | private String taskImplClass;
11 | private List srcs;
12 | private List changes;
13 | public String getBeanClass() {
14 | return beanClass;
15 | }
16 | public void setBeanClass(String beanClass) {
17 | this.beanClass = beanClass;
18 | }
19 | public String getTable() {
20 | return table;
21 | }
22 | public void setTable(String table) {
23 | this.table = table;
24 | }
25 | public String getTargetDataSourceRef() {
26 | return targetDataSourceRef;
27 | }
28 | public void setTargetDataSourceRef(String targetDataSourceRef) {
29 | this.targetDataSourceRef = targetDataSourceRef;
30 | }
31 | public String getId() {
32 | return id;
33 | }
34 | public void setId(String id) {
35 | this.id = id;
36 | }
37 | public List getSrcs() {
38 | return srcs;
39 | }
40 | public void setSrcs(List srcs) {
41 | this.srcs = srcs;
42 | }
43 | public List getChanges() {
44 | return changes;
45 | }
46 | public void setChanges(List changes) {
47 | this.changes = changes;
48 | }
49 | public String getTaskImplClass() {
50 | return taskImplClass;
51 | }
52 | public void setTaskImplClass(String taskImplClass) {
53 | this.taskImplClass = taskImplClass;
54 | }
55 | @Override
56 | public String toString() {
57 | return "TransferTableDefiniton [beanClass=" + beanClass + ", table=" + table + ", targetDataSourceRef="
58 | + targetDataSourceRef + ", id=" + id + ", srcs=" + srcs + ", changes=" + changes + "]";
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/config/TypeHandlerDefinition.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.config;
2 |
3 | public class TypeHandlerDefinition {
4 | private String handlerid;
5 | private String handlerClass;
6 | public String getHandlerid() {
7 | return handlerid;
8 | }
9 | public void setHandlerid(String handlerid) {
10 | this.handlerid = handlerid;
11 | }
12 | public String getHandlerClass() {
13 | return handlerClass;
14 | }
15 | public void setHandlerClass(String handlerClass) {
16 | this.handlerClass = handlerClass;
17 | }
18 | @Override
19 | public String toString() {
20 | return "TypeHandlerDefinition [handlerid=" + handlerid + ", handlerClass=" + handlerClass + "]";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/com/xtonic/container/DefaultErrorLogComsumer.java:
--------------------------------------------------------------------------------
1 | package com.xtonic.container;
2 |
3 | import java.io.BufferedWriter;
4 | import java.io.File;
5 | import java.io.FileNotFoundException;
6 | import java.io.FileOutputStream;
7 | import java.io.IOException;
8 | import java.io.OutputStreamWriter;
9 | import java.util.HashMap;
10 | import java.util.Map;
11 | import java.util.concurrent.Future;
12 |
13 | import org.apache.commons.logging.Log;
14 | import org.apache.commons.logging.LogFactory;
15 |
16 | import com.xtonic.config.ErrorMsg;
17 | import com.xtonic.context.TransferContext;
18 |
19 | public class DefaultErrorLogComsumer implements EorrorDataLogConsumer