栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【postgreSql】mybatis修改数据库驼峰字段转为蛇形字段

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【postgreSql】mybatis修改数据库驼峰字段转为蛇形字段

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

最近在做MySQL适配postgreSql数据库,因MySQL表字段名均为驼峰,且psql语句不识别驼峰字段,适配方案原本有两种:
A、不改表结构,只改实现层
B、更改表结构,并改实现层
最终采取了B方案,只是因为驼峰命名实在太坑了 -_- ,mybatis_puls的查询构造和条件构造均不能为驼峰字段的首尾拼接双引号,导致使用mybatis_puls的增删改查均报错,最终的解决方案只能是修改mybatis的源码,遂放弃。

记录修改表字段的代码:

    @Transactional(rollbackFor = {Exception.class, Error.class})
    public void test(){
        //获取所有表名
        List tableNames = baseMapper.getTableNameList();
        //循环更改每张表字段
        tableNames.forEach(t -> {
            StringBuilder sql = new StringBuilder();
            //获取所有字段名
            List columns = baseMapper.getColumnNameList(t);
            //将驼峰转为蛇形
            columns.forEach(c -> {
                List 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);
        });


    }

	
    public static List toSerpentine(String selected) {
    	//正则判断是否存在大写字母
        String regular = ".*[A-Z]+.*";
        if (!selected.matches(regular)) {
            return null;
        }
        //存入修改前后的字段名
        List 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;
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/940084.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号