【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;
    }