- 论坛徽章:
- 0
|
近期由于项目需要,实现了从.csv或者.txt文件中读取每行信息后插入到Oracle数据库中的功能,特共享出来。用到第三方开源工具包:opencsv-1.8.jar和commons-dbutils-1.1.jar,需单独下载。
首先需要配置XML文件,如下:
Employee
5000
文件中描述了2个导入工作:(1)表EMPLOYEE_TEST(2)表YFJBXX_TEST,文件中每张表的列名和类型需要和导入的目标表一致,且顺序和文件中要导入的内容相匹配,例如下面的csv文件:
"ID","DEP","NAME","AREA","AGE","SEX","XUELI","SALARY","PRIX"
"001","研发","张三","北京","34","女","本科","4546","1"
"002","销售","李四","天津","45","男","专科","4456","2"
可以看到导入的顺序和上述XML文件中的列名一致。
如果从文件导入到数据库中完全匹配,只需配置文件中的即可,代码中调用示例:
//设置XML配置文件所在位置
FileImportInitFactory.setConfigFileName("E:/EclipseProjects/WISImport/bin/fileimport/FileImportConfig.xml");
&nb
sp; FileImportInitFactory.init();
HashMap h = new HashMap(1,1);
//如果有日期型的列,需要设置DateFormat并放入HashMap中
h.put("DateFormat","yyyy-MM-dd HH:mm:ss");
//执行导入工作
new ImportFileEntry().importFile("导入的文件路径及名称.csv","YFJBXX_TEST",false,"ImportDirectImpl",h);
ImportFileEntry()的importFile方法说明:
/**
* 从文件导入到指定表中
* @param fileName String 要导入文件名
* @param tableName String 导入目标表名
* @param firstLineRead boolean 是否读取第一行
* @param dealClass 处理类名称(例如配置文件中Bean name="ImportDirectImpl")
* @param aHashMap 扩展用,需特殊处理时可置入变量
* @throws Exception
*/
public void importFile(String fileName, String tableName, boolean firstLineRead,String dealClass,HashMap aHashMap) throws Exception ;
至此,一个简单的不需做任何处理直接从文件导入数据库对应表的功能就实现了。
但是有些时候我们需要进行特殊的处理,例如表中的当前操作日期列在导入文件中没有,需要在代码中加入,这时就需要实现FileImportInterface接口并加入到配置文件中例如:,ImportWISImpl的实现代码见后续代码清单。
t;);
columnListInfoCode[0] = columnName;
columnListInfoCode[1] = columnType;
System.out.println("Code columnName:" + columnName + " columnType:" + columnType);
}
}
//生成实例
ImportTableInfoBO importAction = new ImportTableInfoBO();
importAction.setTableName(tableName);
importAction.setColumnNamesFile(columnListInfoFile);
if (columnListInfoCode != null) {
importAction.setColumnNamesCode(columnListInfoCode);
}
//放入静态容器中
importJobList.put(tableName, importAction);
}
//2.其他配置信息
Element importDealClassList = (Element) eroot.getElementsByTagName("ImportDealClassList").item(0);
String className;
String classFullName;
NodeList beanList = importDealClassList.getElementsByTagName("Bean");
for (int j=0; j
五、插入数据库操作需实现的接口
package fileimport;
import java.util.HashMap;
/**
* @version 1.0
*/
public interface FileImportInterface {
public void insert(Object[] nextLine,String tableName,HashMap aHashMap,ImportTableInfoBO importTableInfoBO);
public void close();
}
六、直接导入到表程序
package fileimport;
import org.apache.commons.dbutils.QueryRunner;
import java.sql.Connection;
import java.util.HashMap;
import org.apache.commons.dbutils.DbUtils;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.util.Date;
import java.text.SimpleDateFormat;
/**
* 直接导入到表中,不做特殊处理.
* 如需特殊处理,可实现接口FileImportInterface,改造insert方法即可
* @author lihf
* @version 1.0
*/
public class ImportDirectImpl implements FileImportInterface {
QueryRunner qRunner;
private long maxCommitNumber = 5000;
private long insertNum = 1; //已插入但未提交的数据数量
Connection conn = null;
public ImportDirectImpl() {
qRunner = new QueryRunner();
if (conn == null) {
try {
long l1 = System.currentTimeMillis();
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:user/pwd@127.0.0.1:1521:dbsid", "user", "pwd");
conn.setAutoCommit(false);
long l2 = System.currentTimeMillis();
System.out.println("connect db time:"+(l2 -
/**
* 文件和表列完全匹配,没有任何处理直接入库
* @param columnValues 文件对应表中列名及类型二维数组
* @param sql 预处理SQL语句
* @param aHashMap 扩展用,需特殊处理时置入变量
* @param importTableInfoBO 保存导入目标表的名称、字段名、类型等信息的BO
* @throws Exception
*/
public void insert(Object[] columnValues, String sql, HashMap aHashMap,ImportTableInfoBO importTableInfoBO) {
String dateFormat = null;
Object[] columnValuesInsert = new Object[columnValues.length];
//日期型数据处理-----------------------------------------------------------------
if (aHashMap != null){
dateFormat = (String) aHashMap.get("DateFormat");
//System.out.println("dateFormat:" + dateFormat);
//System.out.println("importTableInfoBO:" + importTableInfoBO);
}
if (importTableInfoBO != null) {
String[][] columnList = importTableInfoBO.getColumnNamesFile();
//System.out.println("columnList.length:"+columnList.length);
for (int i = 0; i 0) {
//log.debug("第"+(insertNum)+"条数据插入成功!");
//System.out.println("第"+(insertNum)+"条数据插入成功!");
if (insertNum >= maxCommitNumber) { //WIASystemConfig.getInstance().getLong("5000")
conn.commit();
//log.info(insertNum+" numbers committed succeed...insertNum归零");
//System.out.println(insertNum+" numbers committed succeed...insertNum归零");
insertNum = 1;
} else {
insertNum++;
}
}
} catch (Exception e) {
e.printStackTrace();
//---写入数据库待加入----
//log.error(e.getMessage());
}
}
public void close() {
if (conn != null) {
try {
if (conn != null) {
DbUtils.commitAndClose(conn);
System.out.println("close end");
}
} catch (SQLException e) {
e.printStackTrace();
//log.error(e.getCause());
}
}
}
/**
*
* @param dateString String
* @param format String
* @return Date
*/
public Date formatDate(String dateString,String format){
try{
SimpleDateFormat f = new SimpleDateFormat(format);
return f.parse(dateString);
}catch(Exception e){
return null;
}
}
}
七、某些列需特殊处理后插入程序
package fileimport;
import org.apache.commons.dbutils.QueryRunner;
import java.sql.Connection;
import java.util.HashMap;
import org.apache.commons.dbutils.DbUtils;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.util.Date;
import java.text.SimpleDateFormat;
l1));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57965/showart_1966762.html |
|