嵌套结果查询参考:
嵌套查询参考:
首先要了解对象的三种关联方式
*数据库表的关联关系有三种,一对一,一对多,多对多
一对一 是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段
一对多 是通过在“多”的一方,添加“一”的一方的主键作为外键
多对多 是通过一张中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键
*在java类中关联关系也有三种,一对一,一对多,多对多
一对一 在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a
一对多 一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a
多对多 在A类中定义B类类型的集合,在B类中定义A类类型的集合
三种关联guan关系都有两种关联查询的方式,嵌套查询,嵌套结果
*Mybatis的yanc延迟加载配置
在全局配置文件中加入下面代码
<settings>
<setting name=”lazyLoadingEnabled” value=”true” />
<setting name=”aggressiveLazyLoading” value=”false”/>
</settings>
在映射文件中,<association>元素和<collection>元素中都已默认配置了延迟加载属性,即默认属性fetchType=”lazy”(属性fetchType=”eager”表示立即加载),所以在配置文件中开启延迟加载后,无需在映射文件中再做配置
1一对一
使用<association>元素进行一对一关联映射非常简单,只需要参考如下两种示例配置即可
2.一对多
<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的
<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性–ofType
ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。
<collection >元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:
3.多对多
多对多的关联关系查询,同样可以使用前面介绍的<collection >元素进行处理(其用法和一对多关联关系查询语句用法基本相同)
<!–在多对多的关系映射中,存在第三张中间表,中间表注入另外两张表的实体对象,其它两张表相互注入List<T>集合对象。在map.xml中直接用collection 进行多对多关联即可
https://www.cnblogs.com/ysocean/p/7237499.html#_label5
–>
案例:
实体bean:三张表tbuser,tbgroup,UserGroup(中间表) 多对多关系
TbUser:
1 2 3 4 5 6 7 8 9 |
private List<TbGroup> tbgroup; public List<TbGroup> getTbgroup() { return tbgroup; } public void setTbgroup(List<TbGroup> tbgroup) { this.tbgroup = tbgroup; } |
TbGroup:
1 2 3 4 5 6 7 8 9 10 |
private List<TbUser> tbuser; public List<TbUser> getTbuser() { return tbuser; } public void setTbuser(List<TbUser> tbuser) { this.tbuser = tbuser; } |
UserGroup:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
private TbUser tbuser; private TbGroup tbgroup; public TbGroup getTbgroup() { return tbgroup; } public void setTbgroup(TbGroup tbgroup) { this.tbgroup = tbgroup; } public TbUser getTbuser() { return tbuser; } public void setTbuser(TbUser tbuser) { this.tbuser = tbuser; } |
tbgroup.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<resultMap id="TbGroupResultMap" type="com.yashi.entity.TbGroup" > <id column="id" property="id" jdbcType="VARCHAR" /> <result column="group_name" property="groupName" jdbcType="VARCHAR" /> <result column="user_id" property="userId" jdbcType="VARCHAR" /> <collection property="tbuser" ofType="com.yashi.entity.TbUser" resultMap="TbUserResultMap"/> </resultMap> <resultMap id="TbUserResultMap" type="com.yashi.entity.TbUser" >//单独提出来了,也可以直接写在collection下面 <id column="id" property="id" jdbcType="VARCHAR" /> <result column="username" property="username"/> </resultMap> <select id="findMemberList" resultMap="TbGroupResultMap" parameterType="java.lang.String" > SELECT DISTINCT a.`group_name`,c.`username` FROM `tb_group` AS a LEFT JOIN `user_group` AS b ON a.`id` = b.`group_id` LEFT JOIN `tb_user` AS c ON b.`user_id` = c.`uid` WHERE a.`group_name`=#{gname} </select> |
总结:这两种方式各有各的优缺点,嵌套查询的查询语句写起来简单,但是执行的sql语句多,性能要低一点,嵌套结果的查询语句写起来难一点,而且sql语句只执行一条,性能相对较高;刚开始用可能会遇到很多细节问题,但是慢慢熟悉了,感觉就会好很多,用起来也得心应手了
———————