`

mybatis类型检测的不足

 
阅读更多

首先看两段配置:

User实例配置

 

 

<mapper namespace="com.zj.logistics.bean.User">
	
	<resultMap type="user" id="userResultMap">
		<id property="userid" column="userid" />
		<result property="username" column="username" />
		<result property="password" column="password" />
		<result property="deleteflag" column="deleteflag" />
		
		<collection property="ordersList" column="userid" javaType="ArrayList" ofType="Orders" 
			select="com.zj.logistics.bean.Orders.findOrdersByUserId" />
	</resultMap>
	<select id="findUserById" parameterType="String" resultMap="userResultMap">
		SELECT * FROM user u WHERE u.deleteflag = 0 AND u.userid = #{userid} 
	</select>
</mapper>

 

 

Orders实例配置:

 

<mapper namespace="com.zj.logistics.bean.Orders">
	
	<resultMap type="orders" id="ordersResultMap">
		<id property="orderid" column="orderid" />
		<result property="status" column="status" />
		<result property="cdate" column="cdate" />
		<result property="note" column="note" />
		<result property="deleteflag" column="deleteflag" />

                <association property="user" column="userid" javaType="User"
		 	select="com.zj.logistics.bean.User.findUserById" />
       </resultMap>

       <select id="findOrdersByUserId" parameterType="int" resultMap="ordersResultMap">
		SELECT * FROM orders o WHERE o.deleteflag = 0 AND o.userid = #{userid}
	</select>
</mapper>
 

 

很显然,参数类型不匹配。。但是,在mybatis加载的时候,不会报出异常。。更有意思的还在后面

这样配置后,当我们做单元测试时,调用user.xml中的findUserById的方法时,传递进去的是String类型的id,但是查询的结果有两种:

1)字符串id 以数字开头时,若数据库中存在记录,可以轻松查找。。

2)  字符串id 以字母开头时,会报出

Invalid value for getInt() 的异常

而且,异常的定位是在user中,看了很多眼,paramtype是string类型。。让人很难确定问题的原因

最终发现了user和orders的依赖关系,将orders中的int改为String-->OK

 

个人猜测,原因有一下几点:

1)如下图:

<mapper namespace="com.zj.logistics.bean.User">
	
	<resultMap type="user" id="userResultMap">
		<id property="userid" column="userid" />
		<result property="username" column="username" />
		<result property="password" column="password" />
		<result property="deleteflag" column="deleteflag" />
		<!-- 这时在orders的findOrdersByUserId方法中,已经将userid作为参数传入,将其类型绑定为int,在findbyuserid时,userid貌似不检测类型 -->
		<collection property="ordersList" column="userid" javaType="ArrayList" ofType="Orders" 
			select="com.zj.logistics.bean.Orders.findOrdersByUserId" />
	</resultMap>
</mapper>
 

可以总结为,在orders的findOrdersByUserId 中,将userid绑定为了int,在user的findByUserId方法中设定的参数起不到预定效果,所以才有了以上的异常。。

反之,如果在orders的findOrdersByUserId 中将参数userid的类型设定为String,而在user中将findByUserId方法中设定的参数改为int,测试的结果是查询正常。。

 

所以,基本确定,在mybatis进行一对多映射时,已经将userid的类型进行了绑定,在后来通过userid对user进行查找时,虽然你设定了是String类型,但是,最后mybatis还是会认为userid是int类型。。

 

我们最好的避免方法就是,在进行一对多映射时,要留意相关查询方法的参数类型。。一旦不一致,问题就很难定位了。。。

 

大家有什么意见,欢迎提出哈。。

 

 

 

 

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics