请教JFinal的分页原理

我是小小菜鸟 发布于 2015/08/20 15:23
阅读 419
收藏 0

收藏!数据建模最全知识体系解读!>>>

@JFinal 你好,想跟你请教个问题:

// --------
StringBuilder sql = new StringBuilder();
sql.append(select).append(" ").append(sqlExceptSelect);
PreparedStatement pst = conn.prepareStatement(sql.toString(), ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
for (int i=0; i<paras.length; i++) {
pst.setObject(i + 1, paras[i]);
}
ResultSet rs = pst.executeQuery();

// move the cursor to the start
int offset = pageSize * (pageNumber - 1);
for (int i=0; i<offset; i++)
if (!rs.next())
break;

List list = buildModel(rs, modelClass, pageSize);
if (rs != null) rs.close();
if (pst != null) pst.close();
return new Page(list, pageNumber, pageSize, totalPage, (int)totalRow);

请问这里是把SQL语句获取到的所有记录放到rs中,再rs.next去掉前分页的记录,然后buildModel(rs, modelClass, pageSize)得到当前分页的数据吗?

加载中
1
我是小小菜鸟
我是小小菜鸟

找到配置的代码了

// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
me.add(arp);
arp.setDialect(new SqlServerDialect());

0
Adairs
Adairs

1、JFinal把输出的SQL,拼接成:select count(*)  FROM **** WHERE *****的形式,查询出结果数量

2、根据总页数,每页记录数,计算当前要查询的记录,然后根据不同的数据库方言,拼接成不同的SQL,比如:select ....  FROM ****  WHERE .... LIMIT 100,10,然后把查询结果、当前页数,总页数、当前记录数、总记录数等信息放到Page里边

具体见:com.jfinal.plugin.activerecord.paginate(Config config, Connection conn, int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras)


0
我是小小菜鸟
我是小小菜鸟

引用来自“Adairs”的评论

1、JFinal把输出的SQL,拼接成:select count(*)  FROM **** WHERE *****的形式,查询出结果数量

2、根据总页数,每页记录数,计算当前要查询的记录,然后根据不同的数据库方言,拼接成不同的SQL,比如:select ....  FROM ****  WHERE .... LIMIT 100,10,然后把查询结果、当前页数,总页数、当前记录数、总记录数等信息放到Page里边

具体见:com.jfinal.plugin.activerecord.paginate(Config config, Connection conn, int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras)


你好,我用的是JFinal2.0,使用MSSQL数据库的,用官方给的DEMO断点调试,最后的SQL跟传递进去的是一样的,分页效率好慢,查询结果有10000条数据,1页50条,第一次访问要了10秒左右,点后面的100-200页,几乎不花时间。
0
男神
男神
这个估计和数据库有点关系,他们针对不同的数据库做了 不同的处理, 我以前看SQLserver 好像也是一次性读出来之后分页,,,“第一次访问要了10秒左右,点后面的100-200页” 这个应该是缓存的原因
0
我是小小菜鸟
我是小小菜鸟

引用来自“男神”的评论

这个估计和数据库有点关系,他们针对不同的数据库做了 不同的处理, 我以前看SQLserver 好像也是一次性读出来之后分页,,,“第一次访问要了10秒左右,点后面的100-200页” 这个应该是缓存的原因
谢谢!我看了一下plugin\activerecord\dialect文件夹下的SqlServerDialect.java,也是使用row_number()分页的,但调试的时候没有经过这个方法。官方的DEMO是使用MYSQL的,如果我改用MSSQL,除了更改a_little_config.txt里的配置外,还有没有其他需要修改的地方?
返回顶部
顶部