编程语言强类型的意义是在程序运行之前利用编译器对程序的行为进行推断.
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
jfinal 的 active record 将类型适当动态一点,是为了增加灵活性减少代码量
此外,active record 的 Model 可以使用官方自带生成器生成 getter、setter 方法,不存在类型问题
而 Db + Record 查询结果在 enjoy 模板引擎中输出时也不存在类型问题