将自己遇到的一些错误总结一下,方便以后复习回顾。同时也希望能帮助更多的人
; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-00911: 无效字符
### Cause: java.sql.SQLException: ORA-00911: 无效字符
; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-00911: 无效字符
] with root cause
; bad SQL grammar []一般是语法错误,检查一下sql是否可以正常运行。
但是如果在数据中可以运行的话,检查一下映射文件是否写;
解决方法 : 检查是否在sql语句的末尾有;
,在映射文件中不需要写;
此外,一般情况下一条语句对应一个mapper标签。如果在一个标签中执行多条语句时,也会报该错误。
这与底层的sql驱动程序有关详情
在数据库中执行sql有值,使用mabatis取出来后却为null
- 主要的原因就是
实体类属性和数据库 字段无法匹配
,mybatis找不到对应的映射关系,导致为null。 实体类属性和数据库字段匹配
也可能会导致null。
检查mybatis配置文件是否开启了 驼峰命名规则(camel case)映射(<setting name="mapUnderscoreToCamelCase" value="true" />
)。<resultMap type="com.domain.User" id="xx"> <result column="USER_ID" property="user_id"></resultMap>
,此时mybatis ,会为User的userId属性赋值。当然这是针对于使用<resultMap>
进行字段映射时有效。
如果只是单纯查询语句是不会做映射的。
<select id="getSubmitStatus" resultType="map">
SELECT VALUE_CODE,VALUE_MEANING FROM DIRACTORY WHERE GROUP='submitStatus'
</select>
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘param’ in ‘class java.lang.String’
parameterType=“string”,并判断了 参数是否为空
<select id="xxxxxx" parameterType="string" resultType="int">
SELECT
COUNT(*)
FROM VIEW_USER_INFO T
<where>
<if test="param!=null">
T.CORP_ID like #{param}||'%' OR T.CORP_NAME like '%'||#{param}||'%'
</if>
</where>
</select>
使用<if>
的时候,默认情况下,mybatis自动调用OGNL寻找String的param属性。
解决方案
- 使用 _parameter 替换参数
- 使用mybatis默认的对象名:value 替换参数
<select id="xxxxxx" parameterType="string" resultType="int">
SELECT
COUNT(*)
FROM VIEW_USER_INFO T
<where>
<if test="value!=null">
T.CORP_ID_CUS like #{param}||'%' OR T.CORP_NAME like '%'||#{param}||'%'
</if>
</where>
</select>
ORA-01013: 用户请求取消当前的操作
这个Oracle报的错误,主要就是请求超时的原因。有可能是当前访问量特别大导致的;也可能是设置的超时间太短;也可能是出现死锁。
我遇到的问题就是死锁,当时在Oracle可视化工具(sql developer)中执行了更新操作但是并没有commit
,所以导致事务一直占用表的写锁。从而导致其他的写操作一直等。 如果是这种原因,commit
提交就可以了
如果是因为请求时间太短导致的问题
#java解决方法
Statement.setQueryTimeout(0);
#修改配置文件
$ORACLE_HOME/network/admin/sqlnet.ora .
#添加或修改成:
sqlnet.expire_time = 0
这将关闭oracle的连接状态检测
The content of elements must consist of well-formed character data or markup.
错误的大概意思是 “ 元素内容必须由格式良好的字符数据或者标记组成”,也就是说xml元素中包裹的内容有错误。
网上很多都在说元素本身的错误。比如 < p>aa </p> <122>as</122>
.。有以下依据
XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
我的问题并不是元素本身的出的问题,而是元素内容(sql 语句)中出现< 和 >
而报出的错误。
-
用转义字符把">“和”<"替换掉。
< < 小于号 > > 大于号
<if test="time!= null "> AND lastLogin <= #{time,jdbcType=DATE}> </if>
-
使用
<![CDATA[ ]]>
符号进行说明,将此类符号不进行解析<if test="time!= null "> AND <![CDATA[ lastLogin <= #{time,jdbcType=DATE} ]]> </if>
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
一般的原因是Mapper interface和xml文件的定义对应不上,需要检查包名,namespace,函数名称等能否对应上。
按以下步骤一一执行:
1:检查xml文件所在的package名称是否和interface对应的package名称一一对应
2:检查xml文件的namespace是否和xml文件的package名称一一对应
3:检查函数名称能否对应上
4:去掉xml文件中的中文注释
mybatis更新问题
mybatis 的返回值,mybatis 仅仅只是返回的数据库连接驱动(通常是 JDBC )的返回值,也就是说,如果驱动告知更新 2 条记录受影响,那么我们将得到 mybatis 的返回值就会是 2 和 mybatis 本身是没有关系的。
如果我们非得要 mybatis 的 update 操作明确的返回受影响的记录条数,
通过对 JDBC URL 显式的指定 useAffectedRows 选项,我们将可以得到受影响的记录的条数:
jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true
Error querying database. Cause: java.sql.SQLException: ORA-01745: 无效的主机/绑定变量名
因为需要按照指定字段排序所以直接在原来的sql中添加Order by #{orderBy} #{order}
,结果就抛出这个错误。
原因大概如下
- 结果集中的字段含有对应的数据库产品的关键字,
- 在xml文件中的SQL语句中,两个填充变量间没有写逗号。
- 一次性插入大量数据
很明显我的错误的原因时第二个,占位符的方式传递参数是没有逗号将SQL语句中order by #{sortName} #{sortOrder} 改写为<![CDATA[order by ${sortName} ${sortOrder} ]]>
问题就解决了!
我在网上查找资料的时候其实只提供了前两个出错原因。在实际操作的时候因需求需要要插入1000+的数据,此时就报错了。使用的连接池是DruidDataSource,当程序还停留在解析sql语句的时候(预编译sql还有开始赋值),Sql Connection就自动关闭了。当时也查询了很多资料,感觉最好的解释就是,连接池会在一定时间后回收连接。根据指示修改了配置removeAbandonedTimeout
,结果也没有起作用。
后来的解决方案就是分块插入,一次插入500条,这样就没有报错了