关于activerecord的model增加属性的问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

关于activerecord的model增加属性的问题

2016-06-07 15:46:49 2112 1

如下描述正确与否,哪里有纰漏的,@詹兄请指出。

关于activerecord的model属性的创建:

jfinal activerecord的model使用map存储属性值,这与传统的model(javabean)的设计是不一样的,在ActiveRecordPlugin实例化并.start()后TableInfoBuilder.buildTableInfo(tableMappings)即将数据库中数据表及字段的信息创建好已备使用,此时比如demo的数据表blog,其对应的model为Blog,blog的属性(存储在map中)有id,title,content三个,这三个属性是由TableInfoBuilder.buildTableInfo(tableMappings)完成填入Blog中的。

关于model属性的读取:

Java读取:

List<Blog> blogList = Blog.dao.find("select * from blog order by id asc");
 for(Blog blog : blogList){
    //Get attribute of mysql type: int, integer, tinyint, smallint, mediumint
    blog.getInt("id");  // 取Integer,而非int
    // Get attribute of mysql type: varchar, char, enum, set, text, tinytext, mediumtext, longtext
    blog.getStr("title");   
 }

这里提一个建议,@詹兄,考虑将getInt方法改名为getInteger,getStr改名为getString。

FreeMaker读取:

<#list blogList as x>
 <tr>
  <td style="text-align:left;">${x.id}</td>
  <td style="text-align:left;">${(x.addColumn)!}</td>
  <td style="text-align:left;">${x.title}</td>
 </tr>
 </#list>

这里有一个问题FreeMake默认对null值不做处理,如果某个值为null,则会发生异常,处理方法是${value!}即在值后加一个英文感叹号,此时会将null当空字符处理。

如何给model添加额外的属性:

再以blog为例,开发中对model的需求,可能需要增加额外的属性,经詹兄的指导及实践,jfinal有如下两种或四种model添加额外属性的方法。

方法一(此种方法添加的额外属性,是即时的(下一次find的List没有put属性addColumn,Blog即没有属性addColumn)?):

public void list() {
   List<Blog> blogList = Blog.dao.find("select * from blog order by id asc");
   for(Blog blog : blogList){
    // 覆盖属性原来的值,这里注意对于表字段映射的属性,使用put或set的效果是一样的
    blog.put("title", "11");
    // 而对于非表字段映射的属性,则不可以set,否则会出现异常,找不到属性
    blog.put("addColumn", blog.getInt("id")+10);
   }
   setAttr("blogList", blogList);
   render("blog.html");
  }
 

方法二(即传统javabean的做法):

private Integer addColumn;
   
  public Integer getAddColumn() {
   return this.addColumn;
  }
 
 public void setAddColumn(Integer addColumn) {
   this.addColumn = addColumn;
  }

这两种添加额外属性方法,对于FreeMaker而言,取数据的方法都是一样的model.property。

顺便提一句,经测试,如果这两种方法一起使用,FreeMaker取数据model.property取的是 getAddColumn() 而非方法一put的值,这里值得注意。

方法三(亦或方法三及四,或者方法一二的混合使用,参看如下代码):

Mode的代码:

private Integer addColumn;
   
  public Integer getAddColumn() {
   this.addColumn = get("addColumn");  //注意此行
   return this.addColumn;
  }
 
 public void setAddColumn(Integer addColumn) {
   put("addColumn", addColumn);
  }

赋值部分代码:

bog.put("addColumn", blog.getInt("id")+15);   //方法三
 bog.setAddColumn(blog.getInt("id")+15);   //方法四,如果可以这么说

总结:关于model添加额外属性,个人建议使用方法二,因为方法一、三、四,容易与数据表原有属性的操作混淆。

取消 提交回答
全部回答(1)
  • 小旋风柴进
    2019-07-17 19:30:21

    首先,谢谢你的这些建议,这位同学的确是发现了一些细节,如下我逐一说一下:

    1:考虑将方法名 getInt 改为 getInterger,getStr改为getString

     当初的确是这么设计的,后来为了省代码,所以没这么干了,因为getInt与getStr是比较长用的方法。JFinal的设计目标是开发效率高,代码量省,所以很多地方都体现这个设计原则。
    

    2:Model 尽量去使用 set 方法

     Model的set方法能保证属性确实是存在的,是正确的,以免开发的过程中出现手误,出现手误时能在开发过程中及早发现错误。出现手误可以造成手误过的属性不能入库,而开发者认为应该入库,实质是手误导致问题发生。而有时候需要在model 中存放并不存在的属性值,此时可以使用put方法,很是方便。
    

    3:如何给Model添加额外的属性

    为了节省代码,就算要给Model添加额外属性时,也不必定义新的成员变量,只需要创建getter与setter方法即可,在getter与setter方法中去存取父类中的map即可,当然或许要对null值以及默认值时进行一些额外处理。

    4:FreeMarker表达式 ${model.property}取值问题

    如果model中存在property,并且存在 getProperty()方法时,FreeMarker会以 getProperty()优先,其实这也不能完全确定,例如在FreeMarker中迭代时,如果最开始碰到的是无getXxxx方法的property,那么,以后面的迭代中可能就一直使用map中的property。这个以前测试过,现在有些忘记了。这个问题实质与JFinal无关,完一是FreeMarker的个人行为 :)
    0 0
相关问答

20

回答

【大咖问答】对话PostgreSQL 中国社区发起人之一,阿里云数据库高级专家 德哥

阿里ACE 彭飞 2019-07-10 09:36:10 1271049浏览量 回答数 20

170

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 233742浏览量 回答数 170

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 159992浏览量 回答数 145

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 341324浏览量 回答数 8

119

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 302545浏览量 回答数 119

24

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 660274浏览量 回答数 24

39

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 263603浏览量 回答数 39

21

回答

请教一下数据量有100万条左右要什么配置?

易网网络 2013-03-27 15:18:02 193691浏览量 回答数 21

251

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 310263浏览量 回答数 251

2

回答

区域选择帮助

fanyue88888 2012-12-07 15:54:30 205741浏览量 回答数 2
2710
文章
6591
问答
问答排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载