数据在库中表的对应关系为一对多对多关系
比如 班级 小组 成员
他们之间的关系 班级 对 小组 是一对多 小组 对成员是 一对多
所以班级 小组 成员 是 一对多对多的关系
这是候可以将 班级的javaBean里面放一个小组 的 List<小组>属性,查询到的小组集合塞进班级的javaBean里面,同理小组和成员也是一样.
(穿插记忆:当多表关联查询时,查询到的一组数据时单行多列,子查询的外边用in 或者 between
eg:查询小组中成员的详情
select <inclede=“Search_Member”> from t_member where id in(select member_id from t_group_member where group_id=#{id})
------多表关联查询,以下的规则适合于报表语句的编写-------
1.先找出要显示数据所在的表,t_package,t_checkgroup,t_checkitem
2.找出条件所在的表 t_package id=XX
3.找出要显示数据表之间的关系,没有则找中间表, t_checkgroup_checkitem,t_package_checkgroup
4.找出条件所在表与数据表之间的关系,没有就找中间表
eg:
关联条件:
and p.id=pc.package_id and pc.checkgroup_id=g.id
and g.id=cc.checkgroup_id and cc.checkitem_id=i.id
(回顾:显隐内外连接https://zhidao.baidu.com/question/2075544870330421668.html)
Sql语句:
SELECT p.*,pc.checkgroup_id,i.name
FROM t_package p,t_checkgroup g,t_checkitem i,t_checkgroup_checkitem cc,t_package_checkgroup pc
WHERE p.id=12
AND p.id=pc.package_id AND pc.checkgroup_id=g.id AND g.id=cc.checkgroup_id AND cc.checkitem_id=i.id
查询结果
(默认规则一般查出来的都要把id带上,以备前端调用参数复用)
语句可以查出来,但是要在java中映射JavaBean对象,显然只有这样是不行的,由于这个关系是一对多的关系,Mybatis中用resultMap做结果的映射处理.
优化之前的Sql: 这种需要执行很多次,一个package_Id进去之后,会走到service,这时候如果一个检查组对应多个检查项,比如说10个,就要执行10次,效率太低,需要进行调优.
PackageDao.xml文件
CheckGroupDao.xml文件:
CheckItemDao.xml文件:
优化之后的Sql代码
<select id="findById" resultMap="packageCheckGroupCheckItemResultMap" parameterType="integer">
SELECT p.*,pc.checkgroup_id,i.name
FROM t_package p,t_checkgroup g,t_checkitem i,t_checkgroup_checkitem cc,t_package_checkgroup pc
WHERE p.id=#{id}
AND p.id=pc.`package_id` AND pc.`checkgroup_id`=g.`id`
AND g.id=cc.`checkgroup_id` AND cc.`checkitem_id`=i.`id`
</select>
<!-- 上面已经写好了要查询出来的东西,现在要做的就是 封装packageCheckGroupCheckItemResultMap-->
<resultMap id="packageCheckGroupCheckItemResultMap" type="Package">
<!--套餐-->
<id property="id" column="id"/>
<result property="name" column="name" />
<result property="code" column="code" />
<result property="helpCode" column="helpCode" />
<result property="sex" column="sex" />
<result property="age" column="age" />
<result property="price" column="price" />
<result property="remark" column="remark" />
<result property="attention" column="attention" />
<result property="img" column="img" />
<!--检查组-->
<collection property="checkGroups" ofType="CheckGroup" javaType="List">
<id property="id" column="checkgroup_id"/>
<result property="name" column="checkgroup_remark"/>
<!--检查项-->
<collection property="checkItems" ofType="CheckItem" javaType="List">
<id property="id" column="checkitem_id"/>
<result property="name" column="checkitem_name"/>
</collection>
</collection>
</resultMap>