示例功能(仅供测试):
在JAVA项目中,将数据从Excel文件导入数据库中。实现该能有多种方法,而本例则是“不走寻常路”,尝试借助Kettle实现数据导入。
原理:
Java中调用存储在Kettle资源库的Trans(转换),在Trans中将实现数据的验证、转码、导入,并导出错误数据的Excel
环境:
MyEclipse 8.5 + Kettle 4.4 + Oracle/MySQL
JAVA代码示例:
需要用到的jar包:kettle-core.jarkettle-db.jarkettle-dbdialog.jarkettle-engine.jarkettle-test.jarkettle-ui-swt.jarkettle-vfs-20100924.jarlog4j-1.2.17.jarOracle_10g_10.2.0.4_JDBC_ojdbc14.jarcommons-logging-1.1.3.jarjxl.jarcommons-lang-2.6.jarpackage com.kettle; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.util.EnvUtil; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.repository.kdr.KettleDatabaseRepository; import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; public class ExecTrans { private static String repName = "KETTLE_4"; private static String dbType = "Oracle"; private static String dbAccess = "Native"; private static String dbHost = "192.168.200.66"; private static String dbName = "KYY"; private static String dbPort = "1521"; private static String dbUser = "KETTLE_4"; private static String dbPass = "a1b2c3"; /** * JAVA 调用 Kettle,执行Trans * * @param args * @throws KettleException */ public static void main(String[] args) { // TODO Auto-generated method stub // 配置转换名称 String transName = "Test_imp_emp"; // 配置Excel的文件路径及名称 String fileName = "E:\template\export\成绩导入模板1203.xls"; // 配置错误Excel的文件路径及名称 String errorFileName = "E:\template\export\error_成绩导入"; // 配置数据库连接 execTransForDB(transName, fileName, errorFileName); } /** * 配置数据源 调用资源库中的相关job 、transfer */ public static void execTransForDB(String transName, String fileName, String errorFileName) { try { KettleEnvironment.init(); // 创建DB资源库 KettleDatabaseRepository repository = new KettleDatabaseRepository(); DatabaseMeta databaseMeta = new DatabaseMeta(repName, dbType, dbAccess, dbHost, dbName, dbPort, dbUser, dbPass); // 选择资源库 KettleDatabaseRepositoryMeta kettleDatabaseRepositoryMeta = new KettleDatabaseRepositoryMeta( "Kettle", "Kettle", "Transformation description", databaseMeta); repository.init(kettleDatabaseRepositoryMeta); // 连接资源库 repository.connect("admin", "admin"); RepositoryDirectoryInterface directoryInterface = repository .loadRepositoryDirectoryTree(); // 选择转换 TransMeta transMeta = repository.loadTransformation(transName, directoryInterface, null, true, null); Trans trans = new Trans(transMeta); trans.setVariable("fileName", fileName); trans.setVariable("errorFileName", errorFileName); trans.execute(null); trans.waitUntilFinished();// 等待直到数据结束 if (trans.getErrors() > 0) { System.out.println("transformation error"); } else { System.out.println("transformation successfully"); } } catch (KettleException e) { e.printStackTrace(); } } }
Kettle 转换示例:
流程说明:1、生成记录(从Java中传入参数获取文件名);2、File exists(判断文件是否存在);3、过滤记录(过滤掉文件不存在的情况);4、Excel输入(根据Java中传入文件名参数,读取Excel文件)5、字段选择(将Excel中列头转为数据库中的字段名)6、流查询(与数据库中数据比对,选择规范的数据)7、过滤记录2(将规范数据和不规范数据分发至8、插入/更新 和 9、Excel Output)8、插入/更新(将规范数据持久化在数据库中)9、Excel Output(将错误数据导出为新的Excel文件)示例分析:
优点:1、读取Excel交给Kettle处理;2、分析数据、验证数据、转换格式由Kettle处理;3、可以方便地导出错误数据以供用户修改;4、可以灵活、方便地处理数据,不用在Java里for...if...else...去操作。
缺点:1、Excel列名不能动态传参,需要提前配置好;2、对于整个数据流的监控欠缺,还需完善
总结,利用Kettle对各种数据库的灵活支持,可以很方便地将此功能用在系统第一次上线需要导入大批量数据。同样可以用在,需要大量导出Execl文件的功能。