欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis在DAO层定义接口返回类型泛型无效的解决

程序员文章站 2022-03-09 10:46:30
mybatis dao层定义接口返回类型泛型无效今天很偶然的因为一次粗心而发现的一个mybatis问题,这里就写出来与大家分享一下。dao层定义了一个接口,返回string集合,用于获取最热门的搜索信...

mybatis dao层定义接口返回类型泛型无效

今天很偶然的因为一次粗心而发现的一个mybatis问题,这里就写出来与大家分享一下。

MyBatis在DAO层定义接口返回类型泛型无效的解决

dao层定义了一个接口,返回string集合,用于获取最热门的搜索信息。

MyBatis在DAO层定义接口返回类型泛型无效的解决

mapper.xml文件接口返回的类型却是search对象。

MyBatis在DAO层定义接口返回类型泛型无效的解决

调用接口,返回的是search对象集合,没有报错,泛型没起到作用。

仔细一想,泛型是在编译阶段将我们的返回值类型匹配到一具体类型,而dao层的接口却没有具体的返回值信息,所以在编译阶段它是可以通过的,这也就是说我们在dao层定义的接口返回值泛型是不起作用的,具体的类型还是得依靠mapper.xml文件中定义的返回值类型为准。

那如果我们定义了泛型,并根据泛型来操作数据是不是会报错呢?

我特地实验了一番。mapper.xml查询实际返回的是person对象,而我使用的animal对象集合去接收,并对集合进行了遍历操作

MyBatis在DAO层定义接口返回类型泛型无效的解决

MyBatis在DAO层定义接口返回类型泛型无效的解决

MyBatis在DAO层定义接口返回类型泛型无效的解决

MyBatis在DAO层定义接口返回类型泛型无效的解决

最后报了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案例:查询结果对应类中的属性值

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。