在做项目时候,我需要进行查询一个未知的表,而且不止一个表,这也是我第一次做,于是我便记录了一下
我先分析一下,MyBatis会返回我什么数据?对象?对象格式是什么?我应该怎么接收?
对象格式是键值对的,字段名:值 所有我们应该用map来接收,所以就是Map<String,Object>
查询的数据不可能是一个对象,所以应该用List,结合map,我们的格式就是List<Map<String.Object>>,返回值问题解决;
既然最难的问题解决了,那么我们直接开始查询我先上Controller代码
@GetMapping("/你的路径")
@ApiOperation(value = "查询指定字段为空的表数据")
@ApiImplicitParams({
@ApiImplicitParam(name = "schemaName",value = "数据库名称(String)" , dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "tableName",value = "数据表名称(String)" , dataType = "String", paramType = "query")
})
public List<Map<String,Object>> findDataColumn(String schemaName,String tableName){
//拼接一下sql查询 数据库名称.数据表 这样可以跨数据库查询
String schemaTable =schemaName+"."+tableName;
//根据数据库名和表名查询数据库指定字段为null的字段
List<Map<String,Object>> columnNameValues = ylCodeBaseService.findColumnNameValue(schemaTable);
return columnNameValues;
}
Mapper层和service层,我只放一个因为都一样
List<Map<String,Object>> findColumnNameValue(String schemaTable);
serviceImpl层
@Override
public List<Map<String,Object>> findColumnNameValue(String schemaTable) {
return baseMapper.findColumnNameValue(schemaTable);
}
mapper.xml文件的SQL语句:
<select id="findColumnNameValue" resultType="java.util.Map">
select * from ${schemaTable}
</select>
到此,这就完成了,但是有个bug,就是MyBatis查询出来字段值为null的字段,都不会返回给前端(使用MyBatis-plus的bug,不知道MyBatis有没有),这可就不行了,需要更改MyBatis-plus配置,因为我是使用Springboot,所以需要在yml文件更改就行了
mybatis-plus:
configuration:
call-setters-on-nulls: true
至此,问题解决