hwl198212 发表于 2016-11-25 10:15:18

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]
查看完整版本: mybatis类型检测的不足