zoukankan      html  css  js  c++  java
  • 百度上传文件到写入数据库之四

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

      

  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/itchenfirst/p/7285571.html
Copyright © 2011-2022 走看看