Mapper.xml错误查找与分析。
在写mybatis的demo时 报错。
报错代码
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in com/scarecrow/mapper/OrdersMapper.xml
### The error occurred while processing mapper_resultMap[orders]_association[user]
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.scarecrow.mapper.OrdersMapper.orders
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:82)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:66)
at com.scarecrow.test.TestMybatis2.run(TestMybatis2.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
...
错误很明显出在OrdersMapper.xml中,
附上OrdersMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.scarecrow.mapper.OrdersMapper">
<resultMap type="Orders" id="orders">
<result column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<association property="user" javaType="User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
</association>
</resultMap>
<select id="selectOrders" resultMap="orders">
select o.id,o.user_id,o.number,o.createtime,u.username
from orders o
LEFT JOIN user u
on o.user_id=u.id
</select>
</mapper>
原因分析:
问题就出在
<resultMap type="Orders" id="orders">
<select id="selectOrders" resultMap="orders">
由于我在sqlMapConfig.xml文件中配置了<typeAliases>
标签,能够批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感)。
则com.scarecrow.javabean下的Orders类的别名 为 orders 以及 Orders。
所以在resultMap不能再使用 orders 或 Orders 否则相当于使用了resultType自动映射,而sql查询字段名和javabean属性名并不一致 导致报错。
附上sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.scarecrow.javabean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper class="com.scarecrow.mapper.UserMapper"/> -->
<package name="com.scarecrow.mapper"/>
</mappers>
</configuration>
解决方案:
将
<resultMap type="Orders" id="orders">
中的orders改成除Orders以外的其他命名。并修改<select>
中的resultMap在sqlMapConfig.xml 中
<typeAliases>
<package name="com.scarecrow.javabean"/>
</typeAliases>
使用<typeAlias alias="Orders" type="com.scarecrow.javabean.Orders" />
进行单个别名定义。