以手册中一对多的User表 和 Blog表为例;
User的model中
public List<Blog> getBlogs(){
return find("select * from blog where userId=?",get("userId"));
}
场景: 处理User集合中的Blogs(假设而已)
List<User> users = new User().dao().findUsersByState();
for(User u : users){
u.getBlogs();//这里 已经是在循环查库了.
}
我需要他查出来后就要把Blogs 封装好. 怎么破? 重写_getAttrs()
@Overrideprotected Map<String, Object> _getAttrs() { Map<String, Object> attr = super._getAttrs(); if(attr.size() > 0){ attr.put("blogs",getBlogs()); } return attr;}userId 取不到attr size 为0
群里 波总有回复 :
给了一个解决方案.
其实使用_getAttrs 先不说成功不成功, 都是在骗自己.始终是在循环查库.
感觉波总的这个方案,也是一样的效果,还是需要循环查.
一个一对多的属性,可以主动查. 2个一对多的属性就牵强了.
另外 , 我想象中的 贪婪加载 是在一个Jdbc connection 中 完成 加载任务, 而不是 多次的打开 闭合 数据库连接. 然而 不想循环查库的原因就是不想多次的创建闭合Conn.
-----------------------------------------------------------
结论: 出现上类问题后, 脑短路, 忽略了一个重要问题. 连接池. 回头翻了翻Hibernate Mybatis 和Jfinal的代码. 没有不使用连接池 ,都是使用连接池来管理connection的. 循环查库的影响.以我的场景可以忽略