一、对比场景

场景:数据库分表时,需要将分表的表序号传入的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中的#与$的区别的更多相关文章

  1. 【mybatis】mybatis中 的# 和 $的区别

    mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html

  2. mybatis中的#和$的区别 以及 防止sql注入

    声明:这是转载的. mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...

  3. [转]MyBatis中resultType与resultMap区别

    MyBatis中关于resultType和resultMap的具体区别如下: MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap.resu ...

  4. 【mybatis】从一个错误,看mybatis中的#和$的区别

    事情的发展是这样的: 因为一个需求,需要在java中拼接出一个完整的sql语句,然后将整条sql语句传递给mybatis执行. mapper.java是这样的: int insertMaster(Wo ...

  5. Mybatis中的#{}和${}的区别?

    1,首先Mybatis中的#{}与${}到底有什么区别? #{}:表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{} ...

  6. 浅析mybatis中${}和#{}取值区别

    mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${p ...

  7. Mybatis中resultMap与resultType区别

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultM ...

  8. mybatis中#和$符号的区别

    mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...

  9. mybatis中#和$符号的区别(转)

    mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...

随机推荐

  1. redis是如何存储对象和集合的

    在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异步),并且像ribb ...

  2. MyBitis(iBitis)系列随笔之三:简单实现CRUD

    Mybitis(iBitis)实现对对象增删改查操作要借助<select/>查询,<insert/>增加,<update/>更新,<delete/>删除 ...

  3. Window发声函数Beep、MessageBeep

     C++ Code  1234567891011   WINBASEAPI BOOL WINAPI Beep(__in DWORD dwFreq,      __in DWORD dwDuration ...

  4. React + Redux 入门(一):抛开 React 学 Redux

    http://www.hacke2.cn/think-in-react-redux-1/

  5. iOS开发之--当遇到tableView整体上移时的解决方案

    方案一在使用了navigationController后,当界面进行跳转往返后,时而会出现tableView上移的情况,通常会自动上移64个像素,那么这种情况,我们可以关闭tableView的自动适配 ...

  6. 阿里云CentOS6.8安装MySQL5.6

    1.使用SSH Secure Shell工具连接阿里云服务器 2.使用SSH Secure File Transfer工具上传MySQL压缩包 3.解压MySQL压缩包到指定目录(需要在先/usr/l ...

  7. js 中的变量声明提前总结

    一.var 声明 ES6之前,js 中声明变量基本上用 var 关键字: 1.如果访问未声明的变量,会报错:ReferenceError 2.声明了未赋值,值为 undefined,跟前面的报错是两回 ...

  8. R中利用SQL语言读取数据框(sqldf库的使用)

    熟悉MySQL的朋友可以使用sqldf来操作数据框 # 引入sqldf库(sqldf) library(sqldf) # 释放RMySQL库的加载(针对sqldf报错) #detach("p ...

  9. ELK basic---http://udn.yyuap.com/doc/logstash-best-practice-cn/filter/grok.html

    http://blog.csdn.net/lgnlgn/article/details/8053626 elasticsearch学习入门 input {stdin{}}filter { grok { ...

  10. 小程序 Page is not constructed because it is not found.

    如下错误一般发生在点击事件切换页面的时候 解决方式: 在需要切换到的那个页面的js文件中添加Page({ })方法即可解决此问题. Tis:在js文件中输入Page回车,可自动添加Page方法,包括里 ...