每次搭建Mybatis环境和Spring整合的时候都会报这个错:java.lang.IllegalArgumentException: Result Maps collection already contains value for XXX这个错误。
搭建过程如下:
Spring Beans文件:
<!-- 配置包扫描 -->
<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->
<context:component-scan base-package="com.lgy">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 使其注解生效 -->
<context:annotation-config />
<!-- 加载数据源 -->
<import resource="datasource/data_source.xml"/>
<!-- 配置MyBatis SqlSessionFactory -->
<import resource="mybatis/my_batis.xml"/>
<!-- 配置MyBatis事物通知 -->
<import resource="transmanager/transmanager.xml"/>
Mybatis文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置MyBatis SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:myBatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml" />
</bean>
<!-- 采用自动扫描包的形式来实例化dao层 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lgy.dao.**" />
</bean>
</beans>
Mybatis core:
<?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.lgy.entry"/>
</typeAliases>
</configuration>
用package配置别名,就是把该包下的所有类都配置了别名。
Dao:
import com.lgy.entry.UserInfo;
import com.lgy.entry.base.UserInfoQuery;
/**
* 微信用户管理
* @author feng
*
*/
public interface UserInfoDao {
/**
* 增加用户信息
* @param userInfo
*/
void addUserInfo(UserInfo userInfo);
/**
* 修改用户订阅状态信息
* @param userInfo
*/
void updateUserInfoByOpenId(UserInfo userInfo);
/**
* 根据openId查找用户信息
*/
UserInfo findUserInfoByOpenId(String openId);
/**
* 查询所有用户信息 带分页条件
*/
List<UserInfo> finUserInfoList(UserInfoQuery userInfoQuery);
/**
* 获取所有的数量
* @param userInfoQuery
* @return
*/
Integer getCount(UserInfoQuery userInfoQuery);
}
Mappler文件:
<?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.lgy.dao.UserInfoDao">
<resultMap type="UserInfo" id="userInfoRM">
<id column="id" property="id"/>
<result column="open_id" property="openId" />
<result column="subscribe_status" property="subscribeStatus" />
</resultMap>
<!-- Limiti SQL -->
<sql id="userInfoLimit">
<if test="startRow != null and pageSize != null">
limit #{startRow},#{pageSize}
</if>
</sql>
<!-- 插入一条userinfo记录 -->
<insert id="addUserInfo" parameterType="UserInfo">
insert into weixin_user_info(id, openId, subscribe_status) values(null, #{openId}, #{subscribeStatus});
</insert>
<!-- 根据openId查找用户信息 -->
<update id="updateUserInfoByOpenId" parameterType="UserInfo">
update weixin_user_info
set
subscribe_status = #{subscribeStatus}
where
openId = #{openId}
</update>
<select id="findUserInfoByOpenId" parameterType="String" resultMap="userInfoRM">
select
ui.id id,
ui.openId open_id,
ui.subscribe_status subscribe_status
from
weixin_user_info ui
where
ui.openId = #{openId};
</select>
<!-- 带分页查询所有 -->
<select id="finUserInfoList" parameterType="UserInfoQuery" resultMap="userInfoRM">
select
ui.id id,
ui.openId open_id,
ui.subscribe_status subscribe_status
from
weixin_user_info ui
<include refid="userInfoLimit" />
</select>
<!-- 查询所有的条数 -->
<select id="getCount" parameterType="UserInfoQuery" resultType="Integer">
select count(1) from weixin_user_info
</select>
</mapper>
配置文件都正确。这样就会出现 java.lang.IllegalArgumentException: Result Maps collection already contains value for XXX这个错误。
解决办法是:删除Mybatis.xml中的<mappers>标签所有内容。因为如果user-mapper.xml与namespace的接口在同一路径下,就不需要在mybaits.xml中再进行配置了,也无需进行扫描。