errors | |
---|---|
|
基于元模型驱动的引擎,核心在于不用理会机械的CRUD,而只需要将主要经历专注在业务领域建模上,当模型建完后,crud的能力会自动具备。以下是三个demo模型:
2.6.1.1. 组织
通过@Model注解定义模型名称,@Property声明属性, @ManyToOne和@OneToMany声明er关系:
@Model(name = "TestOrg",description = "测试组织")
public class TestOrg extends BaseModel {
@Property(displayName = "名称",displayForModel=true )
private String name;
@ManyToOne
@JoinColumn(name = "parent_id")
private TestOrg parent;
@OneToMany
private List<TestUser> userList;
public TestOrg getParent() {
return (TestOrg) this.get("parent");
}
public TestOrg setParent(TestOrg parent) {
this.set("parent", parent);
return this;
}
public List<TestUser> getUserList() {
return (List<TestUser>) this.get("userList");
}
public TestOrg setUserList(List<TestUser> userList) {
this.set("userList", userList);
return this;
}
public String getName() {
return (String) this.get("name");
}
public TestOrg setName(String name) {
this.set("name", name);
return this;
}
}
2.6.1.2. 用户
也可以只增加@Model,引擎会将类名作为模型名称以及表名。通过@Validate可以增加各类校验,get和set方法可以通过idea模板自动生成:
@Model
public class TestUser extends BaseModel {
@Property(columnName = "name", displayName = "名称",displayForModel = true)
//@Validate.NotBlank
private String name;
@Validate.Email(message = "邮箱格式不正确")
@Property(columnName = "email", displayName = "邮箱",dataType = DataType.TEXT)
private String email;
@Property(columnName = "status", displayName = "状态", dataType = DataType.ENUM, values = {
@ModelEnum(label = "启用", value = "1"),
@ModelEnum(label = "禁用", value = "0")}, defaultValue = "1")
private Boolean status;
@Property(columnName = "phone", displayName = "电话号码")
@Validate.Phone(message = "手机号格式不正确")
private String phone;
@Validate.Max(110)
@Property(columnName = "age", displayName = "年龄")
private Integer age;
@Validate.NotBlank
@Property(columnName = "password", displayName = "密码")
private String password;
@Property(columnName = "test", displayName = "测试")
private String test;
@Property(columnName = "method", computeMethod = "method", displayName = "计算方法")
private String method;
@Property(columnName = "script", computeScript = "3+100", displayName = "计算脚本")
private String script;
@ManyToOne(displayName = "组织机构", cascade = {CascadeType.DEL_SET_NULL})
@JoinColumn(name = "org_id", referencedColumnName = "id")
private TestOrg org;
@Property(displayName = "selectStatus", defaultValue = "1")
@Selection(values = { @Option(label = "启用", value = "1"), @Option(label = "禁用", value = "2"), @Option(label = "已删除", value = "3") })
private String selectStatus;
@Property(displayName = "selectMetod")
@Selection(method = "selectMetod")
private String selectMetod;
@Property(displayName = "selectModel")
@Selection(model = "TestOrg", properties = "name", orderBy = "name desc")
private String selectModel;
public Date getCreate() {
return getDate("create");
}
public void setCreate(Date create) {
this.set("create", create);
}
public String getPhone() {
return getStr("phone");
}
public void setPhone(String phone) {
this.set("phone", phone);
}
public String getEmail() {
return getStr("email");
}
public void setEmail(String email) {
this.set("email", email);
}
public void setPassword(String password) {
this.set("password", password);
}
public String getPassword() {
return getStr("password");
}
public String getName() {
return getStr("name");
}
public void setName(String name) {
this.set("name", name);
}
public Integer getAge() {
return getInt("age");
}
public void setAge(Integer age) {
this.set("age", age);
}
public TestOrg getOrg() {
return (TestOrg) this.get("org");
}
public TestUser setOrg(TestOrg org) {
this.set("org", org);
return this;
}
}
get模板为:
#if($field.modifierStatic)
static ##
#end
$field.type ##
#if($field.recordComponent)
${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
is##
#else
get##
#end
${name}##
#end
() {
#if($field.type == "java.util.Date")
return getDate("$field.name");
#elseif($field.type == "java.sql.Timestamp")
return getTimestamp("$field.name");
#elseif($field.type == "java.time.LocalDateTime")
return getLocalDateTime("$field.name");
#elseif($field.type == "java.sql.Time")
return getTime("$field.name");
#elseif($field.type == "java.lang.Integer")
return getInt("$field.name");
#elseif($field.type == "java.lang.Long")
return getLong("$field.name");
#elseif($field.type == "java.lang.Double")
return getDouble("$field.name");
#elseif($field.type == "java.lang.Float")
return getFloat("$field.name");
#elseif($field.type == "java.lang.Short")
return getShort("$field.name");
#elseif($field.type == "java.lang.Byte")
return getByte("$field.name");
#elseif($field.type == "java.lang.Boolean")
return getBoolean("$field.name");
#elseif($field.type == "java.lang.String")
return getStr("$field.name");
#elseif($field.type == "java.lang.Number")
return getNumber("$field.name");
#elseif($field.type == "java.math.BigDecimal")
return getBigDecimal("$field.name");
#elseif($field.type == "java.math.BigInteger")
return getBigInteger("$field.name");
#else
return ($field.type)this.get("$field.name");
#end
}
set模板为:
#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
$classname set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
set("$field.name", $paramName);
return this;
}
2.6.2. 属性校验说明
TestUser的password通过@Validate.NotBlank设置不能为空的校验 ,呈现效果:
TestUser的email通过@Validate.Phone(message = "手机号格式不正确")设置手机格式的校验,呈现效果:
2.6.3. ER关系说明
● OneToMany 一对多
@OneToMany
private List<TestUser> userList;
● ManyToOne 多对一
@ManyToOne(displayName = "组织机构")@JoinColumn(name = "org_id", referencedColumnName = "id")
private TestOrg org;
● ManyToMany 多对多
@ManyToMany
@JoinTable(name = "role_user", joinColumns = @JoinColumn(name = "role_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "user_id", nullable = false))
private List<TestUser> userList;