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

      

  • 相关阅读:
    蓝牙音箱的连接和断开
    画一个钟表,陪着我走
    利用MediaSession发送信息到蓝牙音箱
    修改Switch 的颜色
    ViewPager PagerAdapter 的使用
    错误:android.view.InflateException: Binary XML file line #167: Binary XML file line #167: Error inflating class <unknown>
    react-project(一)
    create-react-app重建
    nodeJS连接mysql
    nodeJS问题
  • 原文地址:https://www.cnblogs.com/itchenfirst/p/7285571.html
Copyright © 2011-2022 走看看