package com.taobao.yugong.translator; import java.sql.Types; import java.util.Date; import org.apache.commons.lang.ObjectUtils; import com.taobao.yugong.common.db.meta.ColumnMeta; import com.taobao.yugong.common.db.meta.ColumnValue; import com.taobao.yugong.common.model.record.Record; /** * 一个迁移的例子,涵盖一些基本转换操作 * * <pre> * 例子包含特性: * 1. schema/table名不同. oracle中为yugong_example_oracle,mysql中为test.yugong_example_mysql * 2. 字段名字不同. oracle中的name字段,映射到mysql的display_name * 3. 字段逻辑处理. mysql的display_name字段数据来源为oracle库的:name+'('alias_name+')' * 4. 字段类型不同. oracle中的amount为number类型,映射到mysql的amount为varchar文本型 * 5. 源库多一个字段. oracle中多了一个alias_name字段 * 6. 目标库多了一个字段. mysql中多了一个gmt_move字段,(简单的用迁移时的当前时间进行填充) * * 测试的表结构: * // oracle表 * create table yugong_example_oracle * ( * id NUMBER(11) , * name varchar2(32) , * alias_name char(32) default ' ' not null, * amount number(11,2), * score number(20), * text_b blob, * text_c clob, * gmt_create date not null, * gmt_modified date not null, * CONSTRAINT yugong_example_oracle_pk_id PRIMARY KEY (id) * ); * * // mysql表 * create table test.yugong_example_mysql * ( * id bigint(20) unsigned auto_increment, * display_name varchar(128) , * amount varchar(32), * score bigint(20) unsigned , * text_b blob, * text_c text, * gmt_create timestamp not null, * gmt_modified timestamp not null, * gmt_move timestamp not null, * CONSTRAINT yugong_example_mysql_pk_id PRIMARY KEY (id) * ); * </pre> * * @author agapple 2013-10-10 下午3:28:33 */ public class YugongExampleOracleDataTranslator extends AbstractDataTranslator implements DataTranslator { public boolean translator(Record record) { // 1. schema/table名不同 // record.setSchemaName("test"); record.setTableName("yugong_example_mysql"); // 2. 字段名字不同 ColumnValue nameColumn = record.getColumnByName("name"); if (nameColumn != null) { nameColumn.getColumn().setName("display_name"); } // 3. 字段逻辑处理 ColumnValue aliasNameColumn = record.getColumnByName("alias_name"); if (aliasNameColumn != null) { StringBuilder displayNameValue = new StringBuilder(64); displayNameValue.append(ObjectUtils.toString(nameColumn.getValue())) .append('(') .append(ObjectUtils.toString(aliasNameColumn.getValue())) .append(')'); nameColumn.setValue(displayNameValue.toString()); } // 4. 字段类型不同 ColumnValue amountColumn = record.getColumnByName("amount"); if (amountColumn != null) { amountColumn.getColumn().setType(Types.VARCHAR); amountColumn.setValue(ObjectUtils.toString(amountColumn.getValue())); } // 5. 源库多一个字段 record.removeColumnByName("alias_name"); // 6. 目标库多了一个字段 ColumnMeta gmtMoveMeta = new ColumnMeta("gmt_move", Types.TIMESTAMP); ColumnValue gmtMoveColumn = new ColumnValue(gmtMoveMeta, new Date()); gmtMoveColumn.setCheck(false);// 该字段不做对比 record.addColumn(gmtMoveColumn); // ColumnValue text_c = record.getColumnByName("text_c"); // try { // text_c.setValue(new String((byte[]) text_c.getValue(), "GBK")); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } return super.translator(record); } }