设为首页 收藏本站
查看: 950|回复: 0

[经验分享] mybatis类型检测的不足

[复制链接]

尚未签到

发表于 2016-11-25 10:15:18 | 显示全部楼层 |阅读模式
  首先看两段配置:
  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305380-1-1.html 上篇帖子: mybatis二级缓存工作机制 下篇帖子: MyBatis+Spring 事务管理(转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表