Mybatis中的#与$的区别

摘要:
)解决方案:Collect_#{tblNum}被修改为Collect_${tblNum}解决了问题。通常,不要使用$。如果您可以使用#。
一、对比场景

场景:数据库分表时,需要将分表的表序号传入的sql中。

SpringBoot中使用注解如下:

@Insert("insert into collect_#{tblNum}(id,user_id,resource_id,resource_name,author,album,resource_type,create_time,update_time)" +
            " values (uuid(),#{userId},#{collect.resourceId},#{collect.resourceName},#{collect.author}," +
            "#{collect.album},#{collect.resourceType},#{time},#{time})")  

报错提示找不到表 

2018-06-20 08:55:04.398 ERROR [http-nio-9902-exec-2][CollectController.java:69] - org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'into collect_?(id,user_id,r',expect QUES, actual QUES collect_ : insert into collect_?(id,user_id,resource_id,resource_name,author,album,resource_type,create_time,update_time) values (uuid(),?,?,?,?,?,?,?,?)
### SQL: insert into collect_?(id,user_id,resource_id,resource_name,author,album,resource_type,create_time,update_time) values (uuid(),?,?,?,?,?,?,?,?)
### Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'into collect_?(id,user_id,r',expect QUES, actual QUES collect_ : insert into collect_?(id,user_id,resource_id,resource_name,author,album,resource_type,create_time,update_time) values (uuid(),?,?,?,?,?,?,?,?)
; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; sql injection violation, syntax error: syntax error, error in :'into collect_?(id,user_id,r',expect QUES, actual QUES r1_mini_collect_ : insert into collect_?(id,user_id,resource_id,resource_name,author,album,resource_type,create_time,update_time) values (uuid(),?,?,?,?,?,?,?,?); nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'into r1_mini_collect_?(id,user_id,r',expect QUES, actual QUES collect_ : insert into collect_?(id,user_id,resource_id,resource_name,author,album,resource_type,create_time,update_time) values (uuid(),?,?,?,?,?,?,?,?)

 解决办法:collect_#{tblNum}修改为collect_${tblNum}即可解决问题。

二、#与$的区别

Mybatis中的#与$的区别如下

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,所以我们在插入字符串的时候不需要加''或者“”,因为这个是#帮我们加上的。如:order by #{user_id},如果传入的值是123,那么解析成sql时的值为order by "123", 如果传入的值是id,则解析成的sql为order by "id".
  2. $将传入的数据直接显示生成在sql中,如:order by ${user_id},如果传入的值是123,那么解析成sql时的值为order by 123,  如果传入的值是id,则解析成的sql为order by id。
  3. #方式能够很大程度防止sql注入,$方式无法防止Sql注入。
  4. $方式一般用于传入数据库对象,例如传入表名。
  5. 一般能用#的就别用$. 。

参考文章:

https://blog.csdn.net/downkang/article/details/12499197

免责声明:文章转载自《Mybatis中的#与$的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇第16本:《视觉繁美:信息可视化方法与案例解析》SQLSERVER创建该存储过程时不会出错,但是执行存储过程时报错下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MyBatis基础总结

1.1什么是MyBatis MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架, 它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射, 用以将接口和Java的POJO(Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得...

MyBatis直接执行SQL查询及批量插入数据

一、直接执行SQL查询:  1、mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel">  <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> ...

JAVA框架-Mybatis中(代理、动态SQL和高级映射)

Mapper代理 在上一个博客中,我们直接利用session和<select>标签来执行sql的方式存在一些问题。 session执行sql时都需要提供要执行sql的id,而这个id是字符串类型,意味着id是否正确在编译期间是无法获知的,必须等到运行时才能发现错误, sql需要的参数和返回值类都不明确,这也增加了出错的概率 我们最理想的方式...

mybatis 关联查询如何

关联查询: 有job表 和 recruitment表  ,job表有个recruitment_id 字段 与 recruitment 表关联 job表结构 recruitment 表结构:    Job.java @Data @Table(name = "t_job") public class Job{ /** * */...

Mybatis笔记(一)

目录 MyBatis MyBatis简介 MyBatis作用 历史 为什么要使用MyBatis? JDBC Hibernate Mybatis MyBatis入门程序 1.下载Mybatis核心包 2.创建工程,引入MyBatis核心包及依赖包 3.创建customer表,建立与表对象的domain 4.创建MyBatis核心配置文件Sq...

mybatis BaseMapper int insert(T entity) 方法异常

//该方法报错,猜测的jdbc jar包有bug,属性超过8个会报数组溢出异常,因为是使用属性下标取值,不是根据属性名称取值// 使用ojdbc6 11.2.0.2.0,估计jar包有问题// 解决办法1:实体类实现序列话接口Serializable,并生成序列化id // 解决办法2:改用xml写sql语句,指定jdbcType,防止属性为空时不能识别...