关联关系中多对多:
一个对象对应着另一个表的多个数据,所以多对多都是用集合来封装
之所以用集合是因为,因为一个表的对象对应另一个表的多个对象所以用集合
一、联查:
public class kecheng {
//课程对象
private Integer kid;
private String kname;
private List<stu> stuList;
}
public class stu {
//学生对象
private Integer sid;
private String address;
private List<kecheng> kechengs;
}
课程联查表
public List<kecheng>seleKc1();//之所以用集合是因为这个对象对应着另一个表的多个对象
<resultMap id="sestuandkc" type="com.dao.stu">
<id column="sid" property="sid"/>
<result column="address" property="address"/>
<collection property="kechengs" ofType="com.dao.kecheng">
<!--注意这里的类型选择是ofType-->
<id column="kid" property="kid"/>
<result column="kname" property="kname"/>
</collection>
</resultMap>
<select id="select" resultMap="sestuandkc">
SELECT s.*,k.* FROM stu s
-- 三表联查
INNER JOIN kecheng k
INNER JOIN kcandstu kc
ON kc.sid=s.sid AND kc.kid=k.kid
-- 关系表 所对应的id
</select>
第二种懒加载查询:
stu学生实现类:
public List<stu> selectsut(int id);
查询有多少学生对象
<select id="selectsut" resultType="com.dao.stu">
SELECT *FROM stu WHERE sid in (SELECT sid FROM kcandstu WHERE sid=#{param1})
-- 这里的嵌套查询要用in不要用=号因为对应的是多个对象
-- 查询出有多少个所对应的学生类
</select>
查询课程并经学生类带出来
<resultMap id="selekecheng" type="com.dao.kecheng">
<id column="kid" property="kid"/>
<result column="cname" property="name"/>
<collection property="stuList" column="sid" select="com.dao.Stumap.selectsut">
<!--这里column="sid"对应的是数据库的列,通过对应的列来查询出跟课程有关的对象-->
<!--com.dao.Stumap.selectsut,对应的是学生类中的方法-->
<id column="sid" property="sid"/>
<result column="address" property="address"/>
</collection>
</resultMap>
这里是联查出来的结果,通过实现类将查询对象封装入对应数据库的java对象中
<select id="seleKc1" resultMap="selekecheng">
SELECT k.*,s.* FROM kecheng k
INNER JOIN stu s
INNER JOIN kcandstu kc
-- 三表联查
ON kc.sid=s.sid AND kc.kid=k.kid
-- 关系表 所对应的id
</select>