今天很偶然的因为一次粗心而发现的一个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文件名字相同。
版权声明:本文为KKKun_Joe原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。