JFinal ActionRecord 关联查询 类型火葬场

编程语言强类型的意义是在程序运行之前利用编译器对程序的行为进行推断. 

record & model 查询是爽了, 但是少了类型约束.

当数据库 columnname & columntype 变动.

程序却无感知, 真实情况如下

Record first = Db.findFirst("select c1,c2 from t");
// 并不能推断出正确的类型, get方法签名上只有一个<T>, 返回是Object
// 任何类型都可以接收结果
Object o1 = first.get("f", "");
Object o2 = first.get("f");
String o3 = first.getStr("f");

为适应需求, 做出以下改进

新建CT类

package com.jfinal.plugin.activerecord;

public class CT<T> {
  private String name;
  private Class<T> aClass;

  public CT(String name, Class<T> aClass) { this.name = name;this.aClass = aClass; }

  public String toString() { return this.name; }

  public Class<T> type() { return  this.aClass; }
}


自定义BaseModelGenerator, 生成如下代码

public class BaseUser extends ...{
  public static final CT<String> userName = new CT<>("username", String.class);
  public static final CT<Integer> age = new CT<>("age", Integer.class);
}

调用

Record first = Db.findFirst("select c1,c2 from t");
String v1 = first.get(BaseUser.userName);
Integer v2 = first.get(BaseUser.userName);

第三行将无法通过编译

同理, 数据库字段变动, 调用Active Record Plugin的generator会重新生成CT, 届时若有异常, 一目了然

评论区

JFinal

2020-04-28 19:56

照你这么说 ruby、javascript 这些动态类型语言就是类型地狱了

jfinal 的 active record 将类型适当动态一点,是为了增加灵活性减少代码量

此外,active record 的 Model 可以使用官方自带生成器生成 getter、setter 方法,不存在类型问题

而 Db + Record 查询结果在 enjoy 模板引擎中输出时也不存在类型问题

zhangtianxiao

2020-04-28 23:21

@JFinal 关联查询返回的结果, 一个Model承载不下, 仍无法完美支持, Record怎么就没有这个类型问题了, 我通篇想表达的是数据库字段类型变动, 程序能第一时间感知, 而不是执行到了这行才知道

JFinal

2020-04-29 01:11

@zhangtianxiao 我是说 getter、setter 方法不存在类型问题

热门反馈

扫码入社