mybatis使用报错记录
1、Error setting non null for parameter #1 with JdbcType null
详细错误信息
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property=‘tel’, mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId=‘null’, jdbcTypeName=‘null’, expression=‘null’}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
刚开始百思不得其解,仔细查看方法,没错呀!代码如下:
只得百度了,然后在这篇文章中看到如下说法:
https://blog.csdn.net/hebsun/article/details/84399483
@Delete("DELETE FROM t_xxx WHERE uid =’#{deviceSn}’ ")
注意,使用#{}的不能用这个双引号’’。真是画蛇添足啊。
我这里尝试了一下,结果还是报错:
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘%‘14567890987’% and recodStatus=1 order by createTime desc limit 1’ at line 1
这个错误就比较明显了,sql 语句错误,很明显like 不能这么用了,
必须要使用 CONCAT(’%’,#{0},’%’) 进行拼接,结合下面的帖子改了一下,
问题解决了
https://blog.csdn.net/weixin_38570967/article/details/80753489
修改如下:
在mybatis 中like 比较特殊,很多时候不能采用常规的方式进行参数传递,必须用concat
进行拼接才能得到正确的结果
2、参数别名
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'gidRuleRelationDOList' not found. Available parameters are [collection, list]
对于参数个数超过一个或非基本数据类型的参数,尽量使用别名
3、sql中的参数变量名
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named xxx
sql中的参数变量名是DO的变量名,非数据库中的字段名
4、关于like的补充
- #{}是参数化处理
- ${}是占位符替换
对于like的场景
#{}需要 concat('%',#{}.'%')
${} 可以直接 '%${}%'