因爲近期項目中須要對接收到文件進行解析,而後存入到數據庫中,因爲數據量較大,加之最近接觸到了kettle,因此就想在項目中來實際使用下。java
kettle
文件這裏進行轉換的功能比較簡單,就是從文件中獲取數據,而後進行分割,而後存放到數據庫中。以下圖所示,是最終的kettle
文件。數據庫
Java
中調用Kettle
來執行這個轉換這裏使用的gradle
,須要注意的是maven
倉庫的地址,在阿里的倉庫貌似沒找到kettle
的包,配置以下:maven
ext { kettleVersion = '8.0.0.0-1' } repositories { mavenLocal() maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven{ url 'http://nexus.pentaho.org/content/groups/omni' } } dependencies { compile("pentaho-kettle:kettle-core:${kettleVersion}") compile("pentaho-kettle:kettle-engine:${kettleVersion}") }
針對第一個問題,kettle
能夠設置命名參數,而後在執行的時候指定這些參數就能夠。gradle
針對第二個問題,在執行轉換的時候設置數據庫的相關配置就能夠。加密
獲取到metaData
後,而後進行設置就能夠,具體代碼以下:url
TransMeta transMeta = new TransMeta(filename); Map<String, String> params = new HashMap<String, String>() {{ put("filePath", filename); put("tableName", tableName); put("version", String.valueOf(version.getVersion())); }}; params.forEach((k, v) -> { try { transMeta.setParameterValue(k, v); } catch (UnknownParamException e) { e.printStackTrace(); } });
在設置數據庫的配置的時候須要注意密碼的加密方式,具體代碼以下:spa
private static final String SEED = "0933910847463829827159347601486730416058"; private static final String PASSWORD_ENCRYPTED_PREFIX = "Encrypted "; private String getPassword(String dbPass) { BigInteger bi_passwd = new BigInteger(dbPass.getBytes()); BigInteger bi_r0 = new BigInteger(SEED); BigInteger bi_r1 = bi_r0.xor(bi_passwd); return PASSWORD_ENCRYPTED_PREFIX + bi_r1.toString(RADIX); }
KettleEnvironment.init(); // 初始化kettle環境 String filename = ResourceUtils.getFile("classpath:etc.ktr").getAbsolutePath(); TransMeta transMeta = new TransMeta(filename); List<DatabaseMeta> dbList = transMeta.getDatabases(); // TODO 修改數據庫信息 // TODO 設置參數 Trans trans = new Trans(transMeta); // 設置日誌等級 trans.setLogLevel(LogLevel.ERROR); trans.execute(null); trans.waitUntilFinished();