浅谈 Mybatis中的 ${ } 和 #{ }的区别

没有检索到摘要

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

好了,真正做开发也差不多一年了。一直都是看别人的博客,自己懒得写,而且也不会写博客,今天就开始慢慢的练习一下写博客吧。前段时间刚好在公司遇到这样的问题。

一、举例说明

1 select * from user where name = "dato"; 
2 
3 select * from user where name = #{name}; 
4 
5 select * from user where name = ${name}; 

一般情况下,我们都不会注意到这里面有什么不一样的地方。因为这些sql都可以达到我们的目的,去查询名字叫dato的用户。

二、区别

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现

select * from user where name = #{name}; 

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?; 

 

 

那么我们使用 ${}的时候

select * from user where name = ${name}; 

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "dato"; 

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

这是 #{} 和 ${} 我们能看到的主要的区别,除此之外,还有以下区别:

  • #方式能够很大程度防止sql注入。
  • $方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名.
  • 一般能用#的就别用$.

所以我们在使用mybatis的时候,尽量的使用#方式!!!这是大家要注意的地方

MyBatisJPA都是持久层框架,用于简化数据库操作。它们各自有优势适用场景。 MyBatis是一种基于SQL的持久层框架,它提供了强大的灵活性可定制性。MyBatis允许开发人员直接编写SQL语句,并且可以更好地控制SQL的执行过程。此外,MyBatis还提供了丰富的功能扩展插件,使得开发过程更加便捷。 JPA是一种Java持久化API,它是JavaEE规范的一部分。JPA提供了一种对象关系映射的方式,通过注解或XML配置来实现对象与数据库表之间的映射关系。相比于MyBatis,JPA更加面向对象,提供了更高层次的抽象。JPA还提供了一些方便的特性,例如自动生成数据库表结构、查询语言JPQL等。 选择使用哪个框架要根据具体的业务需求团队技术栈来决定。如果你对SQL的控制灵活性要求较高,或者已经有一套成熟的SQL语句库,那么MyBatis可能更适合你。如果你更注重对象与数据库之间的映射以及JavaEE规范的一致性,或者希望使用更高级的特性,那么JPA可能更适合你。 当然,这两个框架的选择并不是互斥的,有时候也可以结合使用。比如,可以在项目中使用JPA进行简单的CRUD操作,而对于复杂的SQL查询,可以使用MyBatis来实现。这样既能享受到JPA的便捷性,又能发挥出MyBatis的灵活性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [jpa mybatis](https://blog.csdn.net/weixin_57393819/article/details/125515358)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [浅谈mybatisjpa的区别](https://blog.csdn.net/zhangzhanbin/article/details/115562266)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值