在本次使用中的需求如下:球员可以对教练进行评价,评价信息将存入数据库pingjia2表中,查询评价信息表时,需要显示的字段为 :
- pingjia2Content(评价内容)
- pingjia2Name(写评价的人的姓名)
- coachName(教练名)
【pingjia2表字段】:
- pingjia2Id(评价表id)
- pingjia2Content(评价内容)
- pingjia2Name(写评价的人的姓名),
- pingjiaInfo(外键,被评价教练的id,与教练信息表(coach)中的coachID对应)
【coach表字段】:
- coachId(教练id)
- coachName(教练名)
coachAccount
coachPwd(删除线内的字段没有用到)
coachPost
coachAge
coachSex
coachBarthday
第一步:编写实体类
//教练实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Coach {
private int coachId;
private String coachName;
private String coachAccount;
private String coachPwd;
private String coachPost;
private Integer coachAge;
private String coachSex;
private Date coachBarthday;
}
//球员对教练的评价信息表 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pingjia2 {
private int pingjia2Id;
private String pingjia2Content;
private String pingjia2Name;
//外键连接 pingjiaInfo = coacheId
private Coach coaches; //将教练以对象的形式引入
}
第二步:mybatis-config.xml配置
将Mapper注册到配置文件中
<!-- 每一个Mapper都需在配置文件中注册 -->
<mappers>
<mapper class="com.gjw.dao.FootballMapper"/>
</mappers>
第三步:Dao层的FootballMapper(接口)
//查询全部评价
List<Pingjia2> queryAllPingjia2();
第四步:FootballMapper.xml 实现接口的.xml文件
个人使用的是写法一,写法二可供学习参考
resultMap写法一:
<!-- 首先将所需查询的SQL完整写完,并给所需的每个字段赋予别名 -->
<select id="queryAllPingjia2" resultMap="Pingjia2CoachResultMap">
select a.pingjia2Content aContent, a.pingjia2Name aName, b.coachName bName
from football.pingjia2 a, football.coach b
where a.pingjiaInfo = b.coachId
</select>
<resultMap type="Pingjia2" id="Pingjia2CoachResultMap">
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:字段在pojo中的属性名 -->
<!-- column:字段在SQL中的别名 -->
<result property="pingjia2Content" column="aContent" />
<result property="pingjia2Name" column="aName" />
<!-- 配置一对多的关系
property:填写pojo类中集合类类属性的名称
javaType:填写集合类型的名称
复杂属性↓↓↓↓
对象使用 association; 集合使用collection-->
<association property="coaches" javaType="Coach">
<!-- property:字段在pojo中的属性名 -->
<!-- column:字段在SQL中的别名 -->
<result property="coachName" column="bName"/>
</association>
</resultMap>
resultMap写法二:
<select id="queryAllPingjia2" resultMap="Pingjia2CoachResultMap">
select pingjia2.pingjia2Content,pingjia2.pingjia2Name
from football.pingjia2
</select>
<resultMap type="Pingjia2" id="Pingjia2CoachResultMap">
<!-- 配置主键,是关联Order的唯一标识 -->
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<id property="pingjia2Id" column="pingjia2Id" />
<result property="pingjia2Content" column="pingjia2Content" />
<result property="pingjia2Name" column="pingjia2Name" />
<!-- 配置一对多的关系
property:填写pojo类中集合类类属性的名称
javaType:填写集合类型的名称
复杂属性↓↓↓↓
对象使用 association; 集合使用collection-->
<association property="coaches" column="pingjiaInfo" javaType="Coach" select="getCoach">
</association>
</resultMap>
<select id="getCoach" resultType="Coach">
select coachName from football.coach where coachId = #{pingjiaInfo}
</select>
第五步:service层
接口:
//查询全部评价
List<Pingjia2> queryAllPingjia2();
实现类:
//查询全部评价
public List<Pingjia2> queryAllPingjia2() {
return footballMapper.queryAllPingjia2();
}
第六步:Controller层
@RequestMapping("/allPingjia2")
public String allPingjia2(Model model){
List<Pingjia2> pingjia = footballService.queryAllPingjia2();
//查询出来的数据封装在pingjiaList中 "pingjiaList"别名
model.addAttribute("pingjiaList",pingjia);
return "adminPingjia";
}
第七步:前端jsp页面渲染
<tr>
<th>评价内容</th>
<th>评价人</th>
<th>被评价人</th>
</tr>
<%-- 评价信息从数据库中查询出来,从这个pingjia2List中遍历出来:foreach --%>
<tbody>
<%-- 类似于键值对,通过 var="pingjia"遍历 封装在model中的pingjia2List数组 --%>
<c:forEach var="pingjia" items="${requestScope.get('pingjiaList')}">
<tr>
<td>${pingjia.pingjia2Content}</td>
<td>${pingjia.pingjia2Name}</td>
<%-- 从pingjia2实体类中的对象属性 coaches中将 coachName获取到--%>
<td>${pingjia.coaches.coachName}</td>
</tr>
</c:forEach>
</tbody>
最终效果如下图: