当前位置: 代码网 > it编程>编程语言>Java > Mybatis-plus如何在xml中传入自定义的SQL语句

Mybatis-plus如何在xml中传入自定义的SQL语句

2024年05月28日 Java 我要评论
项目场景项目需求需要在一个框架上二开,原框架有权限校验会返回对应的权限sql语句。例如:在获取用户当前组织及下级组织后拼接生成的sql:and ( settlement_company_id i

项目场景

项目需求需要在一个框架上二开,原框架有权限校验会返回对应的权限sql语句。

例如:

在获取用户当前组织及下级组织后拼接生成的sql:

and (
    settlement_company_id in ( 
        '06eb1b4ce4d24e368319188bb4fc6390', 
        '9ff034739e984f188612c671219ddfed', 
        'afe69288c0b84828bd2abcb1c5eec28a' 
    ) 
)

因为有使用到关联查询,无法直接使用querywrapper的apply来拼接语句,只能在xml中拼接。 

问题描述

查询传入实体:

@data
public class yygkbankaccountqueryform {
        /**
         * 数据权限sql
         */
        @apimodelproperty(value = "数据权限sql")
        private string extrasql;
}

mapper类:

public interface yygkbankaccountmapper extends basemapper<yygkbankaccountentity> {
    /**
     * 分页查询银行账户
     *
     * @param ipage                 分页数据
     * @param yygkbankinfoqueryform 查询参数
     * @return ipage<yygkbankaccountentity>
     */
    ipage<yygkbankaccountentity> querypage(ipage<yygkbankaccountentity> ipage, @param("query") yygkbankaccountqueryform yygkbankinfoqueryform);
}

xml的查询sql语句:

<select id="querypage" resultmap="basemap">
    select
    <include refid="yygkbankaccountsql"/>
    from yygk_bank_account ba
    left join yygk_currency_info ci on ba.currency_id = ci.id
    <where>
        ba.delete_mark != 1
        <if test="query.extrasql != null and query.extrasql != ''">
            and #{query.extrasql}
        </if>
    </where>
    order by ba.sort desc
</select>

query.extrasql为我需要拼接的sql语句。

执行查询的打印日志:

2022-06-17 18:59:55.981 debug 16768 --- [io-30601-exec-1] c.g.y.m.y.querypage_mpcount              : ==>  preparing: select count(1) from yygk_bank_account ba where ba.delete_mark != 1 and ?
2022-06-17 18:59:56.088 debug 16768 --- [io-30601-exec-1] c.g.y.m.y.querypage_mpcount              : ==> parameters:  (settlement_company_id in( '06eb1b4ce4d24e368319188bb4fc6390','9ff034739e984f188612c671219ddfed','afe69288c0b84828bd2abcb1c5eec28a' ) )(string)
2022-06-17 18:59:56.174 debug 16768 --- [io-30601-exec-1] c.g.y.m.y.querypage_mpcount              : <==      total: 1

可以看到在执行了mybatis-plus的count查询后并没有再执行查询数据

原因分析

怀疑是要用sql注入才能拼接sql语句

解决方案

xml的sql语句改为使用sql注入:

<select id="querypage" resultmap="basemap">
    select
    <include refid="yygkbankaccountsql"/>
    from yygk_bank_account ba
    left join yygk_currency_info ci on ba.currency_id = ci.id
    <where>
        ba.delete_mark != 1
        <if test="query.extrasql != null and query.extrasql != ''">
            and ${query.extrasql}
        </if>
    </where>
    order by ba.sort desc
</select>

将#{}替换成${}

2022-06-17 19:21:05.437 debug 9008 --- [io-30601-exec-2] c.g.y.m.y.querypage_mpcount              : ==>  preparing: select count(1) from yygk_bank_account ba where ba.delete_mark != 1 and (settlement_company_id in ('06eb1b4ce4d24e368319188bb4fc6390', '9ff034739e984f188612c671219ddfed', 'afe69288c0b84828bd2abcb1c5eec28a'))
2022-06-17 19:21:05.523 debug 9008 --- [io-30601-exec-2] c.g.y.m.y.querypage_mpcount              : ==> parameters: 
2022-06-17 19:21:05.598 debug 9008 --- [io-30601-exec-2] c.g.y.m.y.querypage_mpcount              : <==      total: 1
2022-06-17 19:21:05.630 debug 9008 --- [io-30601-exec-2] c.g.y.m.yygkbankaccountmapper.querypage  : ==>  preparing: select ci.currency_code as currency_code, ba.id, ba.bank_id, ba.bank_name, ba.bank_short_name, ba.bank_english_name, ba.swift_code, ba.account_name, ba.sort, ba.account_number, ba.receipts_payment_type, ba.internal_account, ba.settlement_type, ba.account_type, ba.deposit_type, ba.settlement_company_id, ba.settlement_company_name, ba.default_mark, ba.currency_id, ba.currency_code, ba.account_identification, ba.opening_bank_identification, ba.billing_account, ba.remark, ba.creator_time, ba.creator_user_id, ba.creator_user, ba.last_modify_time, ba.last_modify_user_id, ba.last_modify_user, ba.enable_mark, ba.delete_time, ba.delete_user_id, ba.delete_mark from yygk_bank_account ba left join yygk_currency_info ci on ba.currency_id = ci.id where ba.delete_mark != 1 and (settlement_company_id in( '06eb1b4ce4d24e368319188bb4fc6390','9ff034739e984f188612c671219ddfed','afe69288c0b84828bd2abcb1c5eec28a' ) ) order by ba.sort desc limit ?
2022-06-17 19:21:05.635 debug 9008 --- [io-30601-exec-2] c.g.y.m.yygkbankaccountmapper.querypage  : ==> parameters: 20(long)
2022-06-17 19:21:05.651 debug 9008 --- [io-30601-exec-2] c.g.y.m.yygkbankaccountmapper.querypage  : <==      total: 2

可以看到在执行了mybatis-plus的count查询后,继续执行了查询数据语句。

虽然问题解决,但我还是不理解为何将#{}换成${}就能成功。。。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com