前言
之前写过一个JDBC工具类,里面有获取所有表名、字段、字段类型等(还在不断更新功能中…),之前项目有个需求,前端人员将一个关联表id给我,我查出有存储多少个表名,在把这些表的字段和类型都集合在一起返回给他,每个字段、字段类型都有边上跟着一张表,那好,我就封装了一个对象返回,接下来实践一下。
返回对象
/**
* @Author: ChenBin
* @Date: 2018/6/26/0026 14:36
*/
public class SelectDbDTO {
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 所属表名称
*/
private String toTable;
/**
* 拼接表名称和字段名称
* @return
*/
private String tableAndField;
public SelectDbDTO(String fieldName, String fieldType, String toTable) {
this.fieldName = fieldName;
this.fieldType = fieldType;
this.toTable = toTable;
this.tableAndField = toTable + "." + fieldName;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldType() {
return fieldType;
}
public void setFieldType(String fieldType) {
this.fieldType = fieldType;
}
public String getToTable() {
return toTable;
}
public void setToTable(String toTable) {
this.toTable = toTable;
}
public String getTableAndField() {
return tableAndField;
}
public void setTableAndField(String tableAndField) {
this.tableAndField = tableAndField;
}
@Override
public String toString() {
return "SelectDbDTO{" +
"fieldName='" + fieldName + '\'' +
", fieldType='" + fieldType + '\'' +
", toTable='" + toTable + '\'' +
", tableAndField='" + tableAndField + '\'' +
'}';
}
}
不难看出,这个对象将前端需要的数据都列成了属性,为了不混淆,加了一个tableAndField属性,在构造方法中,将属性赋值,一点不同的是,tableAndField是拼接在一起的
实现方法
/**
* 将字段类型、字段名称以及所属表名称封装成对象集合返回
* @param templateId 模版字段
* @return
*/
@GetMapping("/selectDb")
public Result selectDb(@RequestParam String templateId){
List<SelectDbDTO> list = new ArrayList<>();
//找出所有表
List<EdTemplateTable> tables = edTemplateTableMapper.findByTableName(templateId);
//找出数据库配置
EdTemplateDbconfig dbConfig = edTemplateDbconfigMapper.findByTemplate(templateId);
EdDbtype edDbtype = edDbtypeService.get(dbConfig.getDbtypeId());
dbConfig.setDbtypeId(edDbtype.getDriverClass());
//解密
dbConfig.setPassword(CryptoUtil.decode(Constant.KEY, dbConfig.getPassword()));
for (EdTemplateTable table : tables) {
//获取字段名称
List<String> columnNames = DataBaseUtil.getColumnNames(dbConfig, table.getTableName());
//获取字段类型
List<String> columnTypes = DataBaseUtil.getColumnTypes(dbConfig, table.getTableName());
//create方法返回封装的对象结合
List<SelectDbDTO> dtos = this.create(columnNames, columnTypes, table.getTableName());
list.addAll(dtos);
}
return ResponseMsgUtil.success(list);
}
/**
* 字段名称长度和字段类型长度是对应的,根据字段循环
* 每次循环创建一个对象,将值通过构造传入,再添加到List中
* @param columnNames 字段名称集合
* @param columnTypes 字段类型集合
* @param tableName 表名
* @return
*/
public List<SelectDbDTO> create(List<String> columnNames, List<String> columnTypes, String tableName){
List<SelectDbDTO> list = new ArrayList<>();
for (int i = 0; i < columnNames.size(); i++) {
SelectDbDTO selectDbDTO = new SelectDbDTO(columnNames.get(i), columnTypes.get(i), tableName);
list.add(selectDbDTO);
}
return list;
}
说明:首先根据这个ID查询它在数据库中存了多少张表是要用的,接着找出这个ID在数据库的保存的配置信息(这是工作流程,可以根据个人情况而定义),重点来了,根据查出的所有表List集合进行循环,因为如果两张表,工具类会找出两张表的字段,每循环一次,获取一次这张表的字段类型和名称,通过create
方法,把这些数据赋值到对象里;
看一下这个create
方法,因为是在循环里,肯定是会出现多个selectDbDTO
对象的,需要一个List装载,通过工具类找出来的字段名称集合以及字段类型集合数组大小肯定是对应的1:1关系,随便选一个的长度进行循环,创建对象,通过构造方法赋值,接着装载进创建好的List中,等循环结束,这个对象集合或许已经有N个对象了,一张表多个字段类型以及名称,在循环外返回回去。
回到最初的循环,在循环内将create
返回的集合拿到,与最外的对象List通过addAll
拼接,返回给前端的数据类型就是这样的格式:
"data": [
{
"fieldName": "id",
"fieldType": "INT",
"tableAndField": "md_water_system.id",
"toTable": "md_water_system"
},
{
"fieldName": "row_version",
"fieldType": "VARCHAR",
"tableAndField": "md_water_system.row_version",
"toTable": "md_water_system"
},
{
"fieldName": "water_name",
"fieldType": "VARCHAR",
"tableAndField": "md_water_system.water_name",
"toTable": "md_water_system"
},
{
"fieldName": "water_code",
"fieldType": "VARCHAR",
"tableAndField": "md_water_system.water_code",
"toTable": "md_water_system"
},
{
"fieldName": "basin_code",
"fieldType": "VARCHAR",
"tableAndField": "md_water_system.basin_code",
"toTable": "md_water_system"
},
{
"fieldName": "over_view",
"fieldType": "VARCHAR",
"tableAndField": "md_water_system.over_view",
"toTable": "md_water_system"
},{
"fieldName": "id",
"fieldType": "INT",
"tableAndField": "md_drainage_basin.id",
"toTable": "md_drainage_basin"
},
{
"fieldName": "row_version",
"fieldType": "VARCHAR",
"tableAndField": "md_drainage_basin.row_version",
"toTable": "md_drainage_basin"
},
{
"fieldName": "basin_name",
"fieldType": "VARCHAR",
"tableAndField": "md_drainage_basin.basin_name",
"toTable": "md_drainage_basin"
},
{
"fieldName": "basin_code",
"fieldType": "VARCHAR",
"tableAndField": "md_drainage_basin.basin_code",
"toTable": "md_drainage_basin"
},
{
"fieldName": "over_view",
"fieldType": "VARCHAR",
"tableAndField": "md_drainage_basin.over_view",
"toTable": "md_drainage_basin"
},
{
"fieldName": "sort_order",
"fieldType": "INT",
"tableAndField": "md_drainage_basin.sort_order",
"toTable": "md_drainage_basin"
}
]
可以看出toTable
是两张表的,每张表的字段类型和名称都结合在了一起,达到了前端的需求,又要表又要字段类型又要字段名称对应,笔者只是给大家提供一个思路,可以自由发挥