public static final User dao全局对象疑惑

  1. public class User extends Model<User> {

  2.     public static final User dao = new User().dao();

  3. }


文档这块定义了全局变量,可以在其他地方调用,方便是方便了,不过还是有几点疑惑:

1、文档里面提到可能有安全问题,这块不是很理解,能否通俗讲解一下会出现哪些问题;

2、既然只能用于查询,我直接用new实例操作查询、更新、删除不是也一样,用全局除了少写点代码,还有什么优点吗;

3、我全局里面定义了dao,然后在service里面在定义一个new dao,然后这个dao可以用于查询、更新、删除,这样用有什么弊端吗。

private User dao=new User().dao();


评论区

JFinal

2018-07-09 17:45

调用了 dao() 方法以后,就自然变成线程安全的了,不用担心

如果没调用 dao() 方法,并且前面是 static,那么这个对象是所有线程都可以并发使用的,自然会有线程安全问题,因为内部并没有使用 synchronized 这类锁机制

如果使用的时候每次 new 出来,功能上确实是完全一样的,就是为了省点时空,仅此而已

Model 中的 dao 是不提倡这么用的,而是在 Service 中使用一个 private Xxx dao = new Xxx().dao() , 这样可以避免在业务层之外操作数据库

在首页下载一下 jfinal demo,参考里面的用法,一定要有业务层,一定不要在 model 中 new Xxx().dao() 出来,养成良好的开发习惯

iamdego

2019-06-12 11:43

@JFinal 这里说 “一定不要在 model 中 new Xxx().dao() 出来”,我正在看关于一对多表结构jfinal如何处理的问题 文档https://www.jfinal.com/doc/5-10 中的一个示例是,在对象中的处理。

public class Blog extends Model{
public static final Blog dao = new Blog();

public User getUser() {
return User.dao.findById(get("user_id"));
}
}

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

public List getBlogs() {
return Blog.dao.find("select * from blog where user_id=?", get("id"));
}
}


我现在有点迷惑,提出几个问题,
1、这里的Blog和User对象就是所说的model?
2、如果Blog和User对象就是所说的model,也就是说表关联示例中这样做法不推荐?
3、表关联示例中是直接new User() 并没有 new User().dao() ,到底如何使用比较规范。
4、表关联的getList方法是应该写在User extends Model这样的对象类中?还是写在service中?
5、我在view页面中循环一对多的数据时,是可以直接循环父表list然后嵌套循环直接item.getList()这样方法调用吗?还是可以在对象中private 一个属性把子表的list先set进去然后再返回view.

JFinal

2019-06-12 17:55

@iamdego
1:这里的 Blog、User 是所说的 Model

2:表关联这个地方,或许是 Model 中允许 new dao 出来的唯一的理由,其它情况都该在 Service 层中 new 出 dao 对象,文档中已补充了相关内容。以前写文档时没有考虑到这种情况,造成了矛盾

3:new User().dao() 是规范,由于 dao() 这个方法是 jfinal 后续版本添加的,所以文档没有及时更新这里

4:表关联方法写在 User extends Model 为好,因为在使用的时候调用更方便,而且在逻辑上属于数据库层面的事情,可以不必看成是业务有关的事(业务代码全写在 Service 中)

5:jfinal 的 Enjoy 引擎是与 Java 直接打通的,有方法就调,有public field 就取,不要犹豫

热门反馈

扫码入社