mybatis # 和$ 获取接收参数值的区别

 Mybatis 执行 入口是 DefaultSqlSession.selectOne()方法,可以通过debut这个方法,去查看这个原理。Mybaitis 封装了JDBC ,执行时会将我们注解(@Select) 或 Mapper 中的 Sql 和参数进行处理,并交给 PreparedStatement 来执行。

比如Mybatis 的sql语句如下:

SELECT * FROM ${table_name} WHERE name = #{name} AND password  = #{password}

 通过方法调用传入值

classDao.selectEntityByTableNameAndId("tb_student", "austin","123456");

被处理后的sq预处理语句变成

 

SELECT * FROM tb_student WHERE name = ? AND password  = ?

可以发现,后面由#号接受值得方式变成了“?”号占位符,后面通过PreparedStatement.setString 去分别设置占位符对应得值。

而$ 符号直接,把传入参数对应得值,填充到了sql语句了,这样显然容易导致sql注入。

所以总结如下:

都可以作为接受参数值的方式

但是$由于没有经过预处理语句处理,容易导致sql注入问题

如果非要使用$,除非传入的值不是由用户提交的,而是由服务器端提供的,如果非要前端提供,而且坚持要用$,可以这么做

比如前端用下拉框,后端通过获取下拉框的值(比如0,1,3)进行判断,从而从后台找到对应的字符串,这样就能做到既使用$,又防止sql注入问题。

综上所述,貌似实在找不到用$的任何优点。所以一般能用#的就别用$,尽量的使用#方式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值