开发环境
SpringBoot 1.5 + JDK1.8 + Mybatis3.4
现象描述
现象
接口测试过程中发现,数据库里面好些字段有值,而postman显示的结果为null,而且有的字段可以显示有的不可以。
mapper代码
List<PcmArticleListDTO> selectAboutUs(String siteId);
xml代码
动态SQL
<sql id="selectAboutUsField">${alias}.CT_ID,${alias}.TITLE,${alias}.SUBTITLE,${alias}.CON,${alias}.CON_H5,${alias}.ABSTRACT,${alias}.AUTHOR,${alias}.CT_TIME,${alias}.KW,${alias}.IS_AUTODIS,${alias}.DIS_TIME,${alias}.AU_STATE,${alias}.PUB_STATE,${alias}.LIKE_NUM,${alias}.READ_NUM,${alias}.COVER_PATH,${alias}.CONTENT_TYP,${alias}.URL,${alias}.IS_TIMEING,${alias}.REMARK, ${alias}.CRT_TIME,${alias}.UPD_TIME,${alias}.TIMEING_DATE </sql>
<select id="selectAboutUs" resultType="com.xxx.xxx.model.PcmArticleListDTO">
select
<include refid="selectAboutUsField">
<property name="alias" value="t1"></property>
</include>
from PCM_ARTICLE t1
left join PCM_SECTION_ARTICLE t2 on t1.CT_ID = t2.CT_ID
where t1.PUB_STATE = '1'
and t1.DEL_TAG = '0'
and t2.SEC_SID = #{siteId}
order by
t2.ORDER_VAL,
t1.PUB_TIME desc
</select>
定义的映射关系
<resultMap id="PcmArticleListDTO" type="com.xxx.xxx.model.PcmArticleListDTO">
<id column="CT_ID" jdbcType="VARCHAR" property="ctId" />
<result column="TITLE" jdbcType="VARCHAR" property="title" />
<result column="SUBTITLE" jdbcType="VARCHAR" property="subtitle" />
<result column="CON" jdbcType="VARCHAR" property="con" />
<result column="CON_H5" jdbcType="VARCHAR" property="conH5" />
<result column="ABSTRACT" jdbcType="VARCHAR" property="abstracts" />
<result column="AUTHOR" jdbcType="VARCHAR" property="author" />
<result column="CT_TIME" jdbcType="TIMESTAMP" property="ctTime" />
<result column="KW" jdbcType="VARCHAR" property="kw" />
<result column="IS_AUTODIS" jdbcType="CHAR" property="isAutodis" />
<result column="DIS_TIME" jdbcType="TIMESTAMP" property="disTime" />
<result column="AU_STATE" jdbcType="CHAR" property="auState" />
<result column="PUB_STATE" jdbcType="CHAR" property="pubState" />
<result column="DEL_TAG" jdbcType="VARCHAR" property="delTag" />
<result column="CRT_OPT" jdbcType="VARCHAR" property="crtOpt" />
<result column="CRT_TIME" jdbcType="TIMESTAMP" property="crtTime" />
<result column="UPD_OPT" jdbcType="VARCHAR" property="updOpt" />
<result column="UPD_TIME" jdbcType="TIMESTAMP" property="updTime" />
<result column="PUB_OPT" jdbcType="VARCHAR" property="pubOpt" />
<result column="PUB_TIME" jdbcType="TIMESTAMP" property="pubTime" />
<result column="LIKE_NUM" jdbcType="DECIMAL" property="likeNum" />
<result column="READ_NUM" jdbcType="DECIMAL" property="readNum" />
<result column="COVER_PATH" jdbcType="VARCHAR" property="coverPath" />
<result column="CONTENT_TYP" jdbcType="CHAR" property="contentTyp" />
<result column="URL" jdbcType="VARCHAR" property="url" />
<result column="IS_TIMEING" jdbcType="CHAR" property="isTimeing" />
<result column="TIMEING_DATE" jdbcType="TIMESTAMP" property="timeingDate" />
<result column="REMARK" jdbcType="VARCHAR" property="remark" />
</resultMap>
分析解决与总结
查看定义的pojo及对应的映射关系,没有发现异常。
跟之前代码比较发现,此处返回的值使用resultMap,而此处使用的resultType,会不会是这个问题引起的?
遂将此处的resultType,更换为resultMap,更换之后发现,均可以正常显示
总结
resultMap:适合pojo中属性名与数据库表名一致或不一致的情况,已经建立了对应关系(经过驼峰处理的字段)。 resultType:适合pojo中属性名与数据库表中列名完全一致的情况。
对比我的测试发现,TITLE,SUBTITLE这种字段在一种情况下可以正常显示,而CT_ID之类的字段则不能显示,验证了以上的说法。
resultMap通用性更高,建议优先使用。