首先要分清各级关系,哪个表跟哪个表是一对一,哪个是一对多。
<resultMap id="BaseResultMap1" type="com.lucun.student.db.entity.UserInfo">
<!--
显示班级学生成绩
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<association property="aClass" javaType="com.lucun.student.db.entity.Class">
<result column="cname" jdbcType="VARCHAR" property="name" />
</association>
<collection property="score" ofType="com.lucun.student.db.entity.Score">
<result column="score" jdbcType="VARCHAR" property="score" />
<association property="subject" javaType="com.lucun.student.db.entity.Subject">
<result column="sname" jdbcType="VARCHAR" property="name"/>
</association>
</collection>
</resultMap>
我的表userInfo跟Class是一对一,和Score是一对多,Score和Subject表是一对一,一对一用association,一对多用collection。
其中userInfo表是在最外层,根据用户的id来对应用户的班级是一对一,根据用户的id对应成绩是一对多,用户表不与学科表直接对应,成绩表与学科表是一对一的关系,所以学科表嵌套在成绩表里面。
实体的对应关系
private Class aClass;
private Subject subject;
private List<Score> score;
userInfo实体里包含需要链接的三个表(省略set,get),一对多需要集合来接收数据。
private Subject subject;
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
Score包含Subject所以实体里也需要包含。
附上sql语句(这里只是单纯测试效果,实际应用中没有需要条件不会写死)
SELECT c.`id`,u.`name`,j.name sname,c.`score`,g.name cname FROM score c JOIN user_info u ON c.sid=u.id JOIN class g ON g.id=u.sclass JOIN `subject` j ON j.id=c.sub WHERE u.sclass=2
查询结果
Api接口测试结果
对应查询的userInfo表的id,name。
对应class表的id,name
对应score表的name
对应subject表的name
其中重复的字段比如name 需要用别名