Extjs 使用MyBatis进行动态查询,用于远程网格筛选/分页/排序

Extjs 使用MyBatis进行动态查询,用于远程网格筛选/分页/排序,extjs,mybatis,Extjs,Mybatis,我正在从事的一个项目大量使用ExtJS框架。我们有很多数据要显示,我们通过网格来显示,网格都有一套标准的分页、排序和过滤功能 目前,我们的后端是PHP,我们使用的是直接SQL。我用PHP编写了一个SQL包装器,它将接受一个查询、一个过滤器列表、排序信息和页面信息,并通过将原始查询用作子查询来输出一个具有适当WHERE、ORDER BY和pagination特性的查询。我应该注意到,我们的项目与Oracle有关 过滤器的形式可以是comparations=、IS NULL或列出,排序只是一个带方向

我正在从事的一个项目大量使用ExtJS框架。我们有很多数据要显示,我们通过网格来显示,网格都有一套标准的分页、排序和过滤功能

目前,我们的后端是PHP,我们使用的是直接SQL。我用PHP编写了一个SQL包装器,它将接受一个查询、一个过滤器列表、排序信息和页面信息,并通过将原始查询用作子查询来输出一个具有适当WHERE、ORDER BY和pagination特性的查询。我应该注意到,我们的项目与Oracle有关

过滤器的形式可以是comparations=、IS NULL或列出,排序只是一个带方向的列。分页是起始行号和结束行号

长话短说,我们正朝着使用Spring和MyBatis的基于java的体系结构迈进。我很难想出如何使用MyBatis以一种简单的方式实现相同的功能。包装器的好处在于,我们只需编写一次基本查询,然后它就会变形为网格所需的任何查询。由于我们谈论的是可能有成千上万条记录,并且我们需要分页,因此将内容拉回到服务器并执行基于java的过滤/排序实际上不是一个选项

以前有人解决过这个或类似的问题吗?我简要地介绍了MyBatis的动态SQL功能,但它似乎没有提供我所需要的灵活性和功能。我错了吗

经验丰富的MyBatis用户的任何指导都将不胜感激


我应该注意到,我们现在是探索性的,使用ORM并不是完全不可能的。使用Hibernate(比如Hibernate)是否更容易实现这一点?

我使用Guice而不是Spring做的几乎完全相同,而且我的查询是树表中显示的分层结果,这使问题变得非常复杂

我认为MyBatis可以很好地做到这一点。 但是,对于查询的动态部分,我将把MyBatis放在一边,并用与PHP相同的方法实现它:用Java生成语句的WHERE和ORDER BY部分

在可重用代码段中为基本查询和基本查询本身定义mybatis结果映射,然后在映射文件中直接使用字符串替换:

大概是这样的:

<resultMap id="TaskMap" type="de.foobar.dtos.TaskDto">
    <id column="id" property="id"/>
    <result column="description" property="description"/>
    ...
</resultMap>

<sql id="baseQuery">
    select id, description from tasks
</sql>

<select id="selectSingle" resultMap="Task2Map">
    select bq.*
    from (
            <include refid="baseQuery"/>
         ) bq
    where bq.id = #{id}
</select>

<select id="selectAll" resultMap="Task2Map">
    select bq.*
    from (
            <include refid="baseQuery"/>
         ) bq
    where ${filterClause}
    order by ${orderByClause}
</select>
对于分页,您必须包装另一个子查询以使用奇怪的OracleRownum构造,但您可能已经这样做了


当然,通常的警告也适用:MyBatis中的${}语法执行的是字符串替代,而不是准备好的语句的参数,因此在清理用户输入时要小心,以避免sql注入。

我正在一个项目中,使用无限滚动分页和远程过滤器/排序执行相同的操作。网格有10k-30k条记录,我将其全部拉回到服务器,并使用java过滤和排序,没有任何问题。当我向后端传递过滤器或排序时,ajax响应在100-200ms范围内。我用Tomcat和sqlserver运行这个程序,但没有ORM,只有ApacheDbutils和ApacheCollections库。如果你想试试那条路线,我可能会把它设置好。哇。内存占用情况如何?您通常每秒需要处理多少个请求?当我们看到它时,我们并不认为这是一个非常理想的解决方案,但我们可以接受100-200毫秒的响应。我很想多听听你在做什么!我没有做的一件事是在每次请求时从数据库中提取新数据,我会在服务器上保持一定的时间,因为它不会经常更改。如果我必须对每个请求运行一个新的查询,我肯定我必须做一些不同的事情。出于这个原因,每秒请求数在数据库端从来都不是一个重要的考虑因素,在服务器端,这是一个只有大约50-100个用户的intranet应用程序,永远不会同时出现在它上面,所以它也不是很重。它仍然很粗糙,但我会马上发布相关的类。我知道这是很久以前的事了,但我很好奇,你最后做了什么?