1、jdbcType问题
mybatis3的报错:
org.apache.ibatis.exceptions.PersistenceException :
### Error updating database. Cause: org.apache.ibatis.type.TypeException : Error setting null
parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable
parameters. Cause: java.sql.SQLDataException: 尝试从类型“OTHER”的数据值获取类型 “VARCHAR”
的数据值。
### The error may involve org.mybatis.model.BlogMapper.insertBlog_user_autokey-Inline
### The error occurred while setting parameters
mybatis3用户指南的解释:
如果传递了一个空值,那这个JDBC Type 对于所有JDBC 允许为空的列来说是必须的。
您可以研读一下关于PreparedStatement.setNull()的JavaDocs 文档。
解决这个问题就需要在参数中指定 jdbcType 属性,这个属性只在 insert,update 或 delete
的时候针对允许空的列有用。
对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,mybatis默认jdbcType.OTHER
所以 当insert或者update时加入jdbcType可以避免出现这个异常
注:对于时间类型,如果只记录年月日,jdbcType即可指定为Date。如果需要记录时分秒,则需要指定jdbcType为TIMESTAMP类型。字符串可以是用varchar类型
2、字符串替换
默认的情况下,使用#{}语法会促使MyBatis 生成PreparedStatement 并且安全地设置
PreparedStatement 参数(=?)值。尽量这是安全、快捷并且是经常使用的,但有时候您可能想
直接未更改的字符串代入到SQL 语句中。比如说,对于ORDER BY,您可以这样使用
ORDER BY ${columnName}
这样 MyBatis 就不会修改这个字符串了。
� 警告: 这种不加修改地接收用户输入并应用到语句的方式,是非常不安全的。这使用户能够
进行SQL注入,破坏代码。所以,要么这些字段不允许用户输入,要么用户每次输入后都进行检测
和规避。