Mybatis动态传入字段查询

本文探讨了在MyBatis中如何运用动态SQL实现字段动态传入并校验返回值,重点比较了使用$与#符号传参的不同之处及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做公司的项目需要做字段动态传入,然后校验返回值,所以去网上找了下

    <select id="queryAll" resultType="mp.study.demo.bean.User">
        select
        <if test="sets != null and sets.size > 0">
            <foreach collection="sets"
                     item="sets"
                     separator=",">
                ${sets}
            </foreach>
        </if>
        from mp_user
    </select>

这里用$符而不是#,后面会说

看打印SQL:
在这里插入图片描述

    @Override
    public List<User> queryAll()
    {
        Set<String> set = new LinkedHashSet<>();
        set.add("id");
        set.add("name");
        set.add("age");
        return userMapper.queryAll(set);
    }

这完全没毛病,也做到了动态化的效果. 那么如果用#会怎么样呢?

==>  Preparing: select ? , ? , ? from mp_user 
==> Parameters: id(String), name(String), age(String)
<==    Columns: id, name, age
<==        Row: id, name, age

很显然,传入的参数全部变成了?,这里我就想到了 $ 和 # 传参的区别. 以前我们老生常谈的话题, 面试题大多数人也都背到过. 这样可以防止SQL注入,更加安全.
我想起来前段时间我看我的同事写动态SQL的时候,就是用 $符号传参,虽然也能起到效果,但是他还需要自己拼接引号. 这是个不同点,# 注入参数会带引号. 而 $ 符号是没有经过编译处理的,所以就是个普通变量. 这样就是为什么动态注入字段要用 $ 而不是 # 的原因了!所以比如order by 排序的时候, 要是动态字段的话,你也得用 $ 注入

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值