Java实现excel表数据的批量存储(结合easyexcel插件)

场景:加哥最近在做项目时,苦于系统自身并未提供数据批量导入的功能还不能自行添加上该功能,且自身不想手动一条一条将数据录入系统。随后,自己使用JDBC连接数据库、使用EasyExcel插件读取表格并将数据按照业务逻辑批量插入数据库完成数据的初始化。接下来就看看加哥是怎么做的呢?

第一步:创建一个maven项目并导入依赖。

结合项目需要,只需要数据库和easyexcel的依赖包(在这里加哥使用的是mysql数据库,引入的就是mysql的数据库驱动,如果你想用sqlServer等数据库自行更换依赖就行)。

 

<!--数据库驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.21</version>
</dependency>
<!--表格导入处理-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>3.1.3</version>
</dependency>

第二步:手写或者准备好JDBC连接、操作数据库的工具类。

在这里加哥是把JDBC连接数据库、操作数据库、关闭数据库封装成了工具类并用static修饰作为静态方法,方便后面使用时候直接使用类型.方法调用。

以下是数据库的驱动、url、用户名、密码定义

//驱动
private static String driver = "com.mysql.jdbc.Driver";
//URL
private static String url = "jdbc:mysql://127.0.0.1:3306/mytestcharacterEncoding=utf-8&serverTimezone=Asia/Shanghai";
//用户名
private static String username = "root";
// 密码
private static String pwd = "123456";

连接数据库的方法,由于使用比较频繁将其抽取为一个独立的方法,该方法主要是加载驱动、创建连接。自己可以定义好后,在main方法中直接调用若执行通过则和数据库建立连接成功,否则失败。

/**
 * 创建连接
 * @return
 */
