项目使用的是SpringMvc3.2.2+Mybatis3.2.0+SQLServer,经常会有根据某个主键字段查询数据,通常都是Integer类型,写sql的时候一般会类似这样:
<mapper namespace="com.back.dao.PersonDao">
<resultMap id="BaseMap" type="com.back.pojo.Person">
<result column="pid" property="pid" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="remark" property="remark" jdbcType="VARCHAR" />
</resultMap>
<select id="get" resultMap="BaseMap"parameterType="java.lang.Integer">
SELECT
pid
, name
, remark
FROM person
WHERE pid= #{pid,jdbcType=INTEGER}
</select>
</mapper>
上面的sql中我们设定的parameterType是Integer,查询条件的pid类型也是Integer,service层定义一个抽象的公用泛型get方法,子类去实现:
public abstract T get(Serializable paramSerializable);
public T get(Serializable id){
return ((PersonDao) this.dao).get(id);
}
调用时如下:
Person person = (Person )service.get(pid);
在mybatis3.2.0版本下,调用的时候定义了一个String参数类型,如下
String pid = "123";
Person person = (Person )service.get(pid);
最后查询出来的结果也是正常的,并无出现参数类型转换错误。后来把mybatis升级到3.3.0之后,问题就来了,调用get方法时,原先传入的字符串"123"会提示参数类型错误,改成传入整形的123就不会出错了。
上面列举的是xml文件的sql参数是pid= #{pid,jdbcType=INTEGER},调用传入的可能是字符串;另外一种情况就是pid= #{pid,jdbcType=VARCHAR},调用传入的可能是整形,这两种在mybatis3.2.0都可以正常查询,相反在mybatis3.3.0都会出错。
这里提醒下各位在开发的时候严格按照数据类型来,一不小心就掉坑里了,仅供借鉴。