/* * 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; } }