dao具体什么个意思。

我看文档是 只能查询 但

blog.dao.find(strSql);

 blog.dao.deleteById(3);

删除也能用。但save不能用。也有blog.find(strSql);有啥不一样

评论区

JFinal

2017-08-22 17:33

dao 是 Data Access Object 的缩写,不建议在 model 中创建 dao 对象,容易误用

建议在业务层创建 dao 对象,如下所示:
public class BlogService {
private Blog dao = new Blog().dao();
}

dao 只能用于查询,不能用于承载数据,为的是保障线程安全

上面的用法只有 find 属于查询类方法是允许的,而其它则不允许

简单来说就是 blog 中要承载字段/属性值,而这个 dao 又是 static 修饰的,会被全局所有线程所共享,不同的线程过来访问都来读/写其属性值,必然就乱掉了

JFinal

2017-08-22 17:34

@淡定007 下载本站首页右侧的 demo,里面有 dao 建议的用法,以前 demo 中的将 dao 放在 model 中的用法经常有人不注意只能调用查询方法,已不被推荐

淡定007

2017-08-23 14:03

@JFinal
private static final Blog dao = new Blog().dao();
那很多函数 每个表都要写 一遍。很不方便
没法写写成 BaseServiceI T 传mode进去 这种形式 别的通用函数就不用写了

有没有办法

JFinal

2017-08-23 15:31

@淡定007 可以这样来处理, dao 本来就是要被共享的。 我个人的习惯是在业务层用一个:
private Blog dao = new Blog().dao();

既不是 public 敢不是 static,让 Service 层保持单例就可以了。 dao 搞成 private 的可以避免 sql 满天飞,所有需要操作数据库的地方都需要在业务层里面创建一个新的业务方法,这样可以确保 sql 与业务永远被限定在 service 之中

淡定007

2017-08-23 17:48

@JFinal
能这么写吗
public class JfinalServiceImpl implements JfinalServiceI {
@Override
public List find(String strSql) {
return Db.find(strSql);
}
}

淡定007

2017-08-23 17:48

@JFinal 我这个是报错的。不知道该如何写

JFinal

2017-08-23 17:48

@淡定007 当然可以

淡定007

2017-08-23 20:43

@JFinal return (List) Db.find(strSql);

热门反馈

扫码入社