使用jfinal的一点反馈

ohaozy 发布于 2013/08/05 11:36
阅读 1K+
收藏 5
使用jfinal好一段时间了,真心感谢波波!开发中带来相当多的便利,在此提点个人意见,希望jfinal越做越好。

1.在Model中添加saveOrUpdate方法,记得过去使用hibernate时有这样的方法,很方便,一个对象传过去,没有记录就save,有记录就update,在JFinal中只因为要配置主键,所以只要判断主键是否为空就可以决定采用是save还是update:
boolean result = false;
if(message.get("id")==null){
    result=message.save();
}else{
    result=message.update();
}
2.希望在Model中添加类似:saveBatch(List<? extends Model> list)方法,批量save或者update对象,这样很方便而且带来的是效率的提升。虽然Db有批量方法,但此种情况不适用。
for(VoteItem m:listItem){
    m.set("voteId", voteId);
    m.save();
}
3.获取参数时,getParaToInt类似的方法对于提供默认值的版本方法,比如:
private Integer toInt(String value, Integer defaultValue) {
if (value == null)
     return defaultValue;
if (value.startsWith("N") || value.startsWith("n"))
    return -Integer.parseInt(value.substring(1));
 return Integer.parseInt(value);
}
在value判断为null才返回默认值,但我认为,既然选择了带默认值的方法版本,那么只要value转换有问题,就应该返回默认值,这才是提供默认值的意义。波波出于不破坏业务逻辑考虑,让原值转换出错就报异常,这点我不赞同,从使用者来说,如果考虑到这种情况就应该避免使用带默认值的方法版本,让程序抛异常,框架是不应该帮使用者考虑具体的问题。
比如:我希望得到一个:
Integer value = this.getParaToInt("value",null);如果传的是空字符串,此时得到一个null是相当合理的,然而程序此时却是报异常,为了处理这个情况,就要这么做:
Integer value = this.getPara("value",null)==null?null:this.getParaToInt("value");此时的getPara方法就提供了很好的默认值版本方法。
4.对于Model里的getInt方法应该返回基本类型int,而不是返回对象类型的Integer,应提供getParaToInteger这样的方法来返回对象类型,原因如下:
对于Integer类型,像这样定义时:Integer a=100,如果值在-128到127之间时,直接比较,返回的是true,超过范围则返回false:
public static void main(String[] args){
    Integer a = -129;
    Integer b = -129;
    System.out.println(a==b); //false
    a=-128;
    b=-128;
    System.out.println(a==b);//true
    a=127;
    b=127;
    System.out.println(a==b);//true
    a=128;
    b=128;
    System.out.println(a==b);//false
}
这里我不是玩技巧,java对于Integer对象提供了很特别的数值范围,让他们可以进行比较返回true,我们知道对像比较,实际比较的是内存地址,在这个规则下很多java初学者并不知道这样的规则,当直接用getInt获取的值去比较,程序出问题后相当隐蔽,不容易找出问题,这种情况正确的用法是:r.getInt("pId")!=null && record.getInt("id")!=null && 
 r.getInt("pId").intValue()==record.getInt("id").intValue()

加载中
1
JFinal
JFinal

    一直没有时间来回复你,首先感谢你对 JFinal 的支持 

1:JFinal Model没有提供saveOrUpdate方法,以前有过讨论。首先开发者可以很容易地扩展一个,此外jfinal 希望代码更加明确,save与update需要区分,如果提供这个方法很验保证不被误用。

2:类似的saveBatch(List<? extends Model> list)方法已经有了,详见Db.batch(String sql, String columns, List modelOrRecordList, int batchSize),其中的 modelOrRecordList 就可以传入 List<Model>参数。另外Db.batch还支持批量update,具体行为由传入的 sql 决定

3:getParaToInt值得再权衡,目前的方案是基于避免问题而非解决问题的思想来做的,jfinal 希望尽可能出现 bug,如果在有异常时使用默认值有可能隐藏了潜在的bug。当然楼主的建议适用于一定的情况,或许可以考虑提供一个参数来切换这个行为

4:如果Model里的getInt方法返回基本类型int,那么当数据是null值是会报异常,很不方便。java 的 Integer 比较是比较恶心,但开发者需要小心这类代码

    总之,想做一个好用的框架,需要做许许多多的权衡,给出一个解决方案,意味着肯定会有不足的地方。只能力求做到利大于弊 ^_^


四川西瓜
四川西瓜
回复 @JFinal : 谢谢,了解。
JFinal
JFinal
回复 @四川西瓜 : 不带参数的 getPara()可以获取所有urlPara部分,例如url 为 action/abc-def 时将获取到 "abc-def"
四川西瓜
四川西瓜
是的,对于getParaToInt这个参数的使用有些疑问,关于不带参数的这个方法不晓得什么情况下使用。上面是从url获取参数对象转化内容为ID?还是其他的值信息?谢谢赐教。
0
伊藤熊吉
伊藤熊吉
第一个问题我也曾经问过,其实你那段我们自己来判断不是更灵活么?
Jieven
Jieven
集成到款架里面是用的很方便,但这只是有这种习惯的用户会很爽,并且波波的核心思想是轻量。能不加就不加,更何况还有反对的声音,既然JFinal是一个内核,你想自己用的爽,肯定得为内核穿衣打扮,基于内核再延伸出自己的那层壳子。在自己的壳子上定制符合自己习惯的东西!
ohaozy
ohaozy
我们自己判断也OK,但如果集成在框架里,不就更方便吗?而且配置数据库时要指定主键,框架已经取到了,帮我们做了那用起来更顺手啊。
0
菜根乱谭
菜根乱谭

对于第一个建议,我建议是自己封装。因为具体场景并不是只要有id的就是一定要更新的,如果一个表的主键是自定义的,那么就需要在插入的时候在外部生成主键,这时候model中虽然有主键值,但是却是要插入而不是更新,如果改一下可以先根据id查一下,查不到插入,查到更新,但是效率有问题。jfinal没有提供主键生成器,所以对主键的处理都是交给开发者的。

@JFinal

ohaozy
ohaozy
这里的id仅是例子,应该取框架里定义的主键
0
ZZZ5512536
ZZZ5512536

额,第一条之前也有人问过,作者也作了回应,你看看吧

http://www.oschina.net/question/64242_48250

0
风里的叶子
风里的叶子
自己继承model,扩展。
0
干死it
干死it
支持jfinal!简单用了数据库层
返回顶部
顶部