你要动态建表,还要动态导入Excel?

背景

⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7400945359192866828
前几天和公司的小伙伴聊天的时候,得知他们的项目里正要做一个功能。大概就是每家公司都会建一张表,这张表会有什么字段不确定,可能有的表10个字段,有的8个字段。然后会有导入的功能,就是给这张表导入数据。

经过一番讨论之后,得出了两套在不同应用场景的下的方案,觉得还是有一定可行性的,所以简单写篇文章分享一下,给看到这篇文章并且有相关需求的小伙伴们提供一些思路。本文只介绍方案,不涉及代码实现。

方案一: 给每张表都建一个实体类

因为是给每家有需要的公司建一张表,如果接入的公司数量不是太多并且两家接入公司的时间间隔比较长的情况,比如这个功能一共只会有十来家公司会用,而且可能一个月才会接入一家公司。那么手动地给公司建一张表,并且建一个实体类就可以了。

这也是平时做导入功能比较常见的做法,可以用Easyexcel这样现成的工具将数据解析成对应的实体类,然后针对实体类做相应的校验,然后保存到数据库中。

方案二:没有实体类实现导入功能

我们先来说说有实体类的情况。是不是Excel表中的一行数据对应一个实体类,每一列对于实体类中的一个字段。所以说,如果没有实体类,要解决的问题就是Excel中的一行数据与什么对应?每一列又与什么对应?

看一下上面这张图,常规则做法是用一个实体类UserEntity接收一行数据,最后转换成的数据就是List<UserEntity>,但是如果没有UserEntity怎么办呢?

思考一下,UserEntity是不是有若干个字段,然后我们给这若干个字段赋上值。这是不是和一个Map很像,所以可以用一个Map来接收一行数据,那么上图就是List<Map<String,String>>。解析出来的数据大概就是:

[
    {
        "姓名": "张三",
        "手机号": "18812341234",
        "年龄": "11",
        "性别": "男"
    },
    {
        "姓名": "张四",
        "手机号": "18812341234",
        "年龄": "12",
        "性别": "男"
    },
    {
        "姓名": "张五",
        "手机号": "18812341234",
        "年龄": "13",
        "性别": "男"
    }
]

现在要解决的问题就是,Map的key与value与数据库中的哪个表中的哪个字段对应?

所以需要两张配置表,来配置一下对应关系。

首先,前面说过是一个公司对一张表,所以先要一张公司与数据表对应关系表:

CREATE TABLE `company_table`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `company_id` bigint NOT NULL COMMENT '公司id',
  `company_name` varchar(50) NOT NULL COMMENT '公司名称',
  `table_name` varchar(50) NOT NULL COMMENT '表名称',
  `table_desc` varchar(255) NOT NULL COMMENT '表备注',
  PRIMARY KEY (`id`)
)COMMENT = '公司表配置表';

然后表中有哪些字段,也需要一张配置表,

CREATE TABLE `company_table_field`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `company_id` bigint NOT NULL COMMENT '公司id',
  `company_name` varchar(50) NOT NULL COMMENT '公司名称',
  `company_table_id` bigint NOT NULL COMMENT '公司表配置表主键id',
  `table_name` varchar(50) NOT NULL COMMENT '表名称',
  `field_name` varchar(50) NOT NULL COMMENT '字段名',
  `field_excel_name` varchar(50) NOT NULL COMMENT '字段在excel中的名称',
  `filed_check_rule` varchar(50) NOT NULL COMMENT '字段校验规则',
  `filed_data_convert_rule` varchar(50) NOT NULL COMMENT '字段数据转换规则',
  `filed_sort` int NOT NULL COMMENT '字段排序',
  PRIMARY KEY (`id`)
) COMMENT = '公司表字段配置表';

这样导入的时候,通过公司id查询company_table表,就可以知道将要导入的是哪张数据库表,然后再关联查询company_table_field表,就可以知道这张数据库表,有哪些字段。

解析的时候,拿到的是中文的字段名。但是数据表的字段名,一般都是英文的,比如name,age等,所以通过company_table_field表中配置的的field_name和field_excel_name就可以知道Excel中的字段名与数据库中字段名的对照关系,然后与对应上相应的数据库表字段。

其中还有两个字段需要注意,一个是filed_check_rule,这个表示了字段使用哪个校验规则去校验数据的正确性。可以采用逗号分隔的方式配置多个校验规则,比如手机号校验、身份证号校验,唯一性校验等。filed_data_convert_rule则是配置了字段的转换规则,比如性别是男女,但是我在数据库中我想用1,2表示男女,所以可以配置对应的转换规则去进行数据转换。

这样,通过配置表,我知道了是哪张数据表,表有哪些字段,对应关系是什么。剩下的,就是解析Excel并且拼接插入的sql语句,就可以实现动态导入Excel数据了。

我暂时就想到这么多,如果有更复杂的规则,小伙伴们可以思考如何修改或者扩展配置表从而适应更加复杂的场景。

⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7400945359192866828

如果您觉得文章还不错,请给我来个点赞收藏关注

学习更多编程知识,点击下方小卡片扫描二维码关注微信公众号『 R o b o d 』:
code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值