场景1:返回结果为javaBean,且Bean对象的属性不存在层级嵌套关系
mybatis映射文件中,select语句查询列名与Bean的属性名对应,返回结果类型使用resultType指定即可;
场景2:返回结果为javaBean,且Bean对象的属性存在层级嵌套关系
定义resultMap,select语句返回结果类型使用resultMap指定.
注:如果部分查询列名与Bean的未嵌套的部分属性列名相同,不用在resultMap中使用result标签刻意指出这部分查询列名与Bean属性的对应关系.只需要指出名称不同的部分以及嵌套的部分对应的映射关系即可.
嵌套时,如果Bean中的属性名存在相同的情况,就给查询列定义别名,然后再使用result标签进行映射即可.
特别要注意,resultMap中最好都定义下id标签,如果多个属性可以确定唯一性的话,那么就定义多个id标签.不定义id标签,mybatis也能正常区别唯一性,但是十分耗性能.id标签最好是定义主键和属性和映射关系.
id使用举例如下:
<resultMap type="User" id="selectUserMap" autoMapping="true">
<id property="id" column="id"/>
<id property="name" column="name"/>
(如果需要两个属性才能确定一个User,例如id+name,就定义两个id标签)
<result property="userName" column="userName"/>
<result property="sex" column="sex"/> -->
<association property="teacher" javaType="Teacher" autoMapping="true">
<id column="teacherId" property="id"/>
(teacherId确定teacher唯一性。由于user与teacher都有id属性,且用户表和教师表主键字段名都为id,所以查询时,给老师的主键字段取了个别名teacherId,然后用别名进行映射)
<result column="teacherName" property="teacherName"/>
</association>
</resultMap>
例如下面的例子:
数据库表BLOG与表AUTHOR字段名定义与Blog实体类及Author实体类定义的属性名一样.
这里就不需要刻意在resultMap中指出查询列名与Bean属性的对应关系.
<resultMap id=”blogResult” type=”Blog”>
<association property="author" column="blog_author_id" javaType="Author"
select=”selectAuthor”/>
</resultMap>
<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”>
SELECT * FROM BLOG WHERE ID = #{id}
</select>
<select id=”selectAuthor” parameterType=”int” resultType="Author">
SELECT * FROM AUTHOR WHERE ID = #{id}
</select>
如果是使用嵌套结果的形式,resultMap要写成如下形式:
<resultMap id=”blogResult” type=”Blog”>
<association property="author" column="blog_author_id" javaType="Author">
(注意,被嵌套的部分属性,即使查询列名与javaType或者是ofType中指定的Bean属性名一致,也需要使用result标签显式指定查询结果列与Bean属性的对应关系,否则被嵌套的这部分属性值无法映射上)
<result column="authorName" property="authorName" jdbcType="VARCHAR"/>
<association/>
</resultMap>