06 #{}和${}的区别

1 #{}和${}的区别

#{}和${}都可以获取map中的值或者pojo对象属性的值

TbUser select5(@Param("username") String username, @Param("phone") String phone);
<select id="select5" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
    select
        *
    from
        tb_user
    where
        `username` = ${username} AND
        `phone` = #{phone}
</select>

测试

@Test
public void test09() {
    TbUser tbUser = tbUserMapper.select5("kobe","13100001111");
    System.out.println(tbUser);
}

报错,观察日志输出的sql语句:

select * from tb_user where `username` = kobe AND `phone` = ?

可以看到#{}和${}的区别

  • #{} : 是以预编译的形式, 将参数设置到sql语句中;就像是jdbc原生的PreparedStatement一样,占位符的形式;防止sql注入
  • ${} : 取出的值直接拼装在sql语句中;会有安全问题

那这里为啥报错,是因为username的这一列是varchar类型,正确的sql

select * from tb_user where `username` = 'kobe' AND `phone` = ?

所以修改一下xml:

<select id="select5" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
    select
        *
    from
        tb_user
    where
        `username` = '${username}' AND
        `phone` = #{phone}
</select>

这就可以了

2 #{}和${}在模糊查询的时候使用区别

TbUser selectLike(@Param("username") String username, @Param("phone") String phone);
<select id="selectLike" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
    select
        *
    from
        tb_user
    where
         `username` like '%${username}%' AND
        `phone` like '$'#{phone}'$'
</select>

测试

@Test
public void test10() {
    TbUser tbUser = tbUserMapper.selectLike("kobe","13100001111");
    System.out.println(tbUser);
}

日志输出的sql:

select * from tb_user where `username` like '%kobe%' AND `phone` like '$'?'$' 

明白了二者的区别,就知道该如何写了

3 总结

  • 大多情况下,我们去参数的值都应该去使用#{}。

    • 原生jdbc不支持占位符的地方我们就可以使用${}进行取值,比如分表、排序。。。;按照年份分表拆分
// 动态传入表名
TbUser select6(@Param("tableName") String tableName, @Param("id") Long id);

就不能使用#{tableName}取值,原生jdbc不支持在表名的位置使用占位符

<select id="select6" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
     select
         *
     from
         #{tableName}
     where
         id = #{id}
 </select>

应该使用 t a b l e N a m e , {tableName}, tableName{}是直接替换文本,而不是占位符的形式

  <select id="select6" resultType="study.wyy.mybatis.sqlmapper.model.TbUser">
        select
            *
        from
            ${tableName}
        where
            id = #{id}
    </select>
@Test
public void test11() {
    TbUser tbUser = tbUserMapper.select6("tb_user",1L);
    System.out.println(tbUser);
}

类似的还有指定排序字段,是降序还是升序排序

引用\[2\]:SAP中计划独立需求事务菜单如下,共中MD63和MD73的功能应该都是显示计划独立需求,两者在菜单中分属于己计划的独立求和评估,但具体在应用中有什么分别呢?笔者也不知道,只是偶然发现该功能,出于好奇,想分析一下。 。 问题: SAP MD06和md07的区别 回答: 根据提供的引用内容,我无法找到关于SAP MD06和MD07的具体区别的信息。引用\[2\]中提到了SAP中的计划独立需求事务菜单,但并没有提到MD06和MD07。因此,我无法回答关于MD06和MD07的区别。如果您有其他相关的信息或者问题,请提供更多的上下文,我将尽力帮助您解答。 #### 引用[.reference_title] - *1* [[转载]SAP MD01和MD02对同一个物料运行结果不一致原因(转)](https://blog.csdn.net/weixin_39630744/article/details/111741599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SAP中显示需求事务MD63和MD73的比较分析](https://blog.csdn.net/lj663/article/details/107173835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SAP MD04详解](https://blog.csdn.net/champaignwolf/article/details/104258301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值