https://wenku.baidu.com/view/5bac99074b2fb4daa58da0116c175f0e7dd1194b.html
最近在使⽤mybatis查询数据库时,发现在pl/sql中单独执⾏sql时结果是有值的,但是在程序中拿到的却是null,相关配置如下:
(1)
<resultMap type="monitorTaskStatus" id="monitorTaskStatusMap">
<result column="BATCH_NUM" property="batchNum"/>
<result column="TASK_STATUS" property="taskStatus"/>
<result column="CALLED_PHONENUM" property="calledPhoneNum"/>
</resultMap>
(2)
<select id="queryStatusByProjectId" parameterType="java.lang.String" resultType="monitorTaskStatusMap">
select b.batch_num, c.called_phonenum,c.task_status
from cc_call_task c
left join cc_batch_calledperson b
on c.batch_id = b.batch_id
where b.batch_type in (2, 3)
and c.task_status != 5
<if test="value != null and value != ''">
and c.project_id = #{value}
</if>
</select>
(3)
java:
List<TaskStatus> callTasks = service.queryStatusByProjectId(projectId);
debug时发现callTasks.size()=1,但是值却是null,最后搞了半天才发现原来(1)中<select>标签的resultType属性使⽤错误,改成
resultMap即可
究其原因是,MyBatis中在查询进⾏select映射的时候,返回类型可以⽤resultType,也可以⽤resultMap,resultType是直接表⽰返回类
型的,⽽resultMap则是对外部resultMap标签的引⽤(如本例中的(1)),但是resultType跟resultMap不能同时存在。在MyBatis进⾏查询
映射的时候,其实查询出来的每⼀个属性都是放在⼀个对应的Map⾥⾯的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是
resultType的时候,MyBatis会将Map⾥⾯的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每⼀个查询映射的返
回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对⾃动的给我们把对应的值赋给resultType所指定对
象的属性,⽽当我们提供的返回类型是resultMap的时候,因为Map不能很好表⽰领域模型,我们就需要⾃⼰再进⼀步的把它转化为对应的
对象,这常常在复杂查询中很有作⽤。(包括如本例中的表关联查询等等情况)
终上所述,本例中错误的原因在于已经⾃定义了<resultMap>中id为monitorTaskStatusMap的结果集,⽽需求也是要引⽤这个,正确的
是应该⽤resultMap指定,我却⽤了resultType。。。
最后可以简要概括两点:
1.当进⾏单表简单查询时且返回值类型是基本类型时,⼀般尽量使⽤resultType;
2.当进⾏表关联查询时,或者说xml中定义了相关的resultMap标签,那么就⼀般尽量使⽤resultMap;
3.resultType和resultMap不能同时使⽤。
--------------------------------------------------------
作者:日太光明初之010
链接:https://wenku.baidu.com/view/5bac99074b2fb4daa58da0116c175f0e7dd1194b.html
来源:百度文库
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。