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

news2024/12/23 12:36:01

场景:加哥最近在做项目时,苦于系统自身并未提供数据批量导入的功能还不能自行添加上该功能,且自身不想手动一条一条将数据录入系统。随后,自己使用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();

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

芯片行业入行小知识,快速学习!

进入芯片行业是一个充满挑战但又充满机会的领域。无论是作为工程师、设计师、销售人员还是管理者&#xff0c;以下是一些有关芯片行业入行的小知识。 1、什么是IC 集成电路的英文简称叫IC&#xff0c;IC即integrated circuit。如果有人和你说他做的是IT行业&#xff0c;那么你…

数字孪生能为教育事业带来什么新变化?

随着科技的飞速发展&#xff0c;数字孪生作为一种创新性技术&#xff0c;正在逐渐在各个领域展现出巨大的潜力。其中&#xff0c;教育领域也开始积极探索数字孪生的应用&#xff0c;为学习和教育带来了新的可能性和改变。在教育中&#xff0c;数字孪生可以用于创造具有真实性的…

Me-and-My-Girlfriend靶场

靶机下载&#xff1a; https://www.vulnhub.com/entry/me-and-my-girlfriend-1,409/ 一、信息收集 查找ip nmap -sP 192.168.16.0/24获取详细端口等信息 nmap -sV -sC -A -p 1-65535 192.168.16.209目录扫描 gobuster dir -u http://192.168.16.209 -w /usr/share/word…

无脑入门pytorch系列(五)—— nn.Dropout

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

Seaborn数据可视化(三)

1.绘制直方图 使用displot()绘制直方图。 import seaborn as sns import numpy as np import matplotlib.pyplot as plt# 生成随机数据 np.random.seed(0) data np.random.randn(1000)# 使用displot绘制直方图 sns.displot(data, bins10, kdeTrue)# 展示图形 plt.show() 结…

山西电力市场日前价格预测【2023-08-23】

日前价格预测 预测明日&#xff08;2023-08-23&#xff09;山西电力市场全天平均日前电价为327.31元/MWh。其中&#xff0c;最高日前电价为363.47元/MWh&#xff0c;预计出现在19: 45。最低日前电价为283.86元/MWh&#xff0c;预计出现在03: 30。 价差方向预测 1&#xff1a; 实…

mysql Left Join on条件 where条件的用法区别

数据准备 SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.idt2.id; 执行结果 SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.idt2.id and t2.localbeijing; SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.idt2.id where t2.localbeijing…

微服务之光:探索代码质量的新维度

在当今的软件开发领域&#xff0c;微服务架构已经成为了一种主流的设计模式。但随着其带来的灵活性和可扩展性&#xff0c;也带来了一系列的挑战&#xff0c;尤其是在代码质量管理方面。本文将深入探讨如何在微服务架构中确保代码的质量&#xff0c;并提供一些实践策略和工具。…

Docker容器与虚拟化技术:Docker consul 实现服务注册与发现

目录 一、理论 1.Docker consul 二、实验 1.consul部署 2. consul-template部署 三、总结 一、理论 1.Docker consul &#xff08;1&#xff09;服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&…

系统架构设计师之缓存技术:Redis与Memcache能力比较

系统架构设计师之缓存技术&#xff1a;Redis与Memcache能力比较

中国算力大会丨看看中兴新支点国产系统如何提升算力

近日&#xff0c;由工业和信息化部、宁夏回族自治区人民政府共同主办的2023中国算力&#xff08;基础设施&#xff09;大会在宁夏银川拉开帷幕&#xff0c;为期三天的“算力中国”创新成果展精彩亮相。中兴新支点国产操作系统的亮相&#xff0c;引起现场众多嘉宾前来了解。 “中…

Android类加载机制

要说Android的类加载机制 &#xff0c;就离不开 类加载器ClassLoader&#xff0c;它是一个抽象接口 下面这个图还是比较好表达了类加载流程&#xff0c;但如果不看我红色画的线&#xff0c;就会感觉有点乱&#xff0c;需要注意是采用的是双亲委派模式&#xff0c;class加载要先…

​Softing dataFEED OPC Suite——助力数字孪生技术发展

一 行业概览 数字孪生技术是充分利用物理模型、传感器更新、运行历史等数据&#xff0c;集成多学科、多物理量、多尺度、多概率的仿真过程&#xff0c;在虚拟空间中完成映射&#xff0c;从而反映相对应的实体装备的全生命周期过程。数字孪生技术已经应用在众多领域&#xff1a…

[C++] string类常用接口的模拟实现

文章目录 1、前言2、遍历2.1 operator[ ]下标方式2.2 迭代器2.3 范围for2.4 c_str 3、容量相关3.1 size&#xff08;大小&#xff09;3.2 capacity&#xff08;容量&#xff09;3.3 empty&#xff08;判空&#xff09;3.4 clear&#xff08;清理&#xff09;3.5 reserve3.6 res…

ZooKeeper各服务器角色介绍

1 Leader Leader服务器是整个ZooKeeper集群工作机制中的核心&#xff0c;其主要工作有以下两个。 事务请求的唯一调度和处理者&#xff0c;保证集群事务处理的顺序性。 集群内部各服务器的调度者。 请求处理链 使用责任链模式来处理每一个客户端请求是ZooKeeper的一大特色。…

如何制作gif动态图片?多图片转gif的简单方法

看到网上各种各样的表情包&#xff0c;自己也想试试&#xff0c;怎么将多张图片进行gif合成&#xff08;https://www.gif.cn&#xff09;呢&#xff1f;可以在线生成gif动图的方法&#xff0c;打开浏览器就可以完成gif图片制作&#xff0c;下面是具体步骤。 打开网站&#xff…

亿发智能制造MES系统-实现互联网时代下贵州制造业全流程高效生产

在工业4.0和智能制造的推动下&#xff0c;贵州省制造类企业对于MES系统的建设需求逐年增长&#xff0c;日益认识到智能制造MES系统的重要性。不单是行业的助推器&#xff0c;更是企业走向智能化制造的重要环机。选择适合企业特点的智能制造MES系统&#xff0c;助力贵州省制造业…

Spring6.0官方文档示例:(28)多种方式添加BeanPostProcessor

一、定义三个BeanPostProcessor package cn.edu.pku;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component;Component public class MyScannedBeanPostPr…

RHCE——五、Web服务器及内网穿透(实验篇)

Web服务器篇 一、快速搭建网站二、更改网页启动目录三、内网穿透1、准备工作2、搭建网站3、测试&#xff1a;浏览器中输入ip进行测试4、使用花生壳进行内网穿透4.1 注册并登陆4.2 点击添加映射4.3 Linux安装花生壳客户端 5、注意 四、搭建具有身份验证功能网站1、准备工作2、编…

发票的种类

目录 增值税专用发票 增值税普通发票 增值税电子普通发票 机打式发票 定额发票 机动车销售统一发票 增值税专用发票 填写增值税发票时&#xff0c;单位全称、纳税人识别号、统一信用代码必填项且正确无误。专票必须填写&#xff0c;普票可不填写&#xff0c;若填写则必须…