一. 首先,在数据库有一张对应的表:
二. controller层代码如下:
@PutMapping("/dynamicallyTable")
public AjaxResult dynamicallyTable(@RequestBody Data data){
List<Template> list = templateService.DynamicallyTable(data.getSid());//此处是判断表内是否有数据,有则可以继续向下执行,无则return "false"
if (list.size()==0){
return AjaxResult.success("未设置模板消息,请设置模板信息",false);
}
Project tablename = (Project) templateService.creatTableName(data.getSid());
String name = tablename.getYear() + "_" + tablename.getName() + "_" + tablename.getStages().getName();//这里是应需求动态拼接的表名
Map<String, String> mymap = new HashMap<>(); //使用map的key,value进行存值,key:"存的是field" ,value:"存储的是type"
for (Template template : list) {
String type = template.getType();
String field = template.getField();
mymap.put(field, type);//遍历template中的值将其分别存储到key,value中
}
templateService.creatTemplateTable(name, mymap);//此处的name为表名
iStageService.updateByStageId(data.getSid(), name);
return AjaxResult.success("成功生成定稿表");
}
三 . Service接口及其实现类:
3.1 Service接口代码如下:
/**
* @Param name : 动态生成表的表名
* @Param mymap: 表的列名及类型
*/
public void creatTemplateTable(String name, Map<String, String> mymap);
3.2 Service接口实现类代码如下:
/**
* @Param name : 动态生成表的表名
* @Param mymap: 表的列名及类型
*/
@Override
public void creatTemplateTable(String name, Map<String, String> mymap) {
templateMapper.creatTemplateTable(name,mymap);
}
四, Mapper接口及其Mapper.xml
4.1 Mapper接口:
/**
* @Param name : 动态生成表的表名
* @Param mymap: 表的列名及类型
*/
public void creatTemplateTable(@Param("name") String name,@Param("mymap") Map<String, String> mymap);
4.2 Mapper.xml:
<update id="creatTemplateTable" parameterType="map">
create table ${name} (
`id` int(11) NOT NULL AUTO_INCREMENT,
<foreach collection="mymap" index="key" item="value" separator=",">
${key} ${value}(4000)
</foreach>
,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
</update>