Mybatis 错误笔记

将自己遇到的一些错误总结一下,方便以后复习回顾。同时也希望能帮助更多的人

; 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 语句)中出现< 和 >而报出的错误。

  1. 用转义字符把">“和”<"替换掉。

    &lt;     	<   	小于号   
    &gt;     	>   	大于号   
    
    <if test="time!= null ">
        AND  lastLogin &lt;= #{time,jdbcType=DATE}>
    </if>
    
  2. 使用<![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条,这样就没有报错了

猜你喜欢

转载自blog.csdn.net/yamadeee/article/details/80927821