错误一:
java.sql.SQLSyntaxErrorException:ORA-01745:invalid host/bind variable name
插入少量数据的时候是没有错的,插入大量数据时就会报错。(一下子插入了3万条数据,导致拼接的sql过长,所以报错)
解决方法:在service层对数据列表进行分割,分为2000条为一个列表,然后再插入。即分批次插入。
错误二:
java.sql.SQLSyntaxErrorException:ORA-01745:invalid host/bind varaible name
解决方法:将参数引用时的#{}改为${}.
错误三:
org.apache.ibatis.reflection.ReflectionException:There is no getter for property named 'teamName' in 'class java.lang.String'
解决方法:在方法的参数列表中要加上@Param("参数名")
错误四:动态传入表名时出现的错误:
java.sql.SQLSyntaxErrorException:ORA-00903:invalid table name
传过来的时候前面的log显示表名可以获取到,就说明是在参数赋值时出错了。
解决方法:动态传入时应该将#{}改为${},如:
@Delete("DELETE FROM ${tableName}")
int deleteTable(@Param("tableName") String tableName);
错误五:
org.apache.ibatis.builder.BuilderException:Could not find value method on SQL annotation.
原因是在注解开发中使用了小于号,应该把小于号换为<如果是小于等于的话,就写成<=即可。
错误六:java.sql.SQLRecoverableException:IO Error:Got minus one from a read call
解决方法:插入的数据量太大,可以考虑批量插入。
错误七:
在mybatis中执行select语句时如下语句:
@Select("SELECT APP_NAME appName,TECHNOLOGY_BUSINESS technologyBusinessSupportManager .......")
上面的语句虽然字段名是符合了数据库命名要求不能超过30个字符,字段名后面的使我们要对应的实体类的属性名。
但是,特别要注意的是后面虽然是属性名,但在单纯的sql中,它也是字段的别名,
就像我们平时在数据库中写的sql中会直接在字段后面加上一个词表示别名,
因此这个别名/属性名也是要满足不超过30个字符的要求的。
否则就会报出:identifier is too long的错误。
错误八:
nested exception is org.apache.ibatis.type.TypeException:
Could not set parameters for mapping:
ParameterMapping{property='supportTeam',mode=IN,javaType=class java.lang.String,jdbcType=null,numericScale=null........}
这是由于在mybatis向oracle中插入Null值时要指定jdbcType.
更改为:#{supportTeam,jdbcType=VARCHAR}即可。
错误九:
nested exception is java.sql.SQLSyntaxErrorException:ORA-01747:INVALID USER.TABLE.COLUMN,TABLE.COLUMN,OR COLUMN SPECIFICATION
解决方案:在mybatis注解中如果使用if标签动态判断字段值并且要用逗号连接多个值的时候,就在每个If标签中机上逗号,然后使用trim标签,自动去掉最后一个条件中的逗号即可。
错误十:ORA-00909:invalid number of arguments
出现该错误是由于在mybatis注解方式开发模糊查询的like语句时出错的,原本我写的是在注解里面的语句中用like,%,''等多重字符进行拼接,导致错误。
正确的做法应该是,如果要模糊匹配的那个值是参数,就直接在service层将like语句拼接好,到时候直接把like语句片段作为参数传给dao,这样就会简化在dao的注解中复杂的字符拼接。