文档章节

简单说一下Jfinal Model静态dao对象误用的问题

绝望的八皮
 绝望的八皮
发布于 2012/10/22 13:50
字数 575
阅读 1969
收藏 7
   最近有很多jfinal的使用者在误用model静态dao,这里简单的说一下这个问题, @jfinal 考虑未来加入手册里面
   

   

Model定义

public class User extends Model<User> {
            public static final User dao = new User();
     }

手册里面的model常用法

// 创建name属性为James,age属性为25的User对象并添加到数据库
new User().set("name", "James").set("age", 25).save();

// 删除id值为25的User
User.dao.deleteById(25);

// 查询id值为25的User将其name属性改为James并更新到数据库
User.dao.findById(25).set("name", "James").update();

// 查询id值为25的user, 且仅仅取name与age两个字段的值
User user = User.dao.findById(25, "name, age");

首先我们通俗理解一下 jfinal中的model到底是一个什么样的角色,在我们习惯的ssh架构里面,我们有domain/entity/model/bo ,说法很多,反正就是承载数据的。然后我们有牛逼dao层,做数据访问。


那么在jfinal的体系里面,model就有这2个功能。


new User().set("name", "James").set("age", 25).save();
这里的User就相当于ssh架构里面的domain。


// 删除id值为25的User
User.dao.deleteById(25);
请注意这一句,如果我们吧这个静态属性替换一下。就是:

new User().deleteById(25);

这样也是可以的。

这里的User相当于ssh架构里的UserDao.

所以其实只要在程序里面用到model的地方无论是承载数据和做数据访问对象,只要是new User()出来是肯定不会有问题的。


那么为什么demo和手册里面都有Model.dao这样的用法呢。


个人理解有2个好处。


1   让做数据访问时候api调用简洁快速。

2   理论上省内存,因为每一次数据访问的时候使用的是同一个对象。


但是从目前的情况来看起带来了不好的后果,很多新手有误用的情况,用静态的dao对象来承载数据并持久化,这是一个错误的用法,是非线程安全的。


简单的说,只有到选择model做数据访问的时候才能使用静态dao对象来调用api,其他做实体承载数据的,必须new Model().




© 著作权归作者所有

共有 人打赏支持
上一篇: 12月小结
绝望的八皮

绝望的八皮

粉丝 392
博文 22
码字总数 10505
作品 2
其它
CTO(技术副总裁)
私信 提问
加载中

评论(12)

绝望的八皮
绝望的八皮

引用来自“伊弦”的评论

刚接触jfinal,看到这个静态dao就觉得很奇怪了,很明显的线程不安全,建议在手册里面说清楚。
可以在model里用public static User dao(){return new User();}代替
这个只是为了填Java不支持真泛型的坑而已。。目的只是为了拿到类型。它并不携带任何状态,只用来处理无状态的方法调用。同样类似的activijdbc,用的就是编译期间的字节码加强,直接支持在Class上调用。
伊弦
伊弦
刚接触jfinal,看到这个静态dao就觉得很奇怪了,很明显的线程不安全,建议在手册里面说清楚。
可以在model里用public static User dao(){return new User();}代替
绝望的八皮
绝望的八皮

引用来自“jason.gua”的评论

我的java水平一般。若不需要通过一个new Dao来做。 是否可以通过静态方法来完成?
其实Model<T>.save(Mode<T>t)这种方式未尝不可。

其实我还有个为难的地方,和alvinte有过沟通。 jfinal若使用不当,会让sql语句满天飞,读的还好,若出现update,insert,delete等就麻烦的很。
貌似话题延伸了。。。

呵呵,那你就尝试写个静态方法来做吧,你能做到?java泛型是编译擦除的。据说要java10还是多少才有真泛型。。。
activijdbc就是用静态方法但是就必须用字节码加强.
http://code.google.com/p/activejdbc/
jasongua
jasongua
我的java水平一般。若不需要通过一个new Dao来做。 是否可以通过静态方法来完成?
其实Model<T>.save(Mode<T>t)这种方式未尝不可。

其实我还有个为难的地方,和alvinte有过沟通。 jfinal若使用不当,会让sql语句满天飞,读的还好,若出现update,insert,delete等就麻烦的很。
貌似话题延伸了。。。

绝望的八皮
绝望的八皮

引用来自“jason.gua”的评论

事情描述的很清楚了。
只有到选择model做数据访问的时候才能使用静态dao对象来调用api,其他做实体承载数据的,必须new Model().
这相当于是一种口头的约束,约束力太弱。 有办法禁止修改静态dao对象吗?

