一:项目报错:
java.lang.IllegalArgumentException: Mapped Statements collection already contains value for
网上搜到各种原因:
1、由于使用ibatis的TempTestTableMapper.xml实现接口TempTestTableMapper.java中的方法的时候的id有重复的值,比如 <select id="queryTempTestTableMap" resultMap="TempTestTableResult"> 中的TempTestTableResult在一个xml文件中有两个这样的id,修改过来即可
无论我检查多少遍,根本不存在重复的id,且报错的时候指向的数据库语句不止一个,由此怀疑是xml的问题。
2、user-mapper.xml如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.bmdc.dj.user.dao.UserDao"> <resultMap type="user" id="userResult"> <id property="user_id" column="USER_ID"/> <result property="login_name" column="LOGIN_NAME"/> <result property="real_name" column="REAL_NAME"/> <result property="password" column="PASSWORD"/> </resultMap> <insert id="add" parameterType="user"> insert into users (user_id, login_name, real_name, password)13 values(#{user_id}, #{login_name}, #{real_name}, #{password}) </insert> </mapper> 其中,namespace是接口路径。
Mybatis.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> <typeAlias type="com.bmdc.dj.user.domain.User" alias="user"/> </typeAliases> <mappers> <mapper resource="com/bmdc/dj/user/dao/user-mapper.xml" /> </mappers> </configuration> 其他配置文件都正确,我就不写了。这样就会出现 Java .lang.IllegalArgumentException: Result Maps collection already contains value for XXX这个错误。
解决办法是:删除Mybatis.xml中的<mappers>标签所有内容。因为如果user-mapper.xml与namespace的接口在同一路径下,就不需要在mybaits.xml中再进行配置了。
修改后的Mybatis.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> <typeAlias type="com.bmdc.dj.user.domain.User" alias="user"/> </typeAliases> </configuration> 我项目中压根就没有这些东西,问题没解决
3、eclipse编译了一份在bin目录下,将bin目录或者WEB-INF下class目录清空即可
我把该清理的全部清理掉,并清理并构建项目,问题依然存在。
4、将页面$(document).ready后ajax请求后台的方法改为async:false,就是异步为false,结果不好用。
5、后来搜到这么一条:(http://blog.csdn.net/dr_lf/article/details/48625867)
mybatis并发:
使用mybatis(使用mybatis jar包:mybatis-3.0.4.jar,mybatis-spring-1.0.0.jar)时发现一个并发问题引起的异常,应用场景:页面向服务端发送了三个请求, 同时请求一个方法,结果抛出异常:
java.lang.IllegalArgumentException: Mapped Statements collection already contains value for 问题原因:mybatis-3.0.4.jar,mybatis-spring-1.0.0.jar这两个jar包问题,是mybatis的一个buger,在此版本下并发就会出现上面的异常。 解决办法:使用新版本jar包替换现有项目中的mybatis-3.0.4.jar,mybatis-spring-1.0.0.jar包,在spring的配置文件中添加新的命名空间和schema。 修改步骤:1.替换为mybatis新jar包:mybatis-3.1.1.jar,mybatis-spring-1.1.0.jar。 2.在spring的配置文件中添加新的命名空间和schema: 命名空间:xmlns:util="http://www.springframework.org/schema/util" schemaLocation最后加入:http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd" 3.配置数据库连接: <1>将连原来的<context:property-placeholder location="classpath:/config/jdbc.properties"/> 改为:<util:properties id="dataSourceProps" location="classpath:/config/jdbc.properties"/>; <2>将所有<property name="driverClass" value="${datasource.driverClassName}" />改为 <property name="driverClass" value=" #{dataSourceProps['datasource.driverClassName ']}" />方式取值 我升级替换了一下jar包,在配置文件中按以上描述添加新的命名空间,数据连接因我使用的跟他不一样,所以没改,重启服务器后,访问模块,结果没再抛异常,问题终于得以解决。 二: MyBatis常见jar包mybatis的核心包只有一个mybatis-3.x.0.jar,另外还有一些【可选】的依赖包(日志、代理等所需要的),在下载的压缩包中可以找到.
下载地址:https://github.com/mybatis/mybatis-3/releases