前提
我们的业务上会有各种各样的表单,常规的开发是一个表单,我们一般会在数据库里面建立一个对应的表,然后在代码中建立一个model与之对应,一旦建立好以后,就不能再对表单进行修改了,如果需要修改,就需要修改数据库表,修改model重新发版上线,对于频繁需要表单变更的情况来说很不友好。那么有没有方法可以对现有表单的列进行增删改甚至动态生成一个表单呢?这样的话表单变动就不用发版重新上线了,岂不美哉。解决办法自然是有的。
方案
整体思路就是数据库行转列,在java层面动态生成VO返回给前台。
具体实现
使用Mybatis3.4.6 + mysql5.7.26 + cglib3.2.5 + cglib-nodep3.2.5来进行实现
1.sql:CreateDB.sql
drop table if exists form_metadata;
CREATE TABLE form_metadata
(
ID int AUTO_INCREMENT,
name varchar(100) comment '列名',
property varchar(100) comment '属性名',
property_type varchar(100) comment '属性类型',
form_type int comment '表单类型 1 请假表 2 支付表 3 报销表',
PRIMARY KEY (ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci;
drop table if exists form_data;
CREATE TABLE form_data
(
ID int AUTO_INCREMENT,
property varchar(100) comment '属性名',
`value` varchar(100) comment '属性值',
form_type int comment '表单类型',
row_id int comment '行数据ID,区分一行数据',
user_id int comment '用户ID',
PRIMARY KEY (ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci;
insert into form_metadata (name, property, property_type, form_type) values ("主键", "id", "java.lang.String", 1);
insert into form_metadata (name, property, property_type, form_type) values ("姓名", "name", "java.lang.String", 1);
insert into form_metadata (name, property, p