首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MyBatis进行极其动态的查询,以实现远程网格过滤/分页/排序

使用MyBatis进行极其动态的查询,以实现远程网格过滤/分页/排序
EN

Stack Overflow用户
提问于 2012-02-29 03:40:49
回答 1查看 2.8K关注 0票数 1

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

目前,我们的后台是PHP,我们使用的是直接的SQL。我用PHP编写了一个SQL包装器,它将接受查询、过滤器列表、排序信息和页面信息,并通过将原始查询用作子查询来输出具有适当WHERE、ORDER BY和分页特性的查询。我要指出的是,我们的项目与Oracle绑定在一起。

过滤器可以以比较(=,<,<=,>=,>,IS NULL)或列表( in () )的形式出现,排序只是带有方向的单个列。分页是开始行号和结束行号。

长话短说,我们正在走向一个使用Spring和MyBatis的基于java的架构。我很难弄清楚如何用MyBatis以一种简单的方式实现同样的功能。包装器的好处是,我们只需编写一次基本查询,然后它就会变成网格所需的任何查询。由于我们讨论的可能有数万条记录,并且我们需要分页,因此将数据拉回服务器并进行基于java的过滤/排序并不是一个真正的选择。

以前有没有人解决过这个(或类似的)问题?我已经(简要地)看到了MyBatis的动态SQL功能,但它似乎没有提供我所需要的灵活性和强大功能。我说错了吗?

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

我应该指出的是,我们现在是探索性的,使用ORM并不是完全不可能的。这是不是使用Hibernate更容易完成的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-29 23:04:44

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

我认为MyBatis可以很好地做到这一点。但是,对于查询的动态部分,我会把MyBatis放在一边,并像使用PHP一样实现它:在Java语言中生成语句的WHERE和ORDER BY部分。

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

如下所示:

代码语言:javascript
运行
复制
<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>

对于分页,您必须包装另一个子查询以使用奇怪的oracle rownum结构(但您可能已经这样做了)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9488546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档