这里用的mybatis-flex框架+达梦数据库
需求为,做个通用语句,只传入任意表名称,就能把该表所有数据返回,并且把值为null的处理成/
注意!每个表字段都不一样,我只知道表名,不知道该表有哪些字段的情况!
@GetMapping("test2")
public List<Row> test2() {
//如果只知道表名 不知道字段名。需求又是把null字段的设置成/或者'' 可以这样做
//达梦数据库
String tableName = "CODE_AUDIT_RESULTS";//用这个表做为案例
//只传入一个表名 查询该表的所有字段名称
String sqlTableName = "select DISTINCT(COLUMN_NAME) from all_tab_columns where owner='DYKJ_DREMIS_CODE' and Table_Name='" + tableName + "'";
List<Row> columnsName = Db.selectListBySql(sqlTableName);
//拼接字段名并且对每个字段名进行处理
StringBuilder str = new StringBuilder();
int i = 0;
if (CollectionUtil.isNotEmpty(columnsName)) {
for (Row row : columnsName) {
String resultsTableNameColumn=row.get("columnName").toString();
if(i>0){//除了第一次都需要拼接,
str.append(",");
}
str.append("IFNULL(").append(resultsTableNameColumn).append(",'/') ").append(resultsTableNameColumn);
i++;
}
}
//进行查询获取最终结果
String sql = "select " + str + " from DYKJ_DREMIS_CODE." + tableName;
if (str.indexOf("DISPLAY") != -1) {//判断StringBuilder中是否包含 如果包含就执行拼接sql条件
sql += " where display!=0";//display为1是代表可使用 为0代表不可使用
}
List<Row> columns = Db.selectListBySql(sql);
//----start 以下是题外的小知识 转换另一个实体对象
//方式1 stream流
List<Dict> dicts = columns.stream().map(column -> {
Dict dict = column.toEntity(Dict.class);
return dict;
}).collect(Collectors.toList());
//方式2 mybatis-flex自带的工具类(点赞!工具类好用)
List<Dict> dicts1 = RowUtil.toEntityList(columns, Dict.class);
//----end
return columns;
}
最终效果,把数据库中字段为null的设置成/。但并没有真正的改变数据库中值null变为/。只是返回集合中是/的效果。如果想改变数据库的话,可以循环遍历做修改操作,这里就不演示了。如果对您有帮助,请点赞。
第二种方案也很简单,需要设置配置文件
@GetMapping("test")
public List test() {
String tableName = "CODE_AUDIT_RESULTS";//用这个表做为案例
//根据表名查询该表的数据
String sql = "select * from DYKJ_DREMIS_CODE."+tableName;
List<Row> columns = Db.selectListBySql(sql);
List<Map<String, Object>> rowList = new ArrayList<>();
for (Row row : columns) {
Map<String, Object> columnMap = new HashMap<>();
for (String key : row.keySet()) {
// 获取字段名称和对应的值
Object value = row.get(key);
// 在这里处理字段名称和对应的值 如果为null的就给设置成/
columnMap.put(key, Objects.isNull(value) ? "/" : value);
}
rowList.add(columnMap);//把处理后的进行保存到该集合
}
return rowList;
}
code数据库表字段都一样 既然都一样那么就用通用code实体类Dict
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dict {
private String tableName;
/**
* 编号
*/
private String code;
/**
* 名称
*/
private String nameC;
/**
* 拼音码
*/
private String spell;
/**
* 排序
*/
private Integer sort;
/**
* 是否可见
*/
private String display;
private String aliasName;
private String codegb;
private String nameCgb;
/**
* 父类编码
*/
private String fcode;
}
最后记住以下达梦数据库查询sql,很有用
//查询该模式下 所有的表名
select TABLE_NAME from dba_tables where owner='模式名'
//根据模式名和表名 查该表的字段信息
select * from all_tab_columns where owner='模式名' and Table_Name='表名'