百度上传文件到写入数据库之四

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

  

原文地址:https://www.cnblogs.com/itchenfirst/p/7285571.html