多数据库支持下 数据库字段设计以及统一JSON输出 解决方案

  • • 发表于2019-03-15 11:49:55.0
  • • 作者 小徐同学
  • • 328 次浏览
  • • 5 条评论
  • • 最后编辑时间 2019-03-16 00:13:08.0
  • • 来自 [JFinal]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

公司产品,将来需要支持ORACLE,SQLSERVER,MYSQL…

研究了下,已经实现,前置规则如下:

  1. 统一标准化字段长度,字段长度,以适配不同数据库反射生成的JavaBean一致性问题;
  2. 统一接管ID生成,应用生成ID,以适配ORACLE等数据库自增ID特性
  3. 统一数据库字段全部大写且下划线隔开,以适配ORACLE数据库字段大写问题,以及ORACLE和mysql等数据库动态表查询出来结果集,key会有大小写区别问题
  4. JSON字段统一驼峰输出,有JavaBean实体对应的表,自动驼峰,关键是动态表查询结果mapToJson需要将大写字段以及额外定义字段适配,有下划线的去下划线转驼峰,本身驼峰字段不做处理,大写字段转小写
  5. 带数据库特性语句用外部sql文件管理

代码(JFinal实现):

//自定义base_model_template,处理实体类setXxx字段,处理非下划线字段

//处理Map对象key

    private static String toCamelCase(String stringWithUnderline) {
        if (stringWithUnderline.indexOf(95) == -1) {
            char[] fromArray = stringWithUnderline.toCharArray();
            boolean isHaveLowerCase = false;
            boolean isHaveUperCase = false;
            for (int i = 0; i < fromArray.length; ++i) {
                if (Character.isUpperCase(fromArray[i])) {
                    isHaveUperCase = true;
                } else if (Character.isLowerCase(fromArray[i])) {
                    isHaveLowerCase = true;
                }
                if (isHaveLowerCase && isHaveUperCase){
                    return stringWithUnderline;
                }
            }
            return stringWithUnderline.toLowerCase();
        } else {
            stringWithUnderline = stringWithUnderline.toLowerCase();
            char[] fromArray = stringWithUnderline.toCharArray();
            char[] toArray = new char[fromArray.length];
            int j = 0;

            for (int i = 0; i < fromArray.length; ++i) {
                if (fromArray[i] == '_') {
                    ++i;
                    if (i < fromArray.length) {
                        toArray[j++] = Character.toUpperCase(fromArray[i]);
                    }
                } else {
                    toArray[j++] = fromArray[i];
                }
            }

            return new String(toArray, 0, j);
        }
    }

最终实现效果

    /**
     * 查看指标集
     */
    public void fieldSetList() {
        List<FieldSet> fieldSetList = srv.findFieldSetList();
        for (FieldSet set : fieldSetList) {
            set.put("TEST","1");
            set.put("TEST_ABC","1");
            set.put("testDef","1");
            set.put("test_ghz","1");
        }
        renderJson(Ret.ok("list", fieldSetList));
    }

返回JSON

{
    "msg": "操作成功",
    "code": "0",
    "success": true,
    "list": [
        {
            "testDef": "1",
            "testGhz": "1",
            "tablePrefix": "USER",
            "updateTime": "2019-03-15 15:55:56",
            "testAbc": "1",
            "dr": 0,
            "name": "人员指标集",
            "test": "1",
            "id": 1,
            "createTime": "2019-03-15 15:55:56",
            "updatePerson": "seven",
            "seq": 1,
            "createPerson": "seven"
        },
        {
            "testDef": "1",
            "testGhz": "1",
            "tablePrefix": "ORG",
            "updateTime": "2019-03-15 15:56:01",
            "testAbc": "1",
            "dr": 0,
            "name": "单位指标集",
            "test": "1",
            "id": 2,
            "createTime": "2019-03-15 15:56:01",
            "updatePerson": "seven",
            "seq": 2,
            "createPerson": "seven"
        }
    ]
}
评论区(共5条评论)
天行者
天行者 2019-05-28 07:21

base_model_template这个是用来生成model实体类的吗?那个toCamelCase放在一个json工厂里面就可以了?

小徐同学
小徐同学 2019-05-28 09:14
天行者
天行者 2019-05-28 10:59

模板引擎那个没看明白?有时间研究下

小徐同学
小徐同学 2019-05-28 11:00

@天行者 就是扩展下模板的生成

天行者
天行者 2019-05-30 08:13

@小徐同学 刚看jfinal源码,原来是activerecord.generator下的那个base_model_template.jf文件,又学了一招了。

5条评论
Ctrl+Enter
作者

Michael

小徐同学

帖子:34 回复:0

全栈搬运工

作者详情》
Top