准备
数据库表
一对多关系的pojo类设计
- 一对多,一个班级中有多个学生
- 怎么设计:
- 抽象成两个类student类,和Clazz类
- Clazz类是班级,student类是学生
- 一个班级中有多个学生
所以:在Clazz类中添加一个类型为Student的集合,来模拟多个学生
/**
* 一对多 一个班级对应多个学生
* @author Han
* @data 2023/6/16
* @apiNode
*/
public class Clazz {
private Integer cid;
private String cname;
//一对多 一个班级对应多个学生
List<Student> students;
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public Clazz() {
}
public Clazz(Integer cid, String cname) {
this.cid = cid;
this.cname = cname;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
@Override
public String toString() {
return "Clazz{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", students=" + students +
'}';
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
实现方式
collection
- 使用collection标签
- collection是集合的意思
- 使用多表连接查询,将学生表和班级表进行连接
- 在结果映射集resultMap中使用collection标签
属性:
- property : 这是在clazz类中的学生对象的字段名称
List<Student> students;
然后在这个标签中指定学生的字段 - ofType:指定集合中元素的类型
<!--使用collection-->
<resultMap id="ClazzResultMap" type="clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
<!--一对多,这里是collection 是集合的意思
ofType属性值指定集合中元素的类型-->
<collection property="students" ofType="student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</collection>
</resultMap>
<select id="selectClazzByIdUseCollection" resultMap="ClazzResultMap">
SELECT c.cid,c.cname,s.sid,s.sname
FROM t_clazz c
JOIN t_stu s ON s.cid = c.cid
WHERE c.cid = #{cid}
</select>
使用分步查询
步骤:
- 在clazzMapper接口中指定第一步的查询方法
/**
* 第一步
* 分布查询一对多
* @param cname
* @return
*/
Clazz selectClazzByStep1(@Param("cname") String cname);
- 在clazzMapper.xml文件中配置
- 将根据班级名查出来的
cid
传给第二步
<!--分布查询,一对多-->
<resultMap id="clazzResultMapBySept" type="clazz">
<id column="cid" property="cid"></id>
<result property="cname" column="cname"></result>
<association property="students"
select="com.hyp.mybatis9.Mapper.StuMapper.selectStudentByCidStep2"
column="cid"/>
</resultMap>
<select id="selectClazzByStep1" resultMap="clazzResultMapBySept">
select cid,cname from t_clazz where cname = #{cname}
</select>
- 在StudentMapper中定义第二步要使用的方法
/**
* 一对一多,
* 根据班级名查出来班级id
* 将查出来的班级id传入
* 根据班级id查出学生信息
* @param cid
* @return
*/
Student selectStudentByCidStep2(@Param("cid") Integer cid);
- 在StudentMapper.xml文件中进行配置
<select id="selectStudentByCidStep2" resultType="student">
select sid,sname,cid from t_stu where cid = #{cid}
</select>
- 测试
@Test
public void testSelectClazzByStep1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
Clazz clazz = mapper.selectClazzByStep1("高三一班");
System.out.println(clazz.getCid());
System.out.println(clazz);
//System.out.println(clazz.getStudents());
sqlSession.close();
}