public static Connection getConnection(){
    Connection connection=null;
    //加载驱动
    try {
        Class.forName(driver);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    //建立连接获取Connection对象
    try {
        connection= DriverManager.getConnection(url,username,pwd);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return connection;
}

关闭连接,由于每次创建连接、都会有一个新的连接打开,如果一直不关闭就会出现连接建立满了的情况,也容易造成资源浪费,因为每次都必须关闭则也将其抽取成一个独立的方法。

/**
 * 关闭链接
 * @param connection
 * @param statement
 * @param resultSet
 */
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){

    try {
        if(resultSet!=null){
            resultSet.close();
        }

        if(statement!=null){
            statement.close();
        }
        if (connection!=null){
            connection.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

封装增删改方法,由于增删改调用的方法一致,则可以将其抽取成一个公用方法,在后面需要的时候直接调用该方法即可。查询方法由于每次处理的数据不一致,不适合做成公用方法。

/**
 * 执行增、删、改的方法
 * @param sql
 * @return
 */
public static int execute(String sql){
    //获取链接
    Connection connection=getConnection();
    int flag=0;
    try {
        //创建Statement对象
        Statement statement=connection.createStatement();
        //执行sql语句
        flag=statement.executeUpdate(sql);
        //关闭链接
        closeAll(connection,statement,null);

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return flag;
}

最后,为了保证我们写的方法可以正常建立连接、关闭连接、完成对应操作,需要大家创建一个main方法完成测试,下面是加哥给大家提供的。但是你在测试过程中,必须保证自己的数据库及其表、表字段都存在。

/*
  测试
 */
public static void main(String[] args) {
    String sql = "SELECT * FROM bs_structure  WHERE id = 1688350472671";
    Connection connection = getConnection();
    Statement statement = null;
    try {
        statement= connection.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while(resultSet.next()){
            String typename = resultSet.getString(3);
            System.out.println("类别名称:"+typename);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

第三步、创建实体类

实体类的属性必须和excel表格的列数一致,一般有多少列就会定义多少个属性,这里的实体类就是为了后面读取表格时映射处理使用的。以下是加哥的表格式,由于模版有12列则加哥定义了12个属性。大家可以结合自己excel表格的实际情况去完成。

 实体类

public class Structure {

    @ExcelProperty(value = "序号", index = 0)
    private String param1;
    @ExcelProperty(value = "水厂", index = 1)
    private String param2;
    @ExcelProperty(value = "工艺", index = 2)
    private String param3;
    @ExcelProperty(value = "设备", index = 3)
    private String param4;
    @ExcelProperty(value = "测点", index = 4)
    private String param5;
    @ExcelProperty(value = "点长名", index = 6)
    private String param6;
    @ExcelProperty(value = "点描述", index = 7)
    private String param7;
    @ExcelProperty(value = "设备类型名称", index = 11)
    private String param8;
    @ExcelProperty(value = "数据类型", index = 8)
    private String param9;
    @ExcelProperty(value = "小数位数", index = 9)
    private String param10;
    @ExcelProperty(value = "单位", index = 10)
    private String param11;
    @ExcelProperty(value = "测点名称", index = 5)
    private String param12;

    public String getParam1() {
        return param1;
    }

    public void setParam1(String param1) {
        this.param1 = param1;
    }

    public String getParam2() {
        return param2;
    }

    public void setParam2(String param2) {
        this.param2 = param2;
    }

    public String getParam3() {
        return param3;
    }

    public void setParam3(String param3) {
        this.param3 = param3;
    }

    public String getParam4() {
        return param4;
    }

    public void setParam4(String param4) {
        this.param4 = param4;
    }

    public String getParam5() {
        return param5;
    }

    public void setParam5(String param5) {
        this.param5 = param5;
    }

    public String getParam6() {
        return param6;
    }

    public void setParam6(String param6) {
        this.param6 = param6;
    }

    public String getParam7() {
        return param7;
    }

    public void setParam7(String param7) {
        this.param7 = param7;
    }

    public String getParam8() {
        return param8;
    }

    public void setParam8(String param8) {
        this.param8 = param8;
    }

    public String getParam9() {
        return param9;
    }

    public void setParam9(String param9) {
        this.param9 = param9;
    }

    public String getParam10() {
        return param10;
    }

    public void setParam10(String param10) {
        this.param10 = param10;
    }

    public String getParam11() {
        return param11;
    }

    public void setParam11(String param11) {
        this.param11 = param11;
    }

    public String getParam12() {
        return param12;
    }

    public void setParam12(String param12) {
        this.param12 = param12;
    }
}

第四步、定义DAO层

在DAO层定义并实现自己需要操作数据库表的方法,加哥在这里直接在DAO层实现并区分接口和实现类,大家可以区分开来做。

public String selectParentId(String param) throws SQLException {
    String sql = "select id from bs_structure where structure_name='" + param + "'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;

}

public String selectParentId1(String param,String param1) throws SQLException {
    String sql = "select id from bs_structure where structure_name='" + param + "' and parent_uuid= '"+param1+"'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;

}

public String selectCedianId1(String param,String param1) throws SQLException {
    String sql = "select id from bs_monitor_attr where structure_uuid='" + param + "' and tag_long_name= '"+param1+"'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;

}

public String selectObjectId(String objectType, String typename) throws SQLException {
    String sql = "SELECT id FROM `bs_object` where object_type='" + objectType + "' and type_name='" + typename + "'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;
}
public String selectObjectId1(String typename) throws SQLException {
    String sql = "SELECT id FROM `bs_object` where type_name='" + typename + "'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;
}
/**
 * 基本信息表数据填充
 *
 * @param id
 * @param structureUuid
 * @param structureInfoCode
 * @param structureinfovalue
 * @return
 */
public int insertStructure(String id, String structureUuid, String structureInfoCode, String structureinfovalue) {
    String sql = "insert into bs_structure_info (id,structure_uuid,structure_info_code,structure_info_value) values ('" + id + "','" + structureUuid + "','" + structureInfoCode + "','" + structureinfovalue + "')";

    return BaseDao.execute(sql);
}

public int insertSbtype(Structure structure) {
    Calendar cal = Calendar.getInstance();
    String utcTime=String.valueOf(cal.getTimeInMillis());
    String sql = "insert into bs_object (id,object_type,type_name,type_code) values ('" + utcTime + "','" + structure.getParam2() + "','" + structure.getParam3() + "','" + structure.getParam4() + "')";
    Calendar cal1 = Calendar.getInstance();
    String utcTime1=String.valueOf(cal1.getTimeInMillis());
    String sql1 = "insert into bs_object_param (id,object_uuid,param_uuid,param_val) values ('" + utcTime1 + "','" + utcTime + "','f4ae866d-937a-11ec-9c0b-00ff8dea45f7','')";
    BaseDao.execute(sql);
    return BaseDao.execute(sql1);
}



/**
 * 根据名称查询类型
 *
 * @param name
 * @return
 * @throws SQLException
 */
public String selectSbtypeByName(String name) throws SQLException {
    String sql = "select id from bs_object where type_name='" + name + "'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;
}

/**
 * 保存设备实例数据
 * @param id
 * @param object_uuid
 * @param structure_name
 * @param parent_uuid
 * @param if_scrap
 * @param if_logic_delete
 * @param if_restrain
 * @param object_type
 * @param structure_code
 * @param type_name
 * @param if_issued
 * @return
 */
public int saveStructure(String id, String object_uuid, String structure_name, String parent_uuid, String if_scrap, String if_logic_delete, String if_restrain, String object_type, String structure_code, String type_name, String if_issued) {
    String sql = "INSERT INTO `bs_structure` \n" +
            "\t(`id`, \n" +
            "\t`object_uuid`, \n" +
            "\t`structure_name`, \n" +
            "\t`parent_uuid`, \n" +
            "\t`if_scrap`, \n" +
            "\t`object_type`, \n" +
            "\t`structure_code`, \n" +
            "\t`type_name`, \n" +
            "\t`if_issued`\n" +
            "\t)\n" +
            "\tVALUES\n" +
            "\t('"+id+"', \n" +
            "\t'"+object_uuid+"', \n" +
            "\t'"+structure_name+"', \n" +
            "\t'"+parent_uuid+"', \n" +
            "\t'"+if_scrap+"', \n" +
            "\t'"+object_type+"', \n" +
            "\t'"+structure_code+"', \n" +
            "\t'"+type_name+"', \n" +
            "\t'"+if_issued+"'\n" +
            "\t);\n";
    return BaseDao.execute(sql);
}


/**
 * 插入数据
 *
 * @param id
 * @param objectId
 * @param pointName
 * @param tagDescribe
 * @param dataType
 * @param readOrWrite
 * @param decimal
 * @param unit
 * @param inShow
 * @param ifshow3d
 * @param ifrange
 * @return
 */
public int insertObjectMonitor(String id, String objectId, String pointName, String tagDescribe, String pointType, String dataType, String readOrWrite, String decimal, String unit, String inShow, String ifshow3d, String ifrange) {
    String sql = "insert into bs_object_monitor_attr (id,object_id,point_name,tag_describe,point_type,data_type,read_or_write,decimal_digit,unit,if_show,if_show_3d,if_ranging) values ('" + id + "','" + objectId + "','" + pointName + "','" + tagDescribe + "','" + pointType + "','" + dataType + "','" + readOrWrite + "','" + decimal + "','" + unit + "','" + inShow + "','" + ifshow3d + "','" + ifrange + "')";
    return BaseDao.execute(sql);
}


/**
 * 根据对象类型id获取测点信息数据
 *
 * @param name
 * @return
 * @throws SQLException
 */
public String selectCedianInfoByobjid(String name,String name1) throws SQLException {
    String sql = "select id from bs_object_monitor_attr where point_name='" + name + "' and object_id='"+name1+"'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;
}

/**
 * 根据单位名称获取单位的id
 * @param name
 * @return
 * @throws SQLException
 */
public String selectUnitIdByName(String name) throws SQLException {
    String sql="SELECT id FROM `bs_unit` where unit_name='"+name+"'";
    Connection connection = BaseDao.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    String id = "";
    while (resultSet.next()) {
        id = resultSet.getString(1);
    }
    BaseDao.closeAll(connection,statement,resultSet);
    return id;
}

第五步、定义Service层

在Service层定义数据的保存方法,便于处理时候调用。

 /**
     * 上一行数据的存储
     */
    public Structure afterData;

    /**
     * 数据持久化
     * @param cachedDataList
     * @throws SQLException
     */
    public void saveStructure(List<Structure> cachedDataList) throws SQLException, InterruptedException {
        System.out.println(cachedDataList);
        StructureDao structureDao =new StructureDao();
        for(int i=1;i<cachedDataList.size();i++){
            //等待

            Structure structure=cachedDataList.get(i);

            //若出现合并行将其合并行的数据填充进来
            if("".equals(structure.getParam2())||null==structure.getParam2()){
                structure.setParam2(afterData.getParam2());
            }
            if("".equals(structure.getParam3())||null==structure.getParam3()){
                structure.setParam3(afterData.getParam3());
            }
            if("".equals(structure.getParam4())||null==structure.getParam4()){
                structure.setParam4(afterData.getParam4());
            }
            if("".equals(structure.getParam5())||null==structure.getParam5()){
                structure.setParam5(afterData.getParam5());
            }
            if("".equals(structure.getParam6())||null==structure.getParam6()){
                structure.setParam6(afterData.getParam6());
            }
            if("".equals(structure.getParam7())||null==structure.getParam7()){
                structure.setParam7(afterData.getParam7());
            }
            if("".equals(structure.getParam8())||null==structure.getParam8()){
                structure.setParam8(afterData.getParam8());
            }


            //先判断第一个节点是否存在,存在的话查询它的id

            String parentID= structureDao.selectParentId(structure.getParam2());
            Calendar cal = Calendar.getInstance();
            //将点长名进行拆分
            String[] changmingchaifens=structure.getParam6().split("/");
            if(parentID==""&&parentID.equals("")){
                //获取object对应关系表
                String objectID= structureDao.selectObjectId("非设备","厂区");

                //不存在
                String preUuid =String.valueOf(cal.getTimeInMillis())+(int)(1+Math.random()*100);
                //System.out.println("preUuid0"+preUuid);
                int flag=  structureDao.saveStructure(preUuid, objectID, structure.getParam2(), "1688107649766",  "", "", "", "非设备", changmingchaifens[0], "厂区", "false");

                if(flag==1){
                    parentID=preUuid;
                }
                //提交节点的基本信息表获取数据
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentID,"type_name","厂区");
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentID,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentID,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");

            }
            //判断工艺节点是否存在
            String parentIdOfGy= structureDao.selectParentId1(structure.getParam3(),parentID);

            if(parentIdOfGy==""&&parentIdOfGy.equals("")){
                //获取object对应关系表
                String objectID= structureDao.selectObjectId("非设备","管理节点");
                TimeUnit.MILLISECONDS.sleep(1);
                //不存在
                String preUuid = String.valueOf(cal.getTimeInMillis())+(int)(1+Math.random()*100);
                int flag=  structureDao.saveStructure(preUuid, objectID, structure.getParam3(), parentID,"", "", "", "非设备", changmingchaifens[1], "管理节点", "false");
                if(flag==1){
                    parentIdOfGy=preUuid;
                }
                //提交节点的基本信息表获取数据
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfGy,"type_name","管理节点");
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfGy,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfGy,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");

            }
            //判断设备是否存在:根据他的父节点及其设备名称判断是否存在若不存在进行导入

            String parentIdOfSb= structureDao.selectParentId1(structure.getParam4(),parentIdOfGy);

            if(parentIdOfSb==""&&parentIdOfSb.equals("")){
                //获取object对应关系表
                String objectID= structureDao.selectObjectId1(structure.getParam8());
                TimeUnit.MILLISECONDS.sleep(1);
                //不存在
                String preUuid = String.valueOf(cal.getTimeInMillis())+(int)(1+Math.random()*100);
                int flag=  structureDao.saveStructure(preUuid, objectID, structure.getParam4(), parentIdOfGy,"", "", "","设备",preUuid, structure.getParam8(), "false");

                if(flag==1){
                    parentIdOfSb=preUuid;
                }

                //测点信息录入
                String preUuidcd = String.valueOf(cal.getTimeInMillis());
                String[] point_names=structure.getParam5().split("_");
                String[] tag_describes=structure.getParam7().split("_");
                String sql1="";
                if(null==structure.getParam10()&&null==structure.getParam11()){
                    //不保存数据位数
                    //System.out.println(structure.getParam6());
                    String longName="/"+structure.getParam6();

                    sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"')";

                }else{
                    String longName="/"+structure.getParam6();
                    sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name,decimal_digit,unit) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"','"+Integer.valueOf(structure.getParam10())+"','"+structureDao.selectUnitIdByName(structure.getParam11())+"')";

                }
                int flag1=BaseDao.execute(sql1);

                //根据名称查询设备类型id
                String object_id= structureDao.selectObjectId1(structure.getParam8());
                //根据测点名称判断数据是否存在
                String cedianId= structureDao.selectCedianInfoByobjid(structure.getParam12(),object_id);

                if(cedianId==""&&cedianId.equals("")){
                    //不存在
                    //将测点数据同步至设备类型对应的bs_object_monitor_attr里面
                    structureDao.insertObjectMonitor(String.valueOf(cal.getTimeInMillis()),object_id,structure.getParam12(),tag_describes[tag_describes.length-1],"",structure.getParam9(),"只读",structure.getParam10(),structureDao.selectUnitIdByName(structure.getParam11()),"1","1","1");

                }

                //提交节点的基本信息表获取数据
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"type_name",structure.getParam8());
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");
                structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");

                System.out.println("第{"+(i)+"}条数据,存储至数据库完成!");
            }else{
                //判断测点信息在不在
                //测点信息录入,根据设备id与长名判断是否一致,若不一致则录入
                String[] point_names=structure.getParam5().split("_");
                //根据测点名称判断数据是否存在
                String longName1="/"+structure.getParam6();

                String cedianId0 = structureDao.selectCedianId1(parentIdOfSb,longName1);
                if(cedianId0==""&&cedianId0.equals("")){
                    //录入
                    String preUuidcd = String.valueOf(cal.getTimeInMillis());
                    String[] tag_describes=structure.getParam7().split("_");
                    String sql1="";
                    if(null==structure.getParam10()&&null==structure.getParam11()){
                        //不保存数据位数
                        String longName="/"+structure.getParam6();

                        sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"')";

                    }else{
                        String longName="/"+structure.getParam6();

                        sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name,decimal_digit,unit) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"','"+Integer.valueOf(structure.getParam10())+"','"+structureDao.selectUnitIdByName(structure.getParam11())+"')";
                    }
                    int flag1=BaseDao.execute(sql1);

                    //根据名称查询设备类型id
                    String object_id= structureDao.selectObjectId1(structure.getParam8());

                    String cedianId= structureDao.selectCedianInfoByobjid(structure.getParam12(),object_id);
                    if(cedianId==""&&cedianId.equals("")){
                        //不存在
                        //将测点数据同步至设备类型对应的bs_object_monitor_attr里面
                        structureDao.insertObjectMonitor(String.valueOf(cal.getTimeInMillis()),object_id,structure.getParam12(),tag_describes[tag_describes.length-1],"",structure.getParam9(),"只读",structure.getParam10(),structureDao.selectUnitIdByName(structure.getParam11()),"1","1","1");

                    }
                    //提交节点的基本信息表获取数据
                 /*   structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"type_name",structure.getParam8());
                    structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");
                    structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");
*/
                    System.out.println("第{"+(i)+"}条数据,存储至数据库完成!");
                }else {
                    System.out.println("第{"+(i)+"}条数据已存在,已跳过该条记录!");
                }

            }
            //数据缓存
            afterData=cachedDataList.get(i);
        }
    }

第六步,使用EasyExcel批量读取并保存数据

大家可以打开easyexcel官网选择自己适合的读取方法,下面展示出来的仅是一种,读取数据并保存数据,在保存数据里面替换成自己的service层的保存方法即可。

String fileName = "D:\\实例表.xlsx";

// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, Structure.class, new ReadListener<Structure>() {
    /**
     * 单次缓存的数据量
     */
    public static final int BATCH_COUNT = 1000;
    /**
     *临时存储的数据
     */
    private List<Structure> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);


    @Override
    public void invoke(Structure data, AnalysisContext context) {
        cachedDataList.add(data);
        if (cachedDataList.size() >= BATCH_COUNT) {
            try {
                saveData();
            } catch (SQLException | InterruptedException e) {
                e.printStackTrace();
            }finally {
                // 存储完成清理 list
                cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
            }
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        try {
            saveData();
        } catch (SQLException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 加上存储数据库
     */
    private void saveData() throws SQLException, InterruptedException {
        StructureService structureService=new StructureService();
        structureService.saveStructure(cachedDataList);
    }
}).sheet().doRead();

第七步,去数据库查看是否存储成功并检查数据是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/93553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-455-分发饼干-贪心算法

题目描述&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff…

AM62x GPMC并口如何实现“小数据-低时延,大数据-高带宽”—ARM+FPGA低成本通信方案

GPMC并口简介 GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口&#xff0c;支持8/16bit数据位宽&#xff0c;支持128MB访问空间&#xff0c;最高时钟速率133MHz。GPMC是AM62x、AM64x、AM437x、AM335x、AM57x等处理器专用于与外部存储器设备的接口…

Hive/Spark 整库导出/导入脚本

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

mysql57、mysql80 目录结构 之 Windows

查看mysql 数据存储的位置 /bin&#xff1a;存储可执行文件&#xff0c;主要包含客户端和服务端启动程序&#xff0c;如mysql.exe、mysqld.exe等 /docs&#xff1a;存放一些文档 /include&#xff1a;用于放置一些头文件&#xff0c;如&#xff1a;mysql.h、mysqld_error.h 等 …

taro react/vue h5 中的上传input onchange 值得区别

<inputclassNamebase-input-file-h5typefileacceptimage/*capturecameraonChange{onChangeInput} />1、taro3react 2、taro3vue3

古典加密的C++实现——凯撒密码、单表代换密码

&#x1f64c;秋名山码民的主页 &#x1f602;一个打过一年半的oier&#xff0c;写过一年多的Java&#xff0c;啥都会干一点的普通本科生 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f64f;作者水平有限&#xff0c;如发现错误&…

Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用

如果你需要一个简单的APP设置&#xff0c;可以使用sharedPreferences进行存储&#xff0c;我们可以借助AndroidStudio快速创建一个用于设置的Activity&#xff0c;其实它是继承PreferenceFragmentCompat&#xff0c;存储方式用的就是sharedPreferences&#xff0c;只是帮我们节…

vue使用vant中的popup层,在popup层中加搜索功能后,input框获取焦点 ios机型的软键盘不会将popup顶起来的问题

1.使用vant的popup弹出层做了一个piker的选择器,用户需要在此基础上增加筛选功能。也就是输入框 2.可是在ios机型中,input框在获取焦点以后,ios的软键盘弹起会遮盖住我们的popup层,导致体验不是很好 3.在大佬的解答及帮助下,采用窗口滚动的方式解决此方法 <Popupv-model&q…

docker的安装以及基本操作

一.认识docker Docker是一种用于构建、打包和运行应用程序的开源平台。它基于操作系统级虚拟化技术&#xff0c;可以将应用程序和其依赖的库、环境等资源打包到一个可移植的容器中&#xff0c;形成一个轻量级、独立的可执行单元。 开发者在本地编译测试通过的容器可以批量地在…

主流深度学习框架及神经网络模型汇总

目录 主流深度学习框架及神经网络模型汇总 一、人工智能的研究领域和分支 二、主流深度学习框架​编辑 1.TensorFlow 2.PyTorch 3.PaddlePaddle 4.Keras 5.Caffe/Caffe2 6.MXNet 7.Theano 8.Torch 9.CNTK 10.ONNX 三、深度学习移动端推理框架 1.TensorRT 2.TF-…

前端将file文件传给后台,后台将文件传给前台(包含上传下载)

前端将file文件传给后台&#xff0c;后台将文件传给前台&#xff08;包含上传下载&#xff09; 在开发过程中&#xff0c;经常会遇见对文件的处理。 例如&#xff1a;在上传、下载文件时&#xff0c;需要在前端选完文件传到后台传到服务器&#xff1b;或者文件从后台&#xf…

Mybatis缓存

缓存(cache&#xff09;的作用是为了减去数据库的压力&#xff0c;提高查询性能。缓存实现的原理 是从数据库中查询出来的对象在使用完后不要销毁&#xff0c;而是存储在内存&#xff08;缓存&#xff09;中&#xff0c; 当再次需要获取该对象时&#xff0c;直接从内存&#xf…

Docker部署项目

相关系列文章&#xff1a; 1、DockerHarbor私有仓库快速搭建 2、DockerJenkinsHarbor 3、Docker安装Mysql、Redis、nginx、nacos等环境 1、jenkins构建前端并上传服务器 在这篇文章中(DockerJenkinsHarbor)未完成前端的远程部署&#xff0c;这里对前端vue工程进行编译打包并上…

学习ts(十)装饰器

定义 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上&#xff0c;是一种在不改变原类和使用继承的情况下&#xff0c;动态的扩展对象功能。 装饰器使用expression形式&#xff0c;其中expression必须…

【C++】—— C++11新特性之 “右值引用和移动语义”

前言&#xff1a; 本期&#xff0c;我们将要的介绍有关 C右值引用 的相关知识。对于本期知识内容&#xff0c;大家是必须要能够掌握的&#xff0c;在面试中是属于重点考察对象。 目录 &#xff08;一&#xff09;左值引用和右值引用 1、什么是左值&#xff1f;什么是左值引用…

政务大厅人员睡岗离岗玩手机识别算法

人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型&#xff0c;人员睡岗离岗玩手机识别算法利用图像识别和行为分析&#xff0c;识别出睡岗、离岗和玩手机等不符合规定的行为&#xff0c;并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…

Linux————LNMT搭建

一、原理 搭建一个基于Linux系统的Web服务器&#xff0c;使用Nginx作为反向代理服务器&#xff0c;Tomcat作为应用服务器&#xff0c;MySQL作为数据库服务器。 Linux操作系统 基于Linux的操作系统 Nginx Nginx是一款高性能的Web服务器和反向代理服务器&#xff0…

基于Java+SpringBoot+Vue前后端分离图书管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

svn软连接和文件忽略

软连接 1)TortoiseSVN->Properties->New->Externals->New 2)填入软连接信息 Local path: 写下软连接后的文件夹的名字 URL: 想要软连接的牡蛎->TortoiseSVN->Repo-browser 复制下填入 文件忽略 以空格隔开就行

C++:list使用以及模拟实现

list使用以及模拟实现 list介绍list常用接口1.构造2.迭代器3.容量4.访问数据5.增删查改6.迭代器失效 list模拟实现1.迭代器的实现2.完整代码 list介绍 list是一个类模板&#xff0c;加<类型>实例化才是具体的类。list是可以在任意位置进行插入和删除的序列式容器。list的…