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注入问题。
综上所述,貌似实在找不到用$的任何优点。所以一般能用#的就别用$,尽量的使用#方式。