【postgreSql】mybatis修改数据库驼峰字段转为蛇形字段
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近在做MySQL适配postgreSql数据库,因MySQL表字段名均为驼峰,且psql语句不识别驼峰字段,适配方案原本有两种:
A、不改表结构,只改实现层
B、更改表结构,并改实现层
最终采取了B方案,只是因为驼峰命名实在太坑了 -_- ,mybatis_puls的查询构造和条件构造均不能为驼峰字段的首尾拼接双引号,导致使用mybatis_puls的增删改查均报错,最终的解决方案只能是修改mybatis的源码,遂放弃。
记录修改表字段的代码:
@Transactional(rollbackFor = {Exception.class, Error.class})
public void test(){
//获取所有表名
List<String> tableNames = baseMapper.getTableNameList();
//循环更改每张表字段
tableNames.forEach(t -> {
StringBuilder sql = new StringBuilder();
//获取所有字段名
List<String> columns = baseMapper.getColumnNameList(t);
//将驼峰转为蛇形
columns.forEach(c -> {
List<String> oldAndNew = toSerpentine(c);
Optional.ofNullable(oldAndNew).ifPresent(f -> {
//需转换的字段
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(" ALTER TABLE public.")
.append(t)
.append(" RENAME COLUMN ")
.append(oldAndNew.get(0))
.append(" to ")
.append(oldAndNew.get(1))
.append(" ;");
sql.append(stringBuilder);
});
});
System.out.println("执行的SQL: " + sql);
baseMapper.modifyFields(sql.toString());
System.out.println("成功更改表: " + t);
});
}
/**
*将驼峰字符串转为蛇形
* 注:连续大写将会改为分字符蛇形,如: ID -> i_d
*/
public static List<String> toSerpentine(String selected) {
//正则判断是否存在大写字母
String regular = ".*[A-Z]+.*";
if (!selected.matches(regular)) {
return null;
}
//存入修改前后的字段名
List<String> list = new ArrayList<>();
//postgreSql驼峰字段必须用双引号指明其为表或列名,否则将找不到列
list.add("\"" + selected + "\"");
selected = selected.replaceAll("[A-Z]", "_$0");
selected = selected.toLowerCase();
if (selected.charAt(0) == '_') {
selected = selected.substring(1);
}
list.add(selected);
return list;
}