首先看两段配置:
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类型。。
我们最好的避免方法就是,在进行一对多映射时,要留意相关查询方法的参数类型。。一旦不一致,问题就很难定位了。。。
大家有什么意见,欢迎提出哈。。
分享到:
相关推荐
3、mybatis类型的定义方式
mybatis 对clob类型转换,解决clob类型数据插入数据库报异常问题
Mybatis 处理 CLOB、BLOB 类型数据
NULL 博文链接:https://zw7534313.iteye.com/blog/2221078
mybatis数据类型错误及解决方法
主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
mybatis常用jdbcType数据类型.txt mybatis常用jdbcType数据类型.txt
用于PostGIS的MyBatis类型处理程序 MyBatis类型处理程序支持PostGIS中引入的几何类型:JDBC Geometry API 要求 Java 7或更高版本。 它依赖的最新PostGIS JDBC API使用的是PostgreSQL JDBC的JRE7版本,因此它需要...
本项目为mybatis实战二之枚举类型,里面有简单的demo,适合初学者下载运行,能对mybatis的typehandler有一个初始的认识和运用
mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例...
mybatis中操作json类型数据(csdn)————程序
mybatis源码是mybatis-3.2.6的源码,用户使用mybatis时可以进行参考
mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis...
mybatis deom.mybatis 的简单入门实例。基于maven开发的。
Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql mybatis sql connection mybatis中使用sql,不实用配置文件中的sql实例
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 压缩包内容: mybatis-3.5.7.zip mybatis-3-mybatis-3.5.7.zip ...
开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2开发工具 mybatis-3.4.2...
mybatis、mybatis详细设计、mybatis配置
mybatis_plugin2.9.2
MyBatis学习代码: mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in...