用普通的方式估计比较困难了,这也是jfinal权衡的结果吧。要么你就不用静态的dao,都new就没问题,否则估计就得设计成activijdbc那样利用字节码加强。
jasongua
jasongua
事情描述的很清楚了。
只有到选择model做数据访问的时候才能使用静态dao对象来调用api,其他做实体承载数据的,必须new Model().
这相当于是一种口头的约束,约束力太弱。 有办法禁止修改静态dao对象吗?
CQRS恶棍
CQRS恶棍

引用来自“绝望的八皮”的评论

引用来自“alvinte”的评论

八皮好勤劳~顶你!

说点有建设性的。。

元芳,说昨好极了!
绝望的八皮
绝望的八皮

引用来自“zhuiyue”的评论

对对,我把以前的代码都改了。。。还有什么好的建议或使用方法多提提

我个人用到的东西都在我的blog里面,也尽量做成扩展放到这里面了http://www.oschina.net/p/jfinal-ext
jfinal本身的运用多看看文档demo就行。有什么搞不清楚的给 @jfinal提意见去:)
追月小虎
追月小虎
对对,我把以前的代码都改了。。。还有什么好的建议或使用方法多提提
JFinal
JFinal
就是这样,分析得很好,谢谢支持 :)
JFinal中实体类存取之循序渐进法

个人觉得,JFinal中最大的方便之处是对ORM的定义和封装,降低了ORM工具的学习难度,对Model进行了极轻度的封装,既方便使用,又不减少使用的灵活性。Db+ActivedRecord对习惯使用SQL的人来说,...

Jetmark
2013/05/12
0
4
JFinal之Model功能扩展的问题

JFinal中POJO的定义与DAO是可以放在一起的,这个JFinal已经给了很好的例子: 这个dao是定义在User中的,User是继承Model的POJO类,在该类中如定义方法getUser(),就可以采用User.dao.getUse...

Jetmark
2013/05/11
2.4K
5
JFinal针对ORACLE的timestamp字段解决办法

JFinal是个比较不错的的框架,但JFinal起源时使用mysql数据库,因此在对数据库支持方面还没有达到完美。 本人使用JFinal有一段时间的,由于项目的数据库普遍采用oracle,在使用oracle过程中遇...

真的农夫三拳
2013/06/23
0
6
JFinal源码分析------Model的前世今生

嗯 好了 前几篇博文,我们主要是说一些初始化的东西,现在,我们可能需要看看另外的东西了,也就是关于和数据库相关的东西了。在Demo中的,我们最想接触到的除了Controller,Config之外的东西...

天蓬小猪
2013/06/13
0
7
jfinal获得的modelList,如何在JSP页面遍历?

@JFinal 你好,想跟你请教个问题: 我用spring mvc + jfinal做项目,只用jfinal的数据持久层,代码如下: @Controller public class AdminController { @RequestMapping(value = {"/index.do......

jelly_oy
2014/11/20
2.2K
2

没有更多内容

加载失败,请刷新页面

加载更多

Netty如何实现Reactor模式

在前面的文章中(Reactor模型详解),我们讲解了Reactor模式的各种演变形式,本文主要讲解的则是Netty是如何实现Reactor模式的。这里关于Netty实现的Reactor模式,需要说明的是,其实现的模式...

爱宝贝丶
28分钟前
2
0
前端面试:谈谈 JS 垃圾回收机制

摘要: 不是每个人都回答的出来... 原文:前端面试:谈谈 JS 垃圾回收机制 作者:前端小智 最近看到一些面试的回顾,不少有被面试官问到谈谈JS 垃圾回收机制,说实话,面试官会问这个问题,说...

Fundebug
30分钟前
2
0
修改django中的querydict

修改django中的querydict 在正常的请求/响应周期中访问时,request.POST和request.GET上的QueryDicts将是不可变的.要获得可变版本,您需要使用QueryDict.copy().或者,使用一个小技巧 # da...

_Change_
39分钟前
0
0
php简易缓存函数

不需要特别复杂的缓存的时候可以采用简易缓存,设置缓存有效期,有效返回数据,无效返回无效.然后每日清空一下所有缓存.毕竟缓存太多了也占地方 /** * 缓存 * @param $key 缓存名 * @p...

xiaogg
42分钟前
0
0
linux 使用文件增加虚拟内存 swap

之前买了个云服务器玩,不过是最低配置的1核1G,后来发现这个内存太小了,随便装几个软件就不行了,内存消耗较大的像 redis 运行起来很多问题。 这些时间了解了下 docker 容器,去尝试了下发...

非摩尔根
46分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部