/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cn.toher.util.common;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang.StringUtils;
/**
*
* @author 李怀明
* @version 2017-07-31
*
*/
public class ReadTxtImport {
/**
* 定义导入的文件,并且设置导入的数据字段
*
* @param filePath 导入的TXT文档路径
* @param tableName 数据导入的表名
* @param javaBean 需要导入对象,根据对象反射原理取得数据对象属性的名称、类型
* @param conn 数据库链接,无论采用何种方法获得链接只需要传递Connection进行数据库操作
* @param encoding 编码格式便于切换如 UTF-8 GBK等
* @param otherData 其它需要导入的数据
*/
public static String readTxtFile(String filePath, String tableName, Object javaBean, Connection conn, String encoding, Object[] otherData) {
String returnStr = "";
if (conn != null) {
PreparedStatement ptmt = null;
try {
File fileTxt = new File(filePath);
//判断文件是否存在
if (fileTxt.isFile() && fileTxt.exists()) {
// utf-8的格式说是会乱码?
InputStreamReader read = new InputStreamReader(new FileInputStream(fileTxt), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
//获取实体类的所有属性,返回Field数组
// 把自己写的javaBean中的名字,数据类型,一个一个的保存在MapData这个bean的集合中,javaBean是为了sql语句而生成的
List<MapData> list = getModelAttriButeType(javaBean);
// 生成sql语句
String sql = getSql(list, tableName);
System.out.println("sql:" + sql);
try {
conn.setAutoCommit(false);
ptmt = conn.prepareStatement(sql);
// 读取一行,要求客户导入的数据是严格按照我的要求的,否则导入不成功
while ((lineTxt = bufferedReader.readLine()) != null) {
System.out.println("lineTxt:" + lineTxt);
// excel中表格之间使用tab键分割的,就是" "这个符号
String[] param = lineTxt.split(" ");
//开始执行数据插入
int dataSize = list.size() - otherData.length;
// 读取一行,在这一行中循环获取数据
for (int i = 0; i < dataSize; i++) {
int ii = i + 1;
MapData mapData = list.get(i);
//获取数据类型,比如:userNo
Object classType = mapData.getFiledType();
// 获取值,比如:UU12456874846,传入的数据类型,顺序都与我的bean一致
String value = param[i];
if (classType.equals(String.class) || classType.equals(Date.class)) {
ptmt.setString(ii, value);
} else if (classType.equals(Integer.class)) {
ptmt.setInt(ii, StringUtils.isBlank(value) ? 0 : Integer.parseInt(value));
} else if (classType.equals(BigDecimal.class)) {
ptmt.setBigDecimal(ii, StringUtils.isBlank(value) ? BigDecimal.ZERO : new BigDecimal(value));
} else if (classType.equals(Long.class)) {
ptmt.setLong(ii, StringUtils.isBlank(value) ? 0 : Long.parseLong(value));
}
}
/*新增指定的数据列*/
for (int i = 0; i < otherData.length; i++) {
int ii = dataSize + 1 + i;
ptmt.setObject(ii, otherData[i]);
}
// 批处理,当所有数据都执行之后,就执行批处理
ptmt.addBatch();
}
int[] executeBatch = ptmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
ptmt.close();
ptmt.close();
returnStr = "" + executeBatch.length;
} catch (SQLException e) {
// 事务处理,回滚
conn.rollback();
e.printStackTrace();
returnStr = "数据插入失败";
} finally {
conn.close();
}
//关闭读取流
read.close();
} else {
returnStr = "读取不到指定的文件";
}
} catch (Exception ex) {
returnStr = "导入失败";
ex.printStackTrace();
}
} else {
returnStr = "数据库链接失败";
}
return returnStr;
}
/**
* 传递 JavaBean 对象获取对象属性的名字以及属性
*
* @param model JavaBean对象
*/
public static List<MapData> getModelAttriButeType(Object model) throws Exception {
//获取实体类的所有属性,返回Field数组 ,反射原理,获取到传进来的这个bean文件中各个属性,做成集合
Field[] field = model.getClass().getDeclaredFields();
List<MapData> list = new ArrayList<MapData>();
//遍历所有属性
for (int j = 0; j < field.length; j++) {
MapData mapData = new MapData();
//获取属性的名字,一个一个的获取属性名字
String name = field[j].getName();
//获取属性的类型,一个一个的获取类型名字
Object type = field[j].getGenericType();
// 然后保存在mapData中
mapData.setName(name);
mapData.setFiledType(type);
// 再把mapData保存在list这个集合中
list.add(mapData);
}
return list;
}
/**
* 拼接SQL
*
* @param list JavaBean对象反射取得的MAP集合
* @param tableName 数据导入的表名
*/
public static String getSql(List<MapData> list, String tableName) {
String sql = "";
if (list.size() > 0) {
//开始拼接Sql语句
sql = "insert into " + tableName + " (";
//循环将字段拼接
for (MapData entry : list) {
// 获取属性名字,然后统一后面都加逗号,
sql = sql + entry.getName() + ",";
}
//将最后一个,号截取
sql = sql.substring(0, sql.length() - 1);
sql = sql + ") values (";
//采用更高效的循环
for (MapData entry : list) {
sql = sql + "?,";
}
//将最后一个,号截取
sql = sql.substring(0, sql.length() - 1);
sql = sql + ")";
}
return sql;
}
}