1.配置多个一对一(association)的时候,默认执行第一个一对一。
2.resultMap中不可以有多个association,多对多关系可以修改表结构,配置成2个一对多的表来实现,
添加一个中间表,这样的话就可以通过collection标签来配置了
3.resultMap中只有一个collection,或者一个association.
sql语句和一对一类似,
一对一:
<!-- association :配置一对一属性 -->
<!-- property:moments里面的User属性名 -->
<!-- javaType:属性类型 -->
<!-- property:实体类属性名 -->
<!-- column:数据库列名 -->
<select id="getMoments" resultMap="momentsMap" parameterType="moments">
SELECT m.*,c.id cid,c.content ctent,c.momentId cmid, u.userName FROM moments m
JOIN `comment` c on c.momentId=m.id
JOIN `user` u on m.userId=u.userId
<where>
<if test="userId!=null">
m.userId=#{userId}
</if>
</where>
</select>
<resultMap id="momentsMap" type="moments">
<id property="id" column="id" />
<result property="userId" column="userId" />
<result property="content" column="content" />
<result property="images" column="images" />
<result property="creatTime" column="creatTime" />
<association property="user" javaType="user">
<!-- id:声明主键,表示userid是关联查询对象的唯一标识-->
<id property="userId" column="userId" />
<result property="userName" column="userName" />
</association>
<!-- 配置一对多的关系
property:填写pojo类中集合类类属性的名称(private List<Comment> comment;)
javaType:填写集合类型的名称
-->
<collection property="comment" javaType="list" ofType="Comment">
<!-- id:声明主键,表示id是关联查询对象的唯一标识-->
<id property="id" column="cid" />
<result property="content" column="ctent" />
<result property="masterId" column="masterId" />
<result property="respondentId" column="respondentId"/>
<result property="momentId" column="cmid" />
</collection>
</resultMap>
*实体类必须要有get,set,和构造函数
*select查询时取的别名一定要记得放在column的值中
*有相同属性名时必须取别名
*list中的对象要有数据就必须查询相关属性
若获得的结果:{“comment”:{},“content”:“难过的一天”,“creatTime”:1561478400000,“id”:2,“images”:“无图”,“user”:{“userId”:130,“userName”:“hsd”},“userId”:130}
不是映射问题就是实体类没有完整的get,set,构造函数
{“comment”:[{“content”:“明天会更好”,“id”:2,“momentId”:2}],“content”:“难过的一天”,“creatTime”:1561478400000,“id”:2,“images”:“无图”,“user”:{“userId”:130,“userName”:“hsd”},“userId”:130}
引以为戒