在JFinal中支持以统一的方式(IRow)来处理 Model 和 Record

项目中经常需要对数据库的查询结果进行进一步处理,以前需要对Model 和 Record区别进行处理,相同的算法得写两遍。

最近给波总建议可以让Model 和 Record实现一个共同的接口,类似DTO,相当于把ActiveRecord对象(Model 和 Record)降级为普通DTO对象。这样就可以通过这个统一接口来无差别地同时处理Model 和 Record了,最终波总在最新的JFinal 4.9.17中添加了IRow这个接口,代表数据库中一行记录。

具体使用如下:

定义一个通用的泛型处理算法。

public <M extends IRow> void autoSetDict(Collection<M> mList, String codeKey) {
    for (M m : mList) {
        String codeValue = m.getStr(codeKey);
        ...
    }
}

Model的场景

List<User> users = User.dao.find("select * from user where age>18");
autoSetDict(users,"xb");

Record的场景

List<Record> users = Db.find("select * from user where age > 18");
autoSetDict(users,"xb");


感谢波总急速发布一版,又可以少些一些代码了。

评论区

七五热

2021-09-15 10:34

这种会不会影响性能啊

杜福忠

2021-09-15 10:49

👍👍👍李佬师玛雅牛就是牛!总是以最优雅方案来推进JF的演化!

杜福忠

2021-09-15 10:51

4.9.17添加的Ret.ok(String msg) 也非常方便了

杜福忠

2021-09-15 10:56

@七五热 interface IRow 咋会有影响了,直接升级都没问题。可以说是最优雅的二合一
添加 IRow 接口:
https://gitee.com/jfinal/jfinal/commit/60dd6bf466f71e790953d8171d8e21a6fcb16c62
实现 IRow 接口:
https://gitee.com/jfinal/jfinal/commit/e7ac99208e78210f54ec792b0339c9591977f8d4
看吧!简洁、优雅,二合一

杜福忠

2021-09-15 11:14

之前我项目得:
xxx(Object obj){
if(obj instanceof Record){
Record r = (Record) obj;
}else if (obj instanceof Model){
Model m = (Model)obj ;
} else {
throw new RuntimeException("参数obj非法类型,需Record或者Model对象");
}
}

现在直接:
xxx(IRow x){
}

这不到头了嘛!

山东小木

2021-09-15 11:20

ret.ok(msg)这个终于有了 我都是自己封装的

hzh740053757

2021-09-15 11:21

@杜福忠 这种的我写了好多 可算能优化了

xialinlin

2021-09-15 13:38

早就该这么统一了

zzutligang

2021-09-15 21:16

JFinal越来越好