MyBatis在DAO层定义接口返回类型泛型无效的解决
mybatis dao层定义接口返回类型泛型无效
今天很偶然的因为一次粗心而发现的一个mybatis问题,这里就写出来与大家分享一下。
dao层定义了一个接口,返回string集合,用于获取最热门的搜索信息。
mapper.xml文件接口返回的类型却是search对象。
调用接口,返回的是search对象集合,没有报错,泛型没起到作用。
仔细一想,泛型是在编译阶段将我们的返回值类型匹配到一具体类型,而dao层的接口却没有具体的返回值信息,所以在编译阶段它是可以通过的,这也就是说我们在dao层定义的接口返回值泛型是不起作用的,具体的类型还是得依靠mapper.xml文件中定义的返回值类型为准。
那如果我们定义了泛型,并根据泛型来操作数据是不是会报错呢?
我特地实验了一番。mapper.xml查询实际返回的是person对象,而我使用的animal对象集合去接收,并对集合进行了遍历操作
最后报了classcastexception,所以得出结论,dao层接口定义的返回值泛型是没有用的,实际返回需要根据具体的mapper.xml文件对应的方法返回值来确定。
但是我们却可以根据泛型类型来进行数据的操作,这也不算是bug,只是泛型和mybatis没有很好的融合吧,个人理解。
注意:
mybatis的dao层接口与mapper.xml文件的对应是通过代理类来实现的,有两种方式,一种是通过namespace来对应,一种是放在同一路径下,但是要确保接口文件和xml文件名字相同。
mybatis返回类型
分类及返回值类型
对应的分类为
1、resultmap
2、resulttype
对应返回值类型
1、resultmap
:结果集
2、resulttype
:int,string ,long ,class
要点
在mybatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的map里面的,其中键是属性名,值则是其对应的值。
1、当提供的返回类型属性是resulttype时,mybatis会将map里面的键值对取出赋给resulttype所指定的对象对应的属性。所以其实mybatis的每一个查询映射的返回类型都是resultmap,只是当提供的返回类型属性是resulttype的时候,mybatis对自动的给把对应的值赋给resulttype所指定对象的属性。
2、当提供的返回类型是resultmap时,因为map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
示例
resultmap案例
resulttype--long案例
resulttype--int案例
resulttype--class案例:查询结果对应类中的属性值
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。