SSM 中 MyBatis 的某个 xxxMapper.xml 中,是否可以这样写?

本贴最后更新于 392 天前,其中的信息可能已经时过境迁
            <if test="planMajorName != null and  planMajorName != '' and r1 = '0'">
                AND a.planmajorname = #{planMajorName}
            </if>
            <if test="planMajorName != null and  planMajorName != '' and (r1 = null or r1 = '')">
                AND a.planmajorname LIKE
                <if test="dbName == 'oracle'">'%'||#{planMajorName}||'%'</if>
                <if test="dbName == 'mssql'">'%'+#{planMajorName}+'%'</if>
                <if test="dbName == 'mysql'">concat('%',#{planMajorName},'%')</if>
            </if>

使用某个字段做标记,对另一个字段进行筛选查询。

还是说碰见这种情况,直接单独写一个查询方法?

  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 Google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    151 引用 • 404 回帖 • 691 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1764 引用 • 11553 回帖 • 581 关注

赞助商 我要投放

被采纳的回答
  • someone9891

    那可以用 choose 标签嘛,

    <choose>
                    <when test="date != null and date != ''">
                        where t.task_date = #{date}
                    </when>
                    <otherwise>
                        where t.task_date = to_char(sysdate,'yyyy-MM-dd')
                    </otherwise>
                </choose>
    

    比如这样。

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • PeterChu

    没时间测试到底如何实现,还是单独再写一个查询方法了。

  • someone9891

    你还不如把 % 直接拼接到参数里去

  • someone9891

    比如:

    String planMajorName = "%" + planMajorName + "%",

    SQL 里面直接 写 #{planMajorName},

  • someone9891

    而且,多数据源,但是表一样??? 这是什么鬼?

    1 回复
  • DrJoseph

    看到 dbName == 'oracle' 这样的判断我还是头一次在 SQL 里见过 😳

  • PeterChu

    😁 这个是 jeesite、jeeplus 框架项目里面都是这种,可以配置不同的数据库,不用单独修改 mapper.xml 好像。

    1 回复
  • someone9891

    那可以用 choose 标签嘛,

    <choose>
                    <when test="date != null and date != ''">
                        where t.task_date = #{date}
                    </when>
                    <otherwise>
                        where t.task_date = to_char(sysdate,'yyyy-MM-dd')
                    </otherwise>
                </choose>
    

    比如这样。

    1 回复
  • PeterChu

    cool
    应该可以的。

  • Eddie 1 评论

    我说。。。为什么不直接传 %planMajorName%

    1 回复
    一个方法是 m(key) 里面调用 d_findlike(%key%) 这样啊 。
    Eddie
  • PeterChu

    这块我其实是传的 "xxx%xxx%xxxx%xx"
    至于这块拼接 % 的原因大致是因为此处是个 findList 的查询 SQL,适用于很多地方,尤其是用在用户输入某字段值后进行模糊匹配查询,这种可能是因为在这块 SQL 中设置拼接 % 比在 C 或 S 层进行拼接要方便多,最主要是这个是 代码生成 的一个功能决定的应该。
    jeeSite 这类有 代码生成 功能的框架应该这么处理是最好的吧。

请输入回帖内容 